pml4_is_accessed
pml4_set_accessed
pml4_is_dirty
pml4_set_dirty
pml4_clear_page
x86_64 하드웨어는 각 페이지에 대한 페이지 테이블 엔트리(PTE)의 비트 쌍을 통해 페이지 대체 알고리즘을 구현하는 데 약간의 도움을 제공한다.
페이지에 대한 읽기 또는 쓰기에서 CPU는 페이지의 PTE에서 액세스된 비트를 1로 설정하고, 쓰기에서 CPU는 더티 비트를 1로 설정합니다.
CPU는 이러한 비트를 0으로 재설정하지 않지만 OS는 재설정할 수 있습니다. 이 비트들을 제대로 해석하려면 aliase, 즉 동일한 프레임을 참조하는 두 개 이상의 페이지를 이해해야 한다.
aliase frame에 액세스하면 액세스된 비트와 더티 비트가 하나의 페이지 테이블 항목(액세스에 사용된 페이지에 대한 비트)에서만 업데이트됩니다. 다른 별칭에 대한 액세스 비트 및 더티 비트는 업데이트되지 않습니다.
--> 즉 User page에 직접 접근하는 것이 아닌 frame의 accesss bit와 dirty bit를 수정하여 접근을 함
pml4 의 가상페이지에 page->va 가 dirty 인 경우 (즉, page->va 가 설치된 후 페이지가 수정된 경우 true를 반환)
bool
pml4_is_dirty (uint64_t *pml4, const void *vpage) {
uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
return pte != NULL && (*pte & PTE_D) != 0;
}
PML4의 가상 페이지 VPAGE에 대해 PTE에서 더티 비트를 더티로 설정합니다.
void
pml4_set_dirty (uint64_t *pml4, const void *vpage, bool dirty) {
uint64_t *pte = pml4e_walk (pml4, (uint64_t) vpage, false);
if (pte) {
if (dirty)
*pte |= PTE_D;
else
*pte &= ~(uint32_t) PTE_D;
if (rcr3 () == vtop (pml4))
invlpg ((uint64_t) vpage);
}
}
페이지 디렉토리 PD에서 사용자 가상 페이지 UPAGE를 "존재하지 않음"으로 표시합니다. 나중에 페이지에 액세스하면 오류가 발생합니다. 페이지 테이블 항목의 다른 비트는 보존됩니다.
UPAGE를 매핑할 필요가 없습니다.
void
pml4_clear_page (uint64_t *pml4, void *upage) {
uint64_t *pte;
ASSERT (pg_ofs (upage) == 0);
ASSERT (is_user_vaddr (upage));
pte = pml4e_walk (pml4, (uint64_t) upage, false);
if (pte != NULL && (*pte & PTE_P) != 0) {
*pte &= ~PTE_P;
if (rcr3 () == vtop (pml4))
invlpg ((uint64_t) upage);
}
}