/* Destroy the anonymous page. PAGE will be freed by the caller. */
static void
anon_destroy(struct page *page)
{
struct anon_page *anon_page UNUSED = &page->anon;
// 페이지가 프레임을 가지고 있는 경우 이를 해제합니다.
if (page->frame != NULL)
{
pml4_clear_page(thread_current()->pml4, page->va);
palloc_free_page(page->frame->kva);
page->frame = NULL;
}
// 추가적으로 해제할 자원이 있으면 여기에 해제 로직을 추가합니다.
}
김현수라는 이름을 가진 귀인이 나타나 코드를 슬쩍 보더니 "음.. 여기가 문제인가?" 하며
pml4_clear_page(thread_current()->pml4, page->va);
이 구절을 적어주었다.
그랬더니 마법처럼 커널 패닉이 pass로 바뀌는 오병이어의 기적이 일어났다. 현렐루야
문제는 내가 저 함수를 모른다. gpt야 설명해줘
pml4_clear_page 함수 설명
pml4_clear_page 함수는 사용자 가상 페이지 UPAGE를 페이지 디렉토리 PD에서 "존재하지 않음"으로 표시합니다. 나중에 해당 페이지에 접근하려고 하면 페이지 폴트가 발생하게 됩니다. 페이지 테이블 엔트리의 다른 비트는 유지됩니다. UPAGE는 매핑되어 있을 필요는 없습니다.
코드 분석
- ASSERT 문:
- ASSERT(pg_ofs(upage) == 0);: upage가 페이지 오프셋이 0인지 확인합니다. 즉, upage가 페이지의 시작 주소여야 합니다.
- ASSERT(is_user_vaddr(upage));: upage가 사용자 가상 주소 영역에 있는지 확인합니다.
- 페이지 테이블 엔트리 찾기:
- pte = pml4e_walk(pml4, (uint64_t)upage, false);: 페이지 테이블 엔트리를 찾습니다. false는 페이지 테이블 엔트리를 생성하지 않음을 의미합니다. 만약 해당 엔트리가 존재하지 않으면 NULL을 반환합니다.
- 페이지 테이블 엔트리 수정:
- if (pte != NULL && (*pte & PTE_P) != 0): 페이지 테이블 엔트리가 존재하고, 해당 엔트리가 "존재" 비트(PTE_P)가 설정되어 있는지 확인합니다.
- *pte &= ~PTE_P;: "존재" 비트를 해제합니다. 이는 해당 페이지가 더 이상 메모리에 존재하지 않음을 나타냅니다.
- TLB 무효화:
- if (rcr3() == vtop(pml4)) invlpg((uint64_t)upage);: 현재 페이지 디렉토리가 pml4와 동일한 경우, invlpg 명령어를 사용하여 해당 페이지의 TLB 항목을 무효화합니다. 이는 페이지 테이블의 변경 사항을 즉시 반영하도록 보장합니다.
문제 해결
앞서 설명한 커널 패닉 문제와 관련하여, pml4_clear_page 함수가 올바르게 사용되는지 확인해야 합니다. 특히, 페이지 테이블 엔트리와 관련된 문제일 가능성이 높으므로, 페이지 테이블 엔트리가 올바르게 관리되고 있는지 확인합니다.
추가 디버깅 정보 추가
pml4_clear_page 함수에 디버깅 정보를 추가하여, 페이지 테이블 엔트리가 올바르게 수정되고 있는지 확인합니다.
mmu.c에 대해서 좀 깊게 이해를 해야 될 것 같다는 생각이 강하게 든다.
'크래프톤 정글 일지' 카테고리의 다른 글
크래프톤 정글 5기 나만무 후기 (0) | 2024.07.29 |
---|---|
대한상공회의소 KDT 멘토멘티단 <Team-Mate> 면접 후기 (1) | 2024.07.18 |
[PintOS] project 3.3.0 - stack growth (1) | 2024.06.07 |
[PintOS] project 3.2.1 - anonymous 디버깅 (1) | 2024.06.07 |
[PintOS] project 3.2.0 - anonymous page, vm.c, process.c (0) | 2024.06.07 |