MMU가 커널의 물리적 및 논리적 주소를 처리하는 방법에 대해 약간의 의심이 있습니다. 예를 들어 내 질문을 설명하려고 노력할 것입니다. 우리가 ARM 아키텍처에 있다고 가정 해 봅시다.
시스템은 MMU가 꺼진 상태에서 시작하므로 CPU 내부를 통과하는 모든 주소는 물리적입니다. MMU를 활성화하기 전에 모든 물리적 주소가 가상 주소에 매핑된다는 페이지 테이블을 만듭니다 physical address + 0xC0000000
. 그런 다음 MMU를 켭니다. 이 모든 것이 분명합니다. 하지만 이제 질문이 시작됩니다.
파이프 라인 아키텍처에 있기 때문에 이후 명령이 주소 0x8000에서로드되었다고 가정 해 보겠습니다. 이제 내가 아는 바에 따르면 MMU가 페이지 테이블 내에서이 주소를 찾지 못하기 때문에 페이지 폴트가 있어야하므로 상황을 처리하기 위해 페이지 폴트가 호출됩니다. 그러나 또한 인터럽트 벡터를 설정했다면 그 안에 다른 물리적 주소에 대한 분기가 있기 때문에 MMU는이 주소를 찾지 못하며 불가피하게 무한 루프에 빠집니다. 내가 무엇을 놓치고 있습니까?
실제로 동일한 실제 메모리 영역과 일치하더라도 사용 된 모든 가상 주소를 매핑해야한다는 점을 놓칩니다. 자세히 살펴 보겠습니다.
다음 레이아웃 이있는 startup
코드 (기본 초기화 및 MMU 활성화 용) 및 기타 main
코드 (MMU 활성화 된 경우에만 작동)가 있다고 가정 해보십시오.
이러한 레이아웃은 링커 작업이며 올바른 스크립트를 제공하는 것입니다. 이 예에서 CPU 진입 점은 0x4000
. 거의 하드웨어 특정 주소입니다.
CPU는 MMU가 비활성화되고 'PC = 0x4000'으로 시작되며 0x4800
MMU가 활성화 될 때 까지 계속 됩니다.
따라서 MMU를 활성화하기 전에 0x4000-0x7FFFF
(시작) 및 0xC0008000-0xC000BFFF
(기타 모든 코드)에 대한 맵이 있어야합니다 .
이제 MMU가 활성화되었습니다. PC에는 0x4804 (32b CPU 가정)가 있습니다. 0x4804
A는 가상 주소 지금은 그것은에 매핑 된 0x4804
물리적 주소 . CPU 0x4804
는 0x4808
, 0x480C
등으로 진행합니다 .
어느 시점에서 당신은 main
. 들어 ARM 그 같은 것
ldr r0, =0xC0008000
bx r0
참고, 그 가상 주소 의 main
항목이 사용됩니다. 따라서 분기 후 물리적 메모리에서 PC=0xC0008000
확인됩니다 0x8000
.
0x4000-0x7FFFF
그 후에 매핑을 제거 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다