diff --git a/src/memory/mod.rs b/src/memory/mod.rs index beb1307..53c9a2f 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -3,6 +3,7 @@ mod pagetable; mod page; use crate::multiboot::MultibootTagMmap; +use pagetable::flags::*; static PAGE_SIZE: usize = 4096; @@ -34,7 +35,7 @@ pub fn init(mmap: *const MultibootTagMmap, mmap_size: usize) alloc.read_grub_mmap(mmap, mmap_size); let page_directory_addr = alloc.request_free_page(true); - let mut pt_manager = pagetable::Manager::new(page_directory_addr); + let mut pt_manager = pagetable::Manager::new(page_directory_addr, PDE_RW); id_map(&mut pt_manager); alloc.print_memusage(1); @@ -46,7 +47,7 @@ pub fn init(mmap: *const MultibootTagMmap, mmap_size: usize) } let page = alloc.request_free_page(false); crate::logln!("requested page userspace: {:#0X}", page); - pt_manager.memory_map(0x150000, page, 3); + pt_manager.memory_map(0x150000, page); } fn id_map(pt_manager: &mut pagetable::Manager) @@ -57,7 +58,7 @@ fn id_map(pt_manager: &mut pagetable::Manager) for i in 0..memory_start / PAGE_SIZE { - pt_manager.memory_map(i * PAGE_SIZE, i * PAGE_SIZE, 3); + pt_manager.memory_map(i * PAGE_SIZE, i * PAGE_SIZE); alloc.lock_page(i); } } diff --git a/src/memory/pagetable.rs b/src/memory/pagetable.rs index fb579a8..75bf404 100644 --- a/src/memory/pagetable.rs +++ b/src/memory/pagetable.rs @@ -30,12 +30,13 @@ pub mod flags pub struct Manager { pub page_directory: &'static mut [page::DirectoryEntry], - paging_enabled: bool + paging_enabled: bool, + flags: usize, } impl Manager { - pub fn new(addr: usize) -> Manager + pub fn new(addr: usize, flags: usize) -> Manager { unsafe { @@ -43,7 +44,8 @@ impl Manager let manager = Manager { page_directory: core::slice::from_raw_parts_mut(addr as *mut page::DirectoryEntry, 1024), - paging_enabled: false + paging_enabled: false, + flags: flags, }; manager.page_directory[1023].set_addr(addr as u32); manager.page_directory[1023].set_rw(true); @@ -63,7 +65,7 @@ impl Manager self.page_directory = core::slice::from_raw_parts_mut(0xffff_f000 as *mut page::DirectoryEntry, 1024) } - fn create_page_directory_entry(&mut self, index: usize, flags: usize) + fn create_page_directory_entry(&mut self, index: usize) { let page_directory_entry = &mut self.page_directory[index]; @@ -72,7 +74,7 @@ impl Manager let alloc = pageframe::Allocator::shared(); page_directory_entry.reset(); page_directory_entry.set_addr(alloc.request_free_page(true) as u32); - page_directory_entry.value |= flags as u32 & 0xFFF; + page_directory_entry.value |= self.flags as u32 & 0xFFF; page_directory_entry.set_present(true); unsafe { @@ -81,7 +83,7 @@ impl Manager } } - fn create_page_table_entry(&mut self, page_directory_index: usize, page_table_index: usize, physical_address: usize, flags: usize) + fn create_page_table_entry(&mut self, page_directory_index: usize, page_table_index: usize, physical_address: usize) { let page_table = unsafe { @@ -92,16 +94,16 @@ impl Manager { page_table_entry.reset(); page_table_entry.set_addr(physical_address as u32); - page_table_entry.value |= flags as u32 & 0xFFF; + page_table_entry.value |= self.flags as u32 & 0xFFF; page_table_entry.set_present(true); } } - pub fn memory_map(&mut self, v_addr: usize, phys_addr: usize, flags: usize) + pub fn memory_map(&mut self, v_addr: usize, phys_addr: usize) { let (pdi, pti): (usize, usize) = page_map_indexer(v_addr); - self.create_page_directory_entry(pdi, flags); - self.create_page_table_entry(pdi, pti, phys_addr, flags); + self.create_page_directory_entry(pdi); + self.create_page_table_entry(pdi, pti, phys_addr); } fn address(&self, page_directory_index: usize) -> u32