2012-12-02 4 views
2

기본적으로 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 매핑을 생성해야하는 엄청나게 못하는 해킹에 의존하지 않고도이 작업을 수행 할 수 있기를 원합니다.

내가 어떻게 여기 ARM720T에 MMU 켜는 설명하는 ARM 정보 센터 페이지로 연결되는 링크가 나이 아키텍처에 대해 이야기 할 때 무엇을 의미하는지 명확히하기 : 7.16.1. Enabling the MMU

+2

ID 매핑을 못생긴 해킹으로 묘사하는 이유가 확실치 않지만 MMU를 사용하도록 구조적으로 지정된 방법이며 구현하기가 쉽습니다. –

+0

@VariableLengthCoder 글쎄, 처음에는 MMU를 사용하는 것이 나쁘지 않습니다. 그러나 모든 맵핑에서 동일한 VA를 갖는 페이지를 필요로하므로 맵을 전환하는 것은 성가신 일입니다. –

답변

2

짧은 대답은 방법이 없다는 것입니다 ARMv7-A에서 요구하는 것과 정확히 동일합니다. ARM720T 예제는 극히 마이크로 아키텍처에 특유한 해킹이었으며 서로 다른 프로세서간에 이식성이 보장되지 않았습니다.

ARMv7-A의 경우 MMU를 켜기/끄기에 대한 ID 매핑을 사용하지 않고 변환 테이블을 업데이트 할 수있는 이식성있는 방법은 없습니다. 할 수있는 작업 (ARM720T에서는 사용할 수 없었 음)은 TTBR1/TTBR0 조합하여 설명자를 보유하십시오. TTBCR의 N 필드는 TTBR1 테이블을 오버레이하는 TTBR0 테이블의 크기를 구성합니다. 이렇게하면 TTB 전환 코드가 업데이트중인 TTBR과 다른 TTBR을 통해 설명 된 지역에있는 한지도 충돌이 발생하지 않습니다.

다른 옵션은 전환하는 대신 TTBR0이 설명하는 변환 테이블을 다시 작성하는 것입니다.