Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

19113
1478
166889


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

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

페이지 테이블 엔트리
페이지 테이블 엔트리(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 슬랩 캐시 분석   
커널 메모리 디버깅


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2








핑백

덧글

댓글 입력 영역