확장(4MB) 페이징과 일반(4KB) 페이징은 어떻게 공존합니까?

확장(4MB) 페이징과 일반(4KB) 페이징은 어떻게 공존합니까?

x86 아키텍처에서 "확장 페이징"을 사용하면 페이지 프레임(물리적 메모리)이 4KB가 아닌 4MB가 될 수 있습니다.

"Understanding the Linux Kernel, 3rd" 책의 2장 "메모리 주소 지정", "Linux의 페이징" 하위 장 및 "커널 페이지 테이블" 섹션에서는 RAM 크기가 896MB 미만일 때 최종 커널 페이지 테이블을 설명합니다. :

[...] 커널은 대형 페이지를 사용하여 RAM 주소를 지정할 수 있습니다(이 장 앞부분의 "확장 페이징" 섹션 참조).

그러나 "확장 페이징" 섹션("하드웨어 페이징" 하위 장)에는 다음과 같이 기록되어 있습니다.

확장 페이징은 일반 페이징과 공존합니다.

실제로 확장 페이징과 일반 페이징이 어떻게 공존할 수 있는지 이해하지 못합니다. 누군가 이러한 문제를 설명해 주시겠습니까?

  • 어떤 상황에서 커널이 4MB 페이지를 사용합니까? 아니면 4KB 페이지인가요?
  • kmalloc 작업에서는 어떤 페이지 프레임 크기를 사용합니까? vmalloc의 경우?
  • 초기 코드와 데이터(커널 세그먼트, 임시 페이지 테이블 및 128KB의 동적 데이터)가 RAM의 처음 8MB에 적합하다고 가정하면(이 책에 제공된 예에서와 같이) 실제 RAM 용량은 어떻게 됩니까? 코드와 데이터? 데이터는 5MB에 불과합니다. 커널이 8 - 5 = 3MB를 낭비합니까?

답변1

1. 어떤 상황에서 커널이 4MB 페이지를 사용합니까? 아니면 4KB 페이지인가요?

애플리케이션은 대형 페이지를 요청할 수 있으며 PAGE_SIZE가 커널 소스 코드로 컴파일되지 않으면 커널은 페이지 크기를 결정하지 않습니다. mmap 플래그를 사용하여 애플리케이션 소스 코드의 페이지 크기를 결정합니다.

2. kmalloc 작업에는 어떤 페이지 프레임 크기가 사용됩니까? vmalloc의 경우?

kmalloc은 Linux 커널의 기본 페이지 크기(컴파일 또는 런타임 시 결정되는 커널의 PAGE_SIZE)를 사용합니다. vmalloc도 마찬가지입니다.

3. 초기 코드와 데이터(커널의 세그먼트, 임시 페이지 테이블 및 128KB의 동적 데이터)가 RAM의 처음 8MB에 적합하다고 가정하면(이 책에 제공된 예에서와 같이) 실제 양은 어떻습니까? ? 단 5MB의 코드와 데이터: 커널이 8 - 5 = 3MB를 낭비합니까?

낭비되는 메모리 크기는 PAGE_SIZE와 데이터에 따라 결정됩니다. 페이지 크기가 4MB이고 데이터가 5MB인 경우 낭비되는 메모리 크기는 (PAGE_SIZE*N) - 5MB= 3MB입니다.

관련 정보