zynq 는 MultiCore 이다. MP 라는 약어를 사용한다.
파워 리셋이 되면 첮번째 CPU 가 살아난다.
두번째 cpu 는 멈춤상태이다.
커널에서 MP를 지원하기 때문에 우리는 두번째 CPU의 존재(?)를 잊고 있다.
리눅스커널에서는 SMP 모드를 지원한다. symmetric MP 이다. 대칭형..
이해하기 쉽게 N개의 CPU가 모두 동일한 동작을 한다는 것이다.
SMP 이외에 AMP 가 있다. asymmetric MP 이다. 비대칭형
역시 이해하기 쉽게 첫번째 CPU는 리눅스 커널을 수행하고.. 다른 하나는 나만의 프로그램을 리눅스와 관계없이
돌고 있는 것이다.
AMP 를 돌리기 위해서는 두번째 CPU를 어떻게 살려야 하는지 알아야 한다.
결론부터 말하면 두번째 CPU를 살리기 위해 레지스터에서 두번째 CPU 리셋을 제어한다
그러면 두번째 CPU는 물리번째 0번지, 즉 리셋번지부터 실행을 시작한다.
이때 물리번지 0 번지에는 두번째 CPU가 실행 할 소스가 있어야 한다.
그렇다면 물리번지 0번지는 첫번째 CPU가 사용하지 않을까???
당연하게 사용하지 않아야 한다. MP를 지원한다면 그래야 한다.
MP를 지원하는 MCU칩은 많이 존재한다.
N번째 CPU가 깨어나는 방법은 크게 두종류로 나뉠수 있다.
N번째 CPU를 위해 PC 레지스터가 존재한던가. 혹은 ARM Core 이니 0번지로 점프하던가..
후자의 방법이 통일된 방법이라고 판단된다.
AMP를 구현할때 주의 할 점은 cache 가 동작하고 있을때 서로간에 바라보는 물리 메모리 주소가 같을 지라도
캐시의 동작으로 다른값을 보고 있다는 것이다... 공유된 메모리는 캐쉬를 사용하지 말아야 한다
zynq 에서 PL블럭의 막강한 조력자가 필요하다면 AMP 모드도 고려해볼만하다.
amp 일 경우에는 양쪽다 cache를 사용 못하는 이슈가 있다고 들었습니다.
영역만 구별해서 가능한것인가요?