SPT와 pml4를 통한 주소 번역의 차이점 - Week12-13-GOAT/pintos-vm GitHub Wiki

질문 요지:

SPT에서 페이지 구조체(struct page)를 해시 테이블로 다 저장해놨으면,
pml4를 통해 물리 주소로 번역하지 말고 SPT에서 해시값으로 해당 가상 주소를 가진 페이지 구조체를 찾고
그 페이지 구조체에 있는 프레임 구조체를 참조해서 그 내부에 있는 kva를 사용해서
물리 프레임 내의 정보를 가져오면 되는 거 아냐?


결론적으로 맞는 말이야.
SPT만으로 충분히 접근 가능하며, pml4를 굳이 거칠 필요는 없어.
하지만 아래와 같은 이유들로 pml4를 사용하는 경우도 존재해.


✅ 왜 SPT에서 바로 kva로 접근해도 괜찮은가?

SPT(struct supplemental_page_table)는 해시 테이블로써 **가상 주소 → 페이지 구조체(struct page)**로의 매핑을 유지하고 있음.

  • struct page.frame 필드를 갖고 있고

  • struct framekva(물리 주소의 커널 매핑)을 포함함

즉:

struct page *page = spt_find_page(&curr->spt, va);
void *kva = page->frame->kva;  // 물리 메모리에 직접 접근 가능

따라서, MMU나 pml4를 통하지 않아도 프레임을 통해 직접 물리 메모리에 접근 가능함.


🔄 그럼에도 pml4를 사용하는 이유

일부 상황에서는 pml4가 필요함:

1. MMU에게 가상 → 물리 주소를 알려줘야 하는 경우

  • 실제 CPU MMU는 CR3(=pml4 주소)를 통해 페이지 테이블을 사용함.

  • 즉, 유저 코드가 어떤 주소를 접근하려고 하면 MMU가 pml4를 따라가서 물리 주소를 찾음.

  • 이게 실제 메모리 접근에 필요한 "하드웨어 수준 주소 변환"임.

2. 페이지가 fault로 접근되었을 때

  • page fault 핸들러에서는:

    1. SPT를 통해 해당 페이지의 존재 여부를 확인하고

    2. 물리 프레임 할당 후

    3. pml4에 해당 매핑을 등록함 (pml4_set_page)

    pml4_set_page(pml4, va, frame->kva, writable);
    

3. 접근 권한 및 존재 여부 확인

  • pml4_get_page()을 통해 MMU 테이블 내 존재 여부나 권한을 확인할 수 있음.

  • 반면 SPT는 정책 수준(논리적 존재 여부)은 알지만, 현재 매핑이 되어 있는지는 모름.


✅ 언제 pml4가 필요 없는가?

  • 커널이 직접 유저 프로세스의 가상 주소를 핸들링할 때

    • 예: spt_find_page → page->frame->kva → memcpy()


🧠 결론 정리

목적 SPT만으로 가능 pml4도 필요한 경우
유저 주소에 해당하는 프레임의 kva 찾기 ✅ 가능
물리 주소로 MMU에 등록 ✅ pml4_set_page
현재 가상 주소가 매핑되어 있는지 검사 ✅ pml4_get_page
단순 커널 접근용 복사 등 ✅ 가능

원래 네가 질문한 취지는 **"pml4를 항상 거칠 필요는 없는 거 아니냐"**는 것이었고,
정확하게 맞는 말이야.
pml4는 MMU용이고, SPT는 OS용 메타데이터로 보면 돼.

⚠️ **GitHub.com Fallback** ⚠️