SPT와 pml4를 통한 주소 번역의 차이점 - Week12-13-GOAT/pintos-vm GitHub Wiki
질문 요지:
SPT에서 페이지 구조체(
struct page
)를 해시 테이블로 다 저장해놨으면,
pml4
를 통해 물리 주소로 번역하지 말고 SPT에서 해시값으로 해당 가상 주소를 가진 페이지 구조체를 찾고
그 페이지 구조체에 있는 프레임 구조체를 참조해서 그 내부에 있는kva
를 사용해서
물리 프레임 내의 정보를 가져오면 되는 거 아냐?
결론적으로 맞는 말이야.
SPT만으로 충분히 접근 가능하며, pml4를 굳이 거칠 필요는 없어.
하지만 아래와 같은 이유들로 pml4
를 사용하는 경우도 존재해.
SPT(struct supplemental_page_table
)는 해시 테이블로써 **가상 주소 → 페이지 구조체(struct page
)**로의 매핑을 유지하고 있음.
-
이
struct page
는.frame
필드를 갖고 있고 -
struct frame
은kva
(물리 주소의 커널 매핑)을 포함함
즉:
struct page *page = spt_find_page(&curr->spt, va);
void *kva = page->frame->kva; // 물리 메모리에 직접 접근 가능
따라서, MMU나 pml4
를 통하지 않아도 프레임을 통해 직접 물리 메모리에 접근 가능함.
일부 상황에서는 pml4
가 필요함:
-
실제 CPU MMU는
CR3
(=pml4 주소)를 통해 페이지 테이블을 사용함. -
즉, 유저 코드가 어떤 주소를 접근하려고 하면 MMU가
pml4
를 따라가서 물리 주소를 찾음. -
이게 실제 메모리 접근에 필요한 "하드웨어 수준 주소 변환"임.
-
page fault 핸들러에서는:
-
SPT를 통해 해당 페이지의 존재 여부를 확인하고
-
물리 프레임 할당 후
-
pml4에 해당 매핑을 등록함 (
pml4_set_page
)
pml4_set_page(pml4, va, frame->kva, writable);
-
-
pml4_get_page()
을 통해 MMU 테이블 내 존재 여부나 권한을 확인할 수 있음. -
반면 SPT는 정책 수준(논리적 존재 여부)은 알지만, 현재 매핑이 되어 있는지는 모름.
-
커널이 직접 유저 프로세스의 가상 주소를 핸들링할 때
-
예:
spt_find_page → page->frame->kva → memcpy()
-
목적 | SPT만으로 가능 | pml4도 필요한 경우 |
---|---|---|
유저 주소에 해당하는 프레임의 kva 찾기 | ✅ 가능 | ❌ |
물리 주소로 MMU에 등록 | ❌ | ✅ pml4_set_page |
현재 가상 주소가 매핑되어 있는지 검사 | ❌ | ✅ pml4_get_page |
단순 커널 접근용 복사 등 | ✅ 가능 | ❌ |
원래 네가 질문한 취지는 **"pml4를 항상 거칠 필요는 없는 거 아니냐"**는 것이었고,
정확하게 맞는 말이야.
pml4는 MMU용이고, SPT는 OS용 메타데이터로 보면 돼.