안녕하세요
"16기 리눅스 커널 스터디 C조 19주차 질문입니다." 게시글에서
두 번째 질문과 답변해주신 내용에서 아직 이해하지 못한 부분이 있어 추가 질문드립니다.
http://www.iamroot.org/xe/index.php?document_srl=208608&mid=Programming#1
해당 질문과 관련된 내용에서 이해하지 못한 것은
"어떻게 pgd/pud/pmd가 물리주소가 될 수 있는지?" 입니다
- __pgd_to_phys
- __pud_to_phys
- __pmd_to_phys
위의 열거된 3개의 매크로는 pgd/pud/pmd를 인자로 받아서
pte 캐스팅과 오프셋 마스킹을 해서 반환(치환)합니다
지금까지 이해한 내용은
p?d = 다음 페이지 테이블의 위치(시작 주소)
질문을 통해 새로 알게된 내용은
p?d -> __p?d_to_phys를 통해 오프셋을 제거한 물리주소로 변환될 수 있음
p?d가 pte 캐스팅과 오프셋 마스킹만으로 어떻게 물리주소가 될 수 있는지 궁금합니다.
댓글 2
.
안녕하세요?
각 p*d 엔트리에는 다음 단계 p*d 페이지 테이블을 가리키는 물리 주소(phys)가 있습니다.
마지막 엔트리 pte 엔트리에는 페이지 프레임이 있는 물리 주소(phys)를 가리킵니다.
즉, 다음과 같이 정리됩니다.
pgd 테이블의 vaddr에 해당하는 pgd 엔트리의 내용:
-> 1) pud 테이블 시작 물리 주소(phys) + 속성이 담깁니다.
pud 테이블의 vaddr에 해당하는 pud 엔트리의 내용:
-> 2) pmd 테이블 시작 물리 주소(phys) + 속성이 담깁니다.
pmd 테이블의 vaddr에 해당하는 pmd 엔트리의 내용:
-> 3) pte 테이블 시작 물리 주소(phys) + 속성이 담깁니다.
pte 테이블의 vaddr에 해당하는 pte 엔트리의 내용:
-> 4) page frame의 물리 주소(phys) + 속성이 담깁니다.
page frame의 물리 주소를 알려면 vaddr 부터 위의 4단계 테이블을
lookup해야 알 수 있습니다.
__pgd_to_phys 매크로의 결과는 4) 번의 최종 page frame의 물리 주소(phys)가 아니라
1) 번의 속성을 제외한 pud 테이블 시작 물리 주소(phys)를 알아옵니다.
또한 마찬가지로
__pud_to_phys 매크로의 결과는 4) 번의 page frame의 물리 주소(phys)가 아니라
2) 번의 속성을 제외한 pud 테이블 시작 물리 주소(phys)를 알아옵니다.
혹시 이해가 어려우시면 통합 스터디에서 다뤄보시기 바랍니다.
여러 사람이 의견을 교환하시면 이해하기 더 쉽습니다.
감사합니다.