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

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

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

2장 "메모리 주소 지정", 하위 장 "Paging in Linux", "커널 페이지 테이블" 섹션의 "Linux 커널 이해, 3번째" 책에서는 RAM 크기가 896MB 미만일 때 최종 커널 페이지 테이블에 대해 설명합니다. :

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

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

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

실제로 확장 페이징과 일반 페이징이 어떻게 공존하는지 알 수 없습니다. 누군가 그 질문을 설명해 주시겠습니까?

  • 어떤 경우에 커널이 4MB 페이지를 사용합니까? 아니면 4KB 페이지인가요?
  • kmalloc 작업에는 어떤 페이지 프레임 크기가 사용됩니까? vmalloc에?
  • 초기 코드 및 데이터(커널의 세그먼트, 임시 페이지 테이블 및 동적 데이터의 경우 128KB)가 RAM의 처음 8MB에 적합하다고 가정하면(책에 제공된 예), 코드 및 데이터의 실제 양은 어떻게 될까요? 데이터는 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가 됩니다.

관련 정보