이전까지는 pintos에서 프로세스를 실행하면 페이지가 하나 할당되고 여기에 코드와 데이터, 스택이 할당되었습니다. 이것을 이제는 프로세스가 요청하는 메모리에 대해서만 페이지를 할당하는 방식으로 변경합니다. 이를 통해서 윤영체제에서 메모리를 효율적으로 사용할 수 있습니다. 아무리 크기가 큰 프로그램이더라도 현재 사용 중인 영역만 불러오면 되기 때문입니다.
loag_segment() 함수를 수정하여 프로그램의 영역을 페이지 단위로 분할하여 해당 정보를 supplemental page table에 저장합니다.
/* process.c */
static bool
load_segment (struct file *file, off_t ofs, uint8_t *upage, uint32_t read_bytes, uint32_t zero_bytes, bool writable)
{
...
struct thread *t = thread_current ();
while (read_bytes > 0 || zero_bytes > 0)
{
size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
size_t page_zero_bytes = PGSIZE - page_read_bytes;
struct page *p = malloc (sizeof (struct page));
p->address = upage;
p->segment = SEG_CODE;
p->writable = writable;
p->file = file;
p->position = ofs;
p->read_bytes = page_read_bytes;
p->zero_bytes = page_zero_bytes;
page_table_insert (&t->extra_page_table, p);
read_bytes -= page_read_bytes;
zero_bytes -= page_zero_bytes;
upage += PGSIZE;
ofs += page_read_bytes;
}
return true;
}