커널 가상 주소 레이아웃에 대한 질문

커널 가상 주소 레이아웃에 대한 질문

x86 및 x64 시스템에서 커널의 가상 주소 레이아웃에 대해 두 가지 질문이 있습니다.

내가 아는 한, x86은 highmem과 lowmem이라는 분할 메모리 레이아웃을 사용합니다.

내 이해가 맞다면 highmem과 lowmem의 유일한 차이점은 1:1 가상 주소와 실제 주소 매핑이 있는지 여부입니다.

또한 lowmem에는 커널 프로그램에서 자주 액세스하는 코드와 데이터가 포함되어 있고 highmem에는 자주 액세스되지 않는 페이지 테이블이나 사용자 수준 프로그램 데이터가 포함되어 있는 것으로 보입니다.

그런데 x86 커널이 가상 주소 공간을 분할하여 자주 액세스하는 데이터와 코드를 lowmem에 배치하는 이유를 이해할 수 없습니다. 그것의 장점은 무엇입니까? 커널 메모리의 위치에 관계없이 가상 대 물리적 매핑을 얻으려면 페이지 테이블 탐색을 호출해야 하는 것 같습니다. 맞다면 highmem과 lowmem의 장점은 없는 것 같습니다.

여기서 첫 번째 질문은 lowmem이 1:1 매핑(예: 물리적 주소 + 상수(0x80000000) => 커널 가상 주소)을 사용하는 경우 왜 MMU가 가상 대 물리적 매핑을 알기 위해 페이지 테이블을 탐색하는 데 시계를 소비하는지입니다. 가능하다면 MMU 로직을 수정하여 가상 주소에서 매직 상수를 빼기만 하면 lowmem 영역에 있는 경우 물리적 주소를 얻을 수 있습니다. 아니면 자주 액세스하는 데이터와 코드를 lowmem에 배치해야 하는 다른 이유가 있습니까? 그리고 왜 lowmem만이 1:1 매핑을 사용하는 걸까요...?

두 번째 질문은 "x64 Linux 시스템에도 lowmem 및 highmem 메모리 분할 메커니즘이 배포됩니까?"입니다.

미리 감사드립니다

답변1

하이멤그리고로우멤x86 프로세서의 물리적 주소 확장과 관련이 있습니다. 이 메커니즘을 통해 프로세서는 기존 4GB 대신 64GB 메모리를 처리할 수 있습니다. 그러나 명령어 세트는 변경되지 않고 레지스터와 포인터의 길이는 여전히 32비트이므로 가상 주소 공간은 여전히 ​​4GB로 제한됩니다. 기계 명령어는 항상 물리적 주소가 아닌 가상 주소를 사용합니다.

결과적으로 "highmem"은 주소 지정 가능 영역에 매핑될 때까지 직접 주소를 지정할 수 없습니다. 이것이 바로 lowmem만이 1:1 매핑을 사용하는 이유입니다. highmem에 매핑하는 것은 불가능합니다.

다음 질문은 다음과 같습니다. MMU 논리를 단순화하여 페이지 테이블을 건너뛰고 간단한 빼기를 수행하여 물리적 주소를 얻을 수 없는 이유는 무엇입니까? MMU는 하드웨어로 구현되며 페이지 테이블(및 TLB)을 사용하여 작업을 수행하도록 설계되었습니다. 그러나 페이지 테이블에서 한 수준을 건너뛰는 "대형" 페이지가 존재하므로 x86에서 페이지 크기가 4kB가 아닌 4MB가 됩니다.

마지막 질문: x64 아키텍처에서도 메모리가 lowmem과 highmem으로 분할되어 있습니까? 아니요. PAE 메커니즘은 x86의 수명을 연장하기에는 약간 복잡합니다. 훨씬 더 큰 주소 공간(물리적 및 가상 모두)을 갖춘 x64에는 필요하지 않습니다.

관련 정보