Skip to content
im_9fe edited this page May 29, 2025 · 1 revision

SPT

현재 페이지 테이블 엔트리만으로는 OS를 동작시키기 어렵다. 예를 들면 요구 페이징 기법을 위해 만들어진 미초기화 페이지에 접근해서 페이지 폴트가 발생했다면? 이 페이지가 기존에 할당받아야했던 프레임 정보를 어딘가에 저장해둬야 한다. 이러한 페이지의 메타데이터를 구조체로 나타낸것이 page 구조체이고, 이를 담아두는 테이블이 SPT이다.

엔트리 구조

struct supplemental_page_table
{
	void *va;
	struct page *page;
	struct hash_elem elem;
};
  • 아마 이렇게만 사용하면 되지 않을까 추측 중
  • 해시 테이블 키 값으로 va가 사용될 듯

구현 함수

void supplemental_page_table_init (struct supplemental_page_table *spt);
  • SPT를 초기화한다
  • 프로세스가 시작되거나 (process.c/initd) 포크될 때(__do_fork) 사용됨
struct page *spt_find_page (struct supplemental_page_table *spt, void *va);
  • SPT에서 va를 통해 가져와야할 엔트리를 정해서 가져온다
  • 못 찾으면 NULL
bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);
  • SPT에 페이지를 삽입한다
  • 이미 해당 가상 주소가 등록되어 있다면 실패 처리해야함
bool supplemental_page_table_copy (struct supplemental_page_table *dst,
    struct supplemental_page_table *src);
  • fork 시 SPT를 복제할때 필요한듯
void supplemental_page_table_kill (struct supplemental_page_table *spt);
  • exit할 때 SPT를 해제해주기 위해 필요
  • 내부의 페이지 엔트리를 반복하면서 해당 페이지의 destroy를 호출해줘야 함 !!

구현 방식

  • SPT 엔트리의 정보
    • page 구조체는 SPT에서만 사용되는가?
      • GPT의 답변으로는 그렇다
      • page 구조체는 SPT 안에서 관리중인 페이지의 메타데이터를 담은 구조체이다
    • 그럼 메타데이터가 아닌 실제 page는?
      • 페이지 테이블에 있겠지…
      • mmu.c 내의 함수들로 인해 번역되어 페이지를 찾고 페이지 엔트리 내의 물리 주소를 보고 실제 데이터를 찾아가는 듯 하다
      • 이때 페이지 폴트가 발생하거나 하면 SPT를 통해 실제 데이터를 스왑 인 해주면 되는 듯

Clone this wiki locally