Update load_segment to load only the metadata of the pages to the SPT, w/ G
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user