Merge lazy loading with page swapping #56

Merged
td1223 merged 9 commits from vm/lazy-loading into vm/page-swap-synch 2024-12-04 18:48:19 +00:00
8 changed files with 210 additions and 58 deletions
Showing only changes of commit df20e0fdfe - Show all commits

View File

@@ -705,40 +705,11 @@ load_segment (struct file *file, off_t ofs, uint8_t *upage,
and zero the final PAGE_ZERO_BYTES bytes. */ and zero the final PAGE_ZERO_BYTES bytes. */
size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE; size_t page_read_bytes = read_bytes < PGSIZE ? read_bytes : PGSIZE;
size_t page_zero_bytes = PGSIZE - page_read_bytes; size_t page_zero_bytes = PGSIZE - page_read_bytes;
/* Check if virtual page already allocated */
struct thread *t = thread_current ();
uint8_t *kpage = pagedir_get_page (t->pagedir, upage);
if (kpage == NULL){
/* Get a new page of memory. */
kpage = get_usr_kpage (0, upage);
if (kpage == NULL){
return false;
}
/* Add the page to the process's address space. */
if (!install_page (upage, kpage, writable))
{
free_usr_kpage (kpage);
return false;
}
} else {
/* Check if writable flag for the page should be updated */
if(writable && !pagedir_is_writable(t->pagedir, upage)){
pagedir_set_writable(t->pagedir, upage, writable);
}
}
/* Load data into the page. */ /* Add the page to the SPT */
if (file_read (file, kpage, page_read_bytes) != (int) page_read_bytes){ if (page_insert (file, ofs, upage, read_bytes, zero_bytes, writable,
return false; PAGE_EXECUTABLE) == NULL)
} return false;
memset (kpage + page_read_bytes, 0, page_zero_bytes);
/* Advance. */ /* Advance. */
read_bytes -= page_read_bytes; read_bytes -= page_read_bytes;