(1) 리눅스의 3단계 페이징 기법

○ 리눅스 커널은 다양한 시스템에 포팅하여 사용할 수 있다.

리눅스는 인텔의 2단게 페이징에 한단계를 추가한 3단계 페이징 기법을 사용한다.
  
(커널2.6 후반대 버전에서는 4단계 페이징을 지원한다.)

64bit의 선형주소를 사용하면서 3단계 페이징 기법을 사용하는 이유는 32bit선형 주소보다 주소공간이 훨신 커지므로 페이지 테이블이 차지하는 용량을 줄이기 위한 것이다.

  - 리눅스에서 인텔의 i386환경(2단계 페이징 기법)을 처리하려면 middle directory를 한개의 엔트리만 사용하여 2단계처럼 쓴다.

○ 64bit의 선형주소를 4부분으로 나눈다. 


  -
Page Global Directory || Page Middle Directory || Page Table || Offset


○ 페이징유닛은 페이지 글로벌 디렉토리(pgd_t), 페이지 미들디렉토리(pmd_t), 페이지 테이블(pte_t), 오프셋 으로 나뉜다. 


- pgd_offset(mm, address) 

: Memory Descriptor와 가상주소를 인자로 받아 Page Global Directory의 엔트리 주소를 반환한다.

- pmd_offset(dir, address) 

: Page Global directory와 가상주소를 인자로 받아 Page middle Directory의 엔트리 주소를 반환한다.

- pte_offset(dir, address) 

: Page Middle Directory와 가상주소를 인자로 받아 Page Table의 엔트리 주소를 반환한다.

- pgd_none(pgd), pmd_none(pmd), pte_none(x)  

: 각 테이블의 엔트리를 인자로 받아 존재여부를 검사하며 존재하면 0을, 그렇지 않으면 1을 반환한다.

- pgd_ present(pgd), pmd_present(pmd), pte_present(pte) 

: 각 테이블의 엔트리를 인자로 받아 해당 엔트리의 present 프랠그를 검사하여 해당 테이블 또는 해당 페이지가 메모리에 존재하면 1을 반환한다.

- pgd_clear(pgd), pmd_clear(pmd), pte_clear(pte) 

: 각 테이블의 엔트리를 인자로 받아 해당 테이블의 엔트리를 지운다.

- pgd_page(pgd) 

: 페이지 글로벌 디렉토리의 엔트리에서 페이지 미들 디렉토리의 주소를 반환한다.

- pmd_page(pmd) 

: 페이지 미들 디렉토리의 엔트리에서 페이지 테이블의 가상주소를 반환한다.

- pte_page(pte) 

: 페이지 테이블 엔트리가 가리키는 페이지 프레임의 페이지 디스크립터의 주소를 반환한다.


※ 출처 : http://idkkangjs.blog.me/30091117058

by 민트앤라떼 2011. 9. 27. 15:50