pml4로는 충분한 정보가 표현되지 않기 때문에 이를 보충해주는 supplemental page table(이하 spt) 가 필요하다

pml4로 관리되는 페이지 테이블은 커널 가상메모리와 물리메모리를 맵핑하는 느낌이라면,

spt는 해당 프로세스가 할당한 유저 가상페이지를 관리하는 테이블

spt

프로세스마다 존재하는 자료구조로서, 각각의 페이지에 대해서 데이터가 어디에 존재하는지(frame, disk, swap 중 어디에 존재하는지), 이에 상응하는 커널 가상주소를 가리키는 포인터 정보, active인지 inactive 인지와 같은 보조 데이터들을 추적하는 자료 구조.

#define VM 시 스레드 구조체에는 supplemental_page_table 구조체가 존재한다.

#ifdef VM
	/* Table for whole virtual memory owned by thread. */
	struct supplemental_page_table spt;
#endif

주석에 보면 spt를 Table for whole virtual memory owned by thread. 라고 하고 있는데,

결국 thread가 소유한 가상메모리 = 프로세스에 할당한 가상 메모리(페이지)

pintos 내의 어딘가에 특정 프로세스가 virtual page를 할당했다는 사실을 저장할 수 있는 구조체 (supplemental page table)를 만들어서 거기에 virtual page의 존재 여부를 기록하시는 것이 virtual page를 할당하는 것입니다*. - 질문방 (조교님 답변)*

그렇다면 page 구조체를 생성하게 되면 이 정보가 spt 에 들어가는 개념인 것 같다.

spt에 들어가야 하는 항목들엔 뭐가 있을까

spt 항목
가상주소 (va)
페이지 구조체 (struct page *)
location of data
kva (data 위치가 frame 일 때)
사용중인지 아닌지

이 구조체 spt는 initd 또는 __do_fork 로 프로세스가 생성될 때 supplemental_page_table_init 함수를 통해서 초기화 된다


구현해야 하는 세 가지 spt 관련 함수