summaryrefslogtreecommitdiffstats
path: root/vm/page.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm/page.c')
-rw-r--r--vm/page.c43
1 files changed, 7 insertions, 36 deletions
diff --git a/vm/page.c b/vm/page.c
index 336353e..2853497 100644
--- a/vm/page.c
+++ b/vm/page.c
@@ -2,6 +2,7 @@
2#include "filesys/file.h" 2#include "filesys/file.h"
3#include "userprog/process.h" 3#include "userprog/process.h"
4#include "threads/thread.h" 4#include "threads/thread.h"
5#include "threads/vaddr.h"
5#include "threads/malloc.h" 6#include "threads/malloc.h"
6#include "threads/palloc.h" 7#include "threads/palloc.h"
7#include "vm/page.h" 8#include "vm/page.h"
@@ -11,8 +12,6 @@ static bool page_table_cmp_less (const struct hash_elem *a, const struct hash_el
11 void *aux UNUSED); 12 void *aux UNUSED);
12static void page_table_entry_free (struct hash_elem *e, void *aux UNUSED); 13static void page_table_entry_free (struct hash_elem *e, void *aux UNUSED);
13static bool page_table_insert (struct hash *ht, struct page_table_entry *pte); 14static bool page_table_insert (struct hash *ht, struct page_table_entry *pte);
14static bool page_load_segment (struct page_table_entry *pte);
15static bool page_load_mmf (struct page_table_entry *pte);
16 15
17/* initialize page table structure */ 16/* initialize page table structure */
18void 17void
@@ -69,23 +68,20 @@ page_table_insert (struct hash *ht, struct page_table_entry *pte)
69/* inserts a new entry of type segment into the page table 68/* inserts a new entry of type segment into the page table
70 returns false if entry is invalid or already in the table */ 69 returns false if entry is invalid or already in the table */
71bool 70bool
72page_table_insert_segment (struct file *file, off_t ofs, uint8_t *upage, 71page_table_insert_segment (struct hash *ht, struct file *file, off_t ofs,
73 uint32_t read_bytes, uint32_t zero_bytes, bool writable) 72 uint8_t *upage, uint32_t read_bytes, bool writable)
74{ 73{
75 struct page_table_entry *pte = malloc (sizeof *pte); 74 struct page_table_entry *pte = malloc (sizeof *pte);
76 if (pte == NULL) 75 if (pte == NULL)
77 return false; 76 return false;
78 77
79 pte->upage = upage; 78 pte->upage = upage;
80 pte->type = PAGE_SEGMENT;
81 pte->loaded = false; 79 pte->loaded = false;
82 pte->segment.file = file; 80 pte->segment.file = file;
83 pte->segment.ofs = ofs; 81 pte->segment.ofs = ofs;
84 pte->segment.read_bytes = read_bytes; 82 pte->segment.read_bytes = read_bytes;
85 pte->segment.zero_bytes = zero_bytes;
86 pte->segment.writable = writable; 83 pte->segment.writable = writable;
87 84 return page_table_insert (ht, pte);
88 return page_table_insert (&thread_current ()->page_table, pte);
89} 85}
90 86
91/* fetch an entry from the page table. returns NULL if not found */ 87/* fetch an entry from the page table. returns NULL if not found */
@@ -105,28 +101,11 @@ page_table_fetch (struct hash *ht, void *upage)
105bool 101bool
106page_load (struct page_table_entry *pte) 102page_load (struct page_table_entry *pte)
107{ 103{
104 struct segment *data;
108 if (pte->loaded) 105 if (pte->loaded)
109 return true; 106 return true;
110 107
111 switch (pte->type) 108 data = &pte->segment;
112 {
113 case PAGE_SEGMENT:
114 return page_load_segment (pte);
115 case PAGE_MEMORY_MAPPED_FILE:
116 return page_load_mmf (pte);
117 default:
118 ASSERT (false);
119 break;
120 }
121 return false;
122}
123
124/* load the segment data page */
125static bool
126page_load_segment (struct page_table_entry *pte)
127{
128 struct segment *data = &pte->segment;
129
130 file_seek (data->file, data->ofs); 109 file_seek (data->file, data->ofs);
131 110
132 /* Get a page of memory. */ 111 /* Get a page of memory. */
@@ -141,7 +120,7 @@ page_load_segment (struct page_table_entry *pte)
141 palloc_free_page (kpage); 120 palloc_free_page (kpage);
142 return false; 121 return false;
143 } 122 }
144 memset (kpage + data->read_bytes, 0, data->zero_bytes); 123 memset (kpage + data->read_bytes, 0, PGSIZE - data->read_bytes);
145 124
146 /* Add the page to the process's address space. */ 125 /* Add the page to the process's address space. */
147 if (!process_install_page (pte->upage, kpage, data->writable)) 126 if (!process_install_page (pte->upage, kpage, data->writable))
@@ -153,11 +132,3 @@ page_load_segment (struct page_table_entry *pte)
153 pte->loaded = true; 132 pte->loaded = true;
154 return true; 133 return true;
155} 134}
156
157/* load the memory mappged file page */
158static bool
159page_load_mmf (struct page_table_entry *pte)
160{
161 //TODO: implement
162 return false;
163}