우리가 앞선 프로젝트1~2에서 계속 다뤘던, thread구조체에 존재한다.
struct thread
{
...
struct supplemental_page_table spt;
...
}
spt라는 이름을 가진 supplemental_page_table라는 구조체다. vm.h에 아래 주석과 같이 이미 설명이 돼있는데, 우리 조는 hash구조체만 들어가있는 table이다.
/* Representation of current process's memory space.
* We don't want to force you to obey any specific design for this struct.
* All designs up to you for this. */
struct supplemental_page_table {
struct hash pages;
};
lazy load에 대한 포스팅에서 설명했듯, 기존의 프로젝트에서는 segment를 전체 다 실제 메모리에 바로 로드했다. 그러나 이제 우리는 spt에 필요한 정보들만 넣어두고, 실제 page fault가 발생하면 메모리에 로드하는 방식으로 바꾸는 것이다. 그러기 위해 필요한 정보들을 아래와 같이 정해주었다.
struct container {
struct file *file;
size_t page_read_bytes;
bool writable;
off_t offset;
size_t file_len;
};
load_segment() 함수와 그 안에 있는 vm_alloc_page_with_initializer() 함수를 활용해 spt에 정보들을 넣어준다.
이제 우리는 spt와 뗄레야 뗼 수 없는 상황이 돼었기 때문에 init부터 copy, kill 등에 대해서도 전부 구현해야 한다. 한 프로세스(스레드)마다 spt가 있는 것이기 때문에, 프로세스(스레드)가 복사되고 죽을 때를 항상 잘 고려해줘야 한다.
특히 copy할 때, 다음에 포스팅 할 type(uninit, anon, file)에 따라 정보들을 몽땅 복사해주었다.