메모리 공부 중에 질문이 있습니다.

235 views
Skip to first unread message

scrib...@gmail.com

unread,
Mar 28, 2019, 10:30:57 PM3/28/19
to Linux Kernel ARM
안녕하세요? ARM Linux 메모리 쪽과 TLB를 공부하려는 학생입니다.

저의 목표는 task는 몇 개의 페이지를 가지는지(물리 프레임에 매핑되는지) 또한 가상 주소를 실제 물리 주소로 변환하는 과정을 직접 출력하여 ARM HW 페이지 테이블에 어떻게 매핑되는지 확인해보고 싶습니다.

1. 프로세스는 독립된 페이지 테이블을 가진다고 알고 있습니다.
프로세스 페이지 테이블과 커널 영역의 pgd, pmd, pte와 같은 페이지 테이블은 독립된 영역인지 궁금합니다. 프로세스 페이지 테이블 엔트리가 vm_area_struct 구조체인지 궁금합니다.

2. task는 하나의 mm_struct를 가지고 있습니다.
mm_struct 구조체 내에는 pgd, pmd, pte 구조체 멤버를 가지고 있어서 pte까지 접근 가능하지만 page offset 정보는 어디에 있는지 궁금합니다.

3. page 크기가 4KB이고, task가 사용하는 메모리 크기가 4KB가 넘어간다면 task는 여러개의 page를 할당 받을 수 있는지 궁금합니다.

제가 공부한 내용이 다르거나 방향에 대해 조언해주시면 감사드리겠습니다.

잘 부탁드리겠습니다.

Youngil Moon

unread,
Mar 29, 2019, 4:24:09 AM3/29/19
to linux-ke...@googlegroups.com
안녕하세요? 문c 블로그의 문영일입니다.

리눅스 커널에서의 매핑은 여러 가지 기법을 사용하여 수행하므로 아키텍처에서 단순히 매핑하는 것 보다는 상당히 복잡합니다.

답변이 상당히 어려운 질문이라서 제 블로그 'http://jake.dothome.co.kr/pt/' 에서 그림 두 장과 간단한 설명을 추가하였습니다. 먼저 읽어보시고 제 글의 답변으로 해결 안되시면 다시 질문해주길 바랍니다.

1번)
이 건 제가 그린 그림을 통해서 알 수 있을 것입니다. pgd의 경우 커널과, 각 유저 모두 별개의 페이지 테이블을 가집니다. 그러나 커널용 pgd는 복제를 위한 단순 관리용으로만 사용하고, 실제로는 유저 pgd 페이지 테이블에서 유저 영역 뿐만 아니라 커널 페이지나 커널용 pte 테이블을 가리키므로 커널 영역에 접근할 수 있습니다.

보안 때문에 최근 커널에서는 커널 옵션을 제공하여 이를 block하고 있습니다. 이러한 KPTI(Kernel page-table isolation, aka KAISER) 옵션을 사용하면 약 5%의 성능저하가 발생합니다. 

프로세스 페이지 테이블 엔트리는 vm_area_struct 구조체가 아닙니다.
프로세스 페이지 테이블 엔트리들은 가상 주소와 물리 주소간의 매핑 정보를 아키텍처에게 제공하여 실제 매핑이 이루어집니다. 그러나 vm_area_struct 정보들은 로지컬하게 가상 공간을 관리합니다. 즉 커널이 관리하는 페이지 테이블과 다른 또 하나의 로직컬한 공간 정보입니다. 메모리를 할당할 때 아키텍처에게 실제 메모리를 매핑하지 않고, vm_area_struct 만을 갱신합니다. 나중에 fault 익셉션이 발생된 후 vm_struct_ area 정보를 들여다 보고 메모리가 필요하구나 인지한 후 할당을 하는 방법으로 커널이 메모리 할당 관리를 합니다. 이를 lazy allocation 방법이라고 하는 기법입니다. 유저 페이지 할당은 커널 페이지 할당 매커니즘을 거의 모두 이해해야 할 정도로 상당히 복잡합니다.

2번)
예를 들어 cpu가 가상 주소 0xf800_0000에서 4바이트를 로드하고자 할 때, 그 주소의 상위 몇 비트로 pgd 엔트리의 인덱스가 되어 pgd 테이블 엔트리를 찾고, 그 다음 중간 비트에서 다음 단계의 인덱스가 되어 다음 단계의 테이블 엔트리를 찾습니다. 최종적으로 어느 한 페이지를 가리키게 매핑되어 있습니다. page offset은 가장 마지막 단계의 즉, pte 테이블의 인덱스를 찾는 것을 말씀하시는 것 같은데, 제가 설명한데로 아키텍처의 MMU가 하는 일입니다.

3번)
네 당연히 여러 페이지를 할당 받을 수 있습니다.

커널의 메모리 할당은 여러 개의 루틴들이 매우 복잡하게 유기적으로 얽혀있습니다. 여러 번 시도하여 파악해내는 것이 중요합니다. 

도움이 되시길 바랍니다. 

문영일 드림

2019년 3월 29일 (금) 오전 11:30, <scrib...@gmail.com>님이 작성:
--
Google 그룹스 'Linux Kernel ARM' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 linux-kernel-a...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 linux-ke...@googlegroups.com(으)로 이메일을 보내세요.
https://groups.google.com/group/linux-kernel-arm에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages