From e11b2ef0c606ab516a4344aeea1dbba22cb1fe5d Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 21 Jun 2012 16:47:23 +0200 Subject: initial implementation of memory mapped files --- vm/page.c | 43 +++++++------------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) (limited to 'vm/page.c') 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 @@ #include "filesys/file.h" #include "userprog/process.h" #include "threads/thread.h" +#include "threads/vaddr.h" #include "threads/malloc.h" #include "threads/palloc.h" #include "vm/page.h" @@ -11,8 +12,6 @@ static bool page_table_cmp_less (const struct hash_elem *a, const struct hash_el void *aux UNUSED); static void page_table_entry_free (struct hash_elem *e, void *aux UNUSED); static bool page_table_insert (struct hash *ht, struct page_table_entry *pte); -static bool page_load_segment (struct page_table_entry *pte); -static bool page_load_mmf (struct page_table_entry *pte); /* initialize page table structure */ void @@ -69,23 +68,20 @@ page_table_insert (struct hash *ht, struct page_table_entry *pte) /* inserts a new entry of type segment into the page table returns false if entry is invalid or already in the table */ bool -page_table_insert_segment (struct file *file, off_t ofs, uint8_t *upage, - uint32_t read_bytes, uint32_t zero_bytes, bool writable) +page_table_insert_segment (struct hash *ht, struct file *file, off_t ofs, + uint8_t *upage, uint32_t read_bytes, bool writable) { struct page_table_entry *pte = malloc (sizeof *pte); if (pte == NULL) return false; pte->upage = upage; - pte->type = PAGE_SEGMENT; pte->loaded = false; pte->segment.file = file; pte->segment.ofs = ofs; pte->segment.read_bytes = read_bytes; - pte->segment.zero_bytes = zero_bytes; pte->segment.writable = writable; - - return page_table_insert (&thread_current ()->page_table, pte); + return page_table_insert (ht, pte); } /* fetch an entry from the page table. returns NULL if not found */ @@ -105,28 +101,11 @@ page_table_fetch (struct hash *ht, void *upage) bool page_load (struct page_table_entry *pte) { + struct segment *data; if (pte->loaded) return true; - switch (pte->type) - { - case PAGE_SEGMENT: - return page_load_segment (pte); - case PAGE_MEMORY_MAPPED_FILE: - return page_load_mmf (pte); - default: - ASSERT (false); - break; - } - return false; -} - -/* load the segment data page */ -static bool -page_load_segment (struct page_table_entry *pte) -{ - struct segment *data = &pte->segment; - + data = &pte->segment; file_seek (data->file, data->ofs); /* Get a page of memory. */ @@ -141,7 +120,7 @@ page_load_segment (struct page_table_entry *pte) palloc_free_page (kpage); return false; } - memset (kpage + data->read_bytes, 0, data->zero_bytes); + memset (kpage + data->read_bytes, 0, PGSIZE - data->read_bytes); /* Add the page to the process's address space. */ if (!process_install_page (pte->upage, kpage, data->writable)) @@ -153,11 +132,3 @@ page_load_segment (struct page_table_entry *pte) pte->loaded = true; return true; } - -/* load the memory mappged file page */ -static bool -page_load_mmf (struct page_table_entry *pte) -{ - //TODO: implement - return false; -} -- cgit v1.2.3