R&D/OS

Page table & address translation

sunshout 2013. 11. 15. 00:19

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 일 경우




virtual memory.ppt


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