CPU 32 bit 의 경우 사용 가능한 가상 주소 범위는 이론 상 4 GB
=> 2^32 = 4 * 1024 * 1024 * 1024 = 4GB
기본적으로 User 가 3 GB, Kernel 이 1 GB 할당을 받는다. 옵션에 따라 변경은 가능하다. (64 bit 의 경우, 128 테라, 128 테라)
커널은 1G 를 어떻게 사용하는가?
- 선매핑용 주소 (896G) : 커널 내부에서 사용하는 지역 변수나 동적 할당 변수가 저장됨. DMA 주소 포함
- 후매핑용 주소 (128M) : 나중에 물리 메모리를 연결해서 사용할 용도로 남겨둠. vmalloc, pkmap area 주소, fixmap area 주소
CPU 64 bit 의 경우 사용 가능한 가상 주소 범위는 이론 상 16 * 1024 * 1024 TB
=> 2^64 = 16 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 = 16 * 1024 * 1024 TB
4 Level Page Table
가상 주소 9 bit (PGD-Global) + 9 bit (PUD-Upper) + 9 bit (PMD-Middle) + 12 bit (Page Table) = 가상 주소 48 bit 사용
- PGD: Page Global Directory
- PUD: Page Upper Directory
- PMD: Page Middle Directory
Page Table Entry 가 커버하는 메모리 사이즈
arch/x86/include/asm/page_table.h 파일에서 다음을 확인할 수 있다.
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT 12
위의 의미는 Page Table Entry 하나가 커버하는 크기는 2^12 = 4 * 1024 = 4KB 인 것을 확인할 수 있다.
arch/x86/include/asm/pgtable_64_types.h 에서 다음을 확인 할 수 있다.
/*
* PMD_SHIFT determines the size of the area a middle-level
* page table can map
*/
#define PMD_SHIFT 21
#define PTRS_PER_PMD 512
PMD 가 하나 할당 될 경우 PMD_SHIFT 는 9 + 12 bit = 21 bit
따라서 Page Middle Directory 의 하나의 entry 가 커버하는 크기는 2^21 = 2 * 1024 * 1024 = 2 MB 커버 가능
부팅 직후 Board 에서 확인할 수 있는 방법
/sys/kernel/debug/page_tables/current_kernel 내용에서 pmd 개수를 알아 낼 수 있다.
'Linux' 카테고리의 다른 글
MMAP (0) | 2022.12.18 |
---|---|
Page Fault 관련 정리 (0) | 2022.12.15 |
리눅스 프로그램과 커널 프로그램 (0) | 2022.12.09 |
리눅스 운영체제의 구성 (0) | 2022.12.09 |
커널 분석 및 디버깅 툴; uftrace (0) | 2022.12.09 |