
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 매핑을 사용하나요...?
두 번째 질문은 "lowmem 및 highmem 메모리 파티셔닝 메커니즘이 x64 Linux 시스템에도 배포됩니까?"입니다.
미리 감사드립니다
답변1
고급 메모리그리고메모리 부족x86 프로세서의 물리적 주소 확장과 관련됩니다. 이 메커니즘을 통해 프로세서는 기존 4GB 대신 64GB 메모리를 처리할 수 있습니다. 그러나 명령어 세트는 변경되지 않고 레지스터와 포인터의 길이는 여전히 32비트이므로 가상 주소 공간은 여전히 4GB로 제한됩니다. 기계 명령어는 항상 물리적 주소가 아닌 가상 주소를 사용합니다.
결과적으로 "highmem"은 주소 지정 가능한 영역에 매핑될 때까지 직접 주소 지정이 불가능합니다. 이것이 바로 lowmem만이 highmem에 대한 1:1 매핑을 사용하는 이유입니다.
다음 질문은 다음과 같습니다. 페이지 테이블을 건너뛰고 간단한 빼기를 수행하여 물리적 주소를 얻기 위해 MMU 논리를 단순화할 수 없는 이유는 무엇입니까? MMU는 하드웨어로 구현되며 페이지 테이블(및 TLB)을 사용하여 작업을 수행하도록 설계되었습니다. 그러나 페이지 테이블에서 한 수준을 건너뛰어 x86에서 페이지 크기를 4kB 대신 4MB로 만드는 "대형" 페이지가 있습니다.
마지막 질문: x64 아키텍처의 메모리도 lowmem과 highmem으로 나누어지나요? 아니요. PAE 메커니즘은 x86의 수명을 연장하기에는 약간 불안정합니다. 더 큰 주소 공간(물리적 및 가상)을 갖춘 x64에는 필요하지 않습니다.