210224 개발일지(79일차) - 운영체제(OS) 프로젝트 #3-3 Supplemental Page Table

고재개발·2021년 3월 4일
0

OS Project

목록 보기
20/28

Supplemental Page Table

우리가 앞선 프로젝트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와 관련된 함수 구현

이제 우리는 spt와 뗄레야 뗼 수 없는 상황이 돼었기 때문에 init부터 copy, kill 등에 대해서도 전부 구현해야 한다. 한 프로세스(스레드)마다 spt가 있는 것이기 때문에, 프로세스(스레드)가 복사되고 죽을 때를 항상 잘 고려해줘야 한다.
특히 copy할 때, 다음에 포스팅 할 type(uninit, anon, file)에 따라 정보들을 몽땅 복사해주었다.

profile
고재개발

0개의 댓글