x86_64 Long 모드에서 32비트 코드를 실행할 때 Linux 커널은 페이지 테이블을 어떻게 정렬합니까?

x86_64 Long 모드에서 32비트 코드를 실행할 때 Linux 커널은 페이지 테이블을 어떻게 정렬합니까?

x86_64 아키텍처를 사용하면 긴 모드에서 실행할 때 기본적으로 32비트 코드를 실행할 수 있습니다. 따라서 "호환성 모드"라는 하위 모드가 추가되었습니다. 이제 메모리 관리 모드는 다음 표에서 물리적 주소를 계산합니다.

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT -> physical page

위에 언급된 각 테이블은 512개의 항목으로 구성되고 크기는 64비트이므로 각 테이블의 인덱스에 9비트가 필요하고 PT에서 검색된 마지막 주소에 추가할 오프셋에 12비트가 필요합니다. 총 48비트입니다. 이제 32비트 주소를 사용하면 동일한 효과를 얻을 수 없다는 것이 분명해 보입니다.
다른 사람들은 이것이 어떻게 이루어지는지 설명하려고 노력했습니다(여기또는여기) 그러나 이것은 나에게 잘못된 것 같습니다. PDPT와 PD에는 각각 하나의 항목만 있다고 설명되어 있지만 이 동작은 이해하는 데 약간의 문제를 야기합니다.
MMU는 PDPT의 주소를 얻기 위해 주소에서 처음 9개의 최상위 비트를 사용합니다. 이제 PDPT에는 항목이 하나만 있지만 MMU에는 주소의 다음 9비트를 인덱스로 사용하는 엄격한 절차가 있습니다. 이제 512개 사례 중 하나만 첫 번째 항목을 선택하게 됩니다. PD에게도 같은 문제가 존재한다.
내가 보는 유일한 문제는 아니다. 앞서 언급했듯이 32비트는 완전한 변환에 충분하지 않으므로 일부 테이블은 어떻게든 건너뛰어야 합니다.

내 문제를 설명하고 누군가 나를 도울 수 있기를 바랍니다.

답변1

x86-64 중간 길이 모드의 호환성 하위 모드는 페이징에 영향을 주지 않으며 64비트 길이 모드와 동일하게 작동합니다. 32개의 암시적 0비트가 페이징 단위를 제공하는 가상 주소의 비트 위치 63-32에 삽입됩니다. 설명에 연결한 첫 번째 질문의 답변과 같이 해당 0 비트를 유효한 비트에 매핑하도록 페이지 테이블을 설정하기만 하면 됩니다. 바라보다2.1.4.1 장기 모드 메모리 관리AMD64 아키텍처 프로그래머 매뉴얼 제1권: 응용 프로그래밍(PDF)

관련 정보