27주차 스터디 중 이해되지 않는 부분에 대해 질문드립니다.
질문)
arch/arm64/include/asm/pgtable.h 내의
set_pud(), set_pmd() 함수 내에서
static inline void set_pud(pud_t *pudp, pud_t pud)
{
#ifdef __PAGETABLE_PUD_FOLDED
if (in_swapper_pgdir(pudp)) {
set_swapper_pgd((pgd_t *)pudp, __pgd(pud_val(pud)));
return;
}
#endif /* __PAGETABLE_PUD_FOLDED */
WRITE_ONCE(*pudp, pud);
if (pud_valid(pud))
dsb(ishst);
}
static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
{
#ifdef __PAGETABLE_PMD_FOLDED
if (in_swapper_pgdir(pmdp)) {
set_swapper_pgd((pgd_t *)pmdp, __pgd(pmd_val(pmd)));
return;
}
#endif /* __PAGETABLE_PMD_FOLDED */
WRITE_ONCE(*pmdp, pmd);
if (pmd_valid(pmd))
dsb(ishst);
}
__PAGETABLE_PUD_FOLDED 와 __PAGETABLE_PMD_FOLDED 의 정확한 의미가 궁금합니다.
스터디 중에서는
http://jake.dothome.co.kr/pt/ 에서 설명해주신 것을 토대로
- 예를 들어 VA_BITS = 48, PAGE_SIZE = 4K 인 시스템에서
리눅스 상에서는 논리적으로 4단계의 테이블을 가지지만
하드웨어 아키텍처에서 지원하는 테이블이 4단계 보다 적어서 각각의 테이블(pgd, pud, pmd, pte)을 만들지 않고
다른 테이블을 공유하여(예를 들면, pud 테이블을 만들지 않고, pgd 테이블에 pud 테이블 엔트리도 추가)
단계를 줄이는 것이 아닌가?
하는 의견을 주고 받았습니다.
.
안녕하세요? 문c블로그(http://jake.dothome.co.kr)의 문영일입니다.
최근 리눅스 커널은 5단계(pgd->p4d->pud->pmd->pte)까지 페이지 테이블이 확장되었습니다.
중간에 p4d 레벨이 추가되었습니다.
arm64 아키텍처는 2 ~ 4 단계 페이지 테이블을 지원하며,
사용자는 커널을 빌드하기 전에 사용할 페이지 테이블 단계를 선택합니다.
그리고 이에 따른 리눅스 페이지 테이블의 연계는 다음과 같습니다.
1) 4 단계
- 리눅스 커널은 pgd->pud->pmd->pte를 사용합니다.
(__PAGETABLE_P4D_FOLDED를 설정하여 커널이 p4d 테이블을 사용하지 않습니다.)
2) 3 단계
- 리눅스 커널은 pgd->pmd->pte를 사용합니다.
(__PAGETABLE_P4D_FOLDED, __PAGETABLE_PUD_FOLDED를 설정, ...)
3) 2 단계
- 리눅스 커널은 pgd->pte를 사용합니다.
(__PAGETABLE_P4D_FOLDED, __PAGETABLE_PUD_FOLDED, __PAGETABLE_PMD_FOLDED를 설정, ...)
위와 같이 단계가 줄어들면 리눅스 커널이 중간에 있는 테이블들은 할당하지 않고,
생략하도록 구현됩니다.
감사합니다.