09_pintos_VM_etc

신치우·2022년 12월 12일

data_structure_and_Pintos

목록 보기
32/36

pml4 function

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_is_dirty

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_set_dirty

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);
	}
}

pml4_clear_page

페이지 디렉토리 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);
	}
}
profile
https://shin8037.tistory.com/

0개의 댓글