기본적으로 ARMv7 코어에서 메모리 관리 장치를 활성화하려고합니다. 실제 절차는 매우 사소한 것입니다. 난 그냥 TTBR0
에 번역 테이블의 주소를로드하고 컨트롤 레지스터를 사용하여 MMU를 활성화해야합니다. 하는 ARMv7에 (ARM 아키텍처의 다른 버전과 달리이), CPU가 바로 가상 주소에서 가져 오는 시작하기 때문에ARMv7 VMSA 메모리 관리 장치를 활성화 하시겠습니까?
/* enable mmu */
mcr p15, 0, r0, c2, c0, 0
mrc p15, 0, r12, c1, c0, 0
orr r12, r12, #0x1
mcr p15, 0, r12, c1, c0, 0
자, 문제는 즉시 MMU가 활성화 될 때 발생한다. 따라서 부트 로더가 0x10000000
에서 실행 중이고 MMU가 활성화 된 경우 ID 매핑을 먼저 입력하지 않으면 0x10000004
에있는 다음 페치가 프리 페치 중단을 유발합니다. 이제는 MMU를 처음 사용할 때 ID 매핑을 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. 그러나 변환 테이블을 전환 할 때도 동일한 문제가 발생합니다 (새 값을 TTBR0
에로드).
, 기본적으로, 나는 TTBR0
에 새 값을로드 (또는 단지 MMU를 ON)하고, 즉시 유효합니다 새 주소, 점프의 다소 간단한 방법을 찾고 있어요 새지도에서. 이는 MMU를 활성화하거나 상태를 변경 한 명령어에 이어 적어도 4 개의 명령어가 이전 주소에서 가져 오기 되었기 때문에 이전 아키텍처에서 가능했습니다. 이상적으로, 저는 페이지 테이블을 전환하거나 MMU를 켜고 자 할 때마다 ID 매핑을 생성해야하는 엄청나게 못하는 해킹에 의존하지 않고도이 작업을 수행 할 수 있기를 원합니다.
ID 매핑을 못생긴 해킹으로 묘사하는 이유가 확실치 않지만 MMU를 사용하도록 구조적으로 지정된 방법이며 구현하기가 쉽습니다. –
@VariableLengthCoder 글쎄, 처음에는 MMU를 사용하는 것이 나쁘지 않습니다. 그러나 모든 맵핑에서 동일한 VA를 갖는 페이지를 필요로하므로 맵을 전환하는 것은 성가신 일입니다. –