Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

106258
1323
114608


[리눅스커널] 메모리관리: 페이지 테이블에 대해 알아보기 14. Memory Management

페이지 테이블로 가상 주소를 물리 주소로 변환하는 흐름을 살펴봤습니다. 이 과정에서 알아야 하는 주요 개념을 소개합니다.
 - 페이지 테이블 엔트리
 - 페이지 테이블 엔트리 주소

페이지 테이블 엔트리
페이지 테이블 엔트리(Page Table Entry, 줄여서 PTE)는 페이지 테이블의 정보이며 레코드라고도 부릅니다.

페이지 테이블 엔트리 주소
말 그대로 페이지 테이블 엔트리가 있는 주소를 의미합니다.

이해를 돕기 위해 다음 주소 테이블을 보겠습니다.
       주소       | 값       
1 NSD:80004000 | 0x0
2 NSD:80004004 | 0x0
3 NSD:80004008 | 0x0
4 NSD:8000400C | 0x0
...
5 NSD:80006018 | 0x0061941E
6 NSD:8000601C | 0x0071941E
7 NSD:80006020 | 0x0081941E

위 정보는 페이지 테이블 엔트리 주소와 페이지 테이블 엔트리입니다. 

1번째 줄 가장 왼쪽에 있는 0x80004000가 페이지 테이블 베이스 주소입니다. 5 번째 줄을 보면 0x80006018 주소에 0x0061941E가 있습니다.

0x0061941E 는 페이지 테이블 엔트리이며 80006018는 페이지 테이블 엔트리 주소입니다. 커널에서는 swapper_pg_dir 전역 변수가 페이지 테이블 시작 주소를 저장합니다.

페이지 테이블 종류 알아보기
이번에는 페이지 테이블 종류를 알아봅시다. 페이지 테이블은 레벨1 페이지 테이블과 레벨2 페이지 테이블로 분류할 수 있습니다.

레벨1 페이지 테이블은 마스터 페이지 테이블이라고 부르며 크게 3가지 유형의 엔트리가 있습니다. 다음 그림을 보면서 레벨1 페이지 테이블 엔트리 타입에 대해 살펴봅시다.
 
[그림 14.15] 레벨1 페이지 테이블 엔트리 타입

가장 위쪽은 Fault 타입으로 하위 비트 [1:0]가 00입니다. 유효하지 않은 페이지 테이블 엔트리이며 이 경우 페이지 폴트로 익셉션이 발생합니다.

그림 가장 아랫 부분에 보이는 것이 ‘섹션 엔트리’ 페이지 테이블입니다. 하위 비트 [1:0]가 10입니다. 섹션 엔트리의 [31:20] 비트에는 물리 주소 변환 주소가 있습니다. 이 페이지 테이블 엔트리 정보로 바로 물리 주소를 변환할 수 있습니다.

레벨2 페이지 테이블로 접근해 물리 주소를 변환하는 과정은 조금 복잡합니다. 이어서 다음 그림을 보면서 레벨2 페이지 테이블 타입에 대해 살펴봅시다.
 
[그림 14.16] 레벨2 페이지 테이블 엔트리 타입

위 그림 가장 윗 부분은 라지 페이지 테이블로 하위 비트 [1:0]가 01입니다. 메모리를 64KB 사이즈 블록으로 나눠 관리합니다. PA[31:16] 비트에 물리 주소로 매핑되는 변환 주소가 있습니다. 

다음으로 그림 아래 부분이 스몰 페이지 테이블이며 하위 비트 [1:0]가 1x입니다.
메모리를 4KB 사이즈 블록으로 나눠 관리합니다. PA[31:12] 비트에 물리 주소로 매핑되는 변환 주소가 있습니다.  

가운데는 라지 페이지 테이블로 하위 비트 [1:0]가 01입니다. 메모리를 64KB 사이즈 블록으로 나눠 관리합니다. PA[31:16] 비트는 물리 주소로 매핑되는 변환 주소가 있습니다.

각 페이지 테이블 엔트리에 따른 페이지 테이블 종류를 다음 테이블을 보면서 정리합시다.
 
[그림 14.17] 페이지 테이블 엔트리에 따른 페이지 테이블 종류

위 테이블에서 PA로 명시된 비트는 베이스 물리 주소를 의미합니다.

베이스 물리 주소로 명시한 이유는 변환된 물리 주소는 다음 형식이기 때문입니다.
 베이스 물리 주소 | 가상 주소 오프셋 주소 

예를 들어 스몰 페이지 엔트리의 경우 PA[31:12] 비트까지가 물리 주소이고 [11:0] 비트는
가상 주소 오프셋 주소 비트를 의미하기 때문입니다.

이 내용은 레벨 페이지 테이블 변환 과정을 통해 더 자세히 살펴보겠습니다.

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)

Reference(커널 메모리 소개) 
가상 주소를 물리 주소로 어떻게 변환할까?   
메모리 존(Zone)에 대해서   
커널 메모리 할당은 어떻게 할까   
슬랩 메모리 할당자와 kmalloc 슬랩 캐시 분석   
커널 메모리 디버깅






핑백

덧글

댓글 입력 영역