페이지 테이블 예제

트릭은 P4 테이블을 재귀적으로 매핑하는 것입니다: 마지막 항목은 P3 테이블을 가리키지 않지만 P4 테이블 자체를 가리킵니다. 이 항목을 사용하여 번역 수준을 제거하여 대신 페이지 테이블에 착륙할 수 있습니다. 예를 들어 P1 테이블에 액세스하기 위해 한 번 “루프”할 수 있습니다: 가장 간단한 페이지 테이블 시스템은 종종 프레임 테이블과 페이지 테이블을 유지 관리합니다. 프레임 테이블에는 매핑되는 프레임에 대한 정보가 들어 있습니다. 고급 시스템에서는 프레임 테이블에 페이지가 속한 주소 공간, 통계 정보 또는 기타 배경 정보에 대한 정보도 보유할 수 있습니다. 테이블::next_table_create 메서드는 아직 존재하지 않습니다. 있는 경우 다음 테이블을 반환하거나 새 테이블을 만들어야 합니다. 구현을 위해 이전 게시물의 FrameAllocator와 Table:zero 메서드가 필요합니다. 따라서 표준 4KiB 페이지에 해당하는 P1 테이블과 프레임이 있어야 합니다. 사용하지 않는 항목으로 항목을 설정하고 제공된 프레임 할당기에서 관련 프레임을 해제합니다.

여러 가지 유형의 페이지 테이블이 있으며, 이는 다양한 요구 사항에 가장 적합합니다. 기본적으로 베어 본 페이지 테이블은 가상 주소, 이 가상 주소 “아래”인 실제 주소 및 일부 주소 공간 정보를 저장해야 합니다. 나는 그것을 알아 냈다고 생각합니다. 우리는 이미 boot.asm에서 P4의 인덱스 0을 P3 테이블에 매핑했기 때문입니까? 이제 페이지 테이블을 읽고 매핑 정보를 검색할 수 있습니다. 또한 IndexMut 특성 및 Entry::set 메서드를 통해 업데이트할 수도 있습니다. 그러나 다양한 페이지 테이블에 대한 참조를 얻으려면 어떻게해야합니까? 마찬가지로 CPU는 P4 테이블을 P3 테이블로 해석합니다. 그러나 P4 테이블로 사용하는 테이블은 무엇입니까? 글쎄, 우리는 이전과 같은 P4 테이블을 사용합니다. 그래서 우리의 P4는 CPU에 의해 두 번 사용 됩니다.: 처음에, 그것은 P4 테이블으로 해석 되 고 두 번째 P3 테이블으로. CR3 레지스터를 읽고 P4 테이블의 실제 주소를 얻고 해당 항목을 읽고 P3 주소를 얻을 수 있습니다. 그런 다음 P3 항목은 P2 테이블 등을 가리킵니다. 그러나 이 메서드는 ID 매핑된 페이지에만 작동합니다. 나중에 ID 매핑 영역에 없는 새 페이지 테이블을 만들 것입니다.

실제 주소를 통해 액세스할 수 없으므로 가상 주소에 매핑할 수 있는 방법이 필요합니다.