Linux 의 메모리 관리를 이해하기 위해서는 2단계 address translation에 대해서 이해해야 한다.
1단계 전환(GDT/LDT) : Logical Address --> Linear Address
2단계 전환(Page Table): Linear Address --> Physical Address
다음으로 구분을 해야 하는 것이 virtual address 와 Linear address의 관계이다.
Process 별로 page table을 관리함
Context switching이 일어나면, mm_struct->pgd 의 값이 CR3로 로드되어, cpu는 virtual address를 physical address로 MMU를 이용해서 변환할 수 있다.
또한 CR3에 새로운 값이 로드되면, x86에서는 tlb flush를 한다.
https://www.kernel.org/doc/gorman/html/understand/understand006.html
4 Level Page Table
참조: http://lwn.net/Articles/106177/
http://lwn.net/Articles/117749/
kernel 2.6.11 버전 이후부터 PUD 가 추가됨 (64bit architecture에서만 지원)
Architecture |
PGD |
PUD |
PMD |
PTE |
i386 |
31-22 |
|
|
21-12 |
i386(PAE mode) |
31-30 |
|
29-21 |
10-12 |
x86-64 |
46-39 |
38-30 |
29-21 |
20-12 |
# 3 level table 일 경우 page 찾는 방법
pgd = pgd_offset(address);
pmd = pmd_offset(pgd, address);
pte = *pte_offset_map(pmd, address);
page = pte_page(pte);
# 4 level table 일 경우 page 찾는 방법
pgd = pgd_offset(mm, address);
pud = pud_alloc(mm, pgd, address);
pmd = pmd_alloc(mm, pud, address);
pte = pte_offset_map(pmd, address);
PGD : Page Global Directory
PUD :
PMD : Page Middle Directory
PTE : Page Table Entry
HugePage 일 경우
Linux memory management 에 대해서 잘 설명한 책
understanding the linux virtual memory manager.pdf
userstanding the implementation of virtual memory.pdf
http://www.utdallas.edu/~zhiqiang.lin/spring2012.html#toc2