diff --git a/src/ferramenta.rs b/src/ferramenta.rs index 031ef4d..bab46f9 100644 --- a/src/ferramenta.rs +++ b/src/ferramenta.rs @@ -244,3 +244,8 @@ pub fn align(val: usize, bound: usize) -> usize { val + bound - 1 & !(bound - 1) } + +pub fn in_range(input: usize, start: usize, range: usize) -> bool +{ + input >= start && input < start + range +} \ No newline at end of file diff --git a/src/memory/mod.rs b/src/memory/mod.rs index e874e1a..056798b 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -33,7 +33,7 @@ pub fn init(mmap: *const MultibootTagMmap, mmap_size: usize) let alloc: &mut pageframe::Allocator = pageframe::Allocator::shared(); alloc.read_grub_mmap(mmap, mmap_size); - let page_directory_addr = alloc.request_free_page(); + let page_directory_addr = alloc.request_free_page(true); let mut pt_manager = pagetable::Manager::new(page_directory_addr); id_map(&mut pt_manager); @@ -44,8 +44,8 @@ pub fn init(mmap: *const MultibootTagMmap, mmap_size: usize) enable_paging(); pt_manager.enable_paging(); } - let page = alloc.request_free_page(); - crate::logln!("requested page: {:#0X}", page); + let page = alloc.request_free_page(false); + crate::logln!("requested page userspace: {:#0X}", page); pt_manager.memory_map(0x150000, page); } diff --git a/src/memory/pageframe.rs b/src/memory/pageframe.rs index 92a4f5c..a4e371d 100644 --- a/src/memory/pageframe.rs +++ b/src/memory/pageframe.rs @@ -12,6 +12,9 @@ extern "C" static _kernel_end: c_void; } +const KERNEL_SPACE_START: usize = 0x0000_0000; +const KERNEL_SPACE_RANGE: usize = 0x0000_2000; + pub struct Allocator { pub free_mem: usize, @@ -85,10 +88,14 @@ impl Allocator self.reserve_mem(page_index!(kernel_end), page_index!(self.bitmap.size / 8)); } - pub fn request_free_page(&mut self) -> usize + pub fn request_free_page(&mut self, kernel_space: bool) -> usize { for i in 0..self.bitmap.size { + if !kernel_space && ferramenta::in_range(i, KERNEL_SPACE_START, KERNEL_SPACE_RANGE) + { + continue; + } if self.bitmap.get(i) == false { crate::logln!("locking page {}", i); diff --git a/src/memory/pagetable.rs b/src/memory/pagetable.rs index 18f69f5..f2a3220 100644 --- a/src/memory/pagetable.rs +++ b/src/memory/pagetable.rs @@ -49,7 +49,7 @@ impl Manager { let alloc = pageframe::Allocator::shared(); page_directory_entry.reset(); - page_directory_entry.set_addr(alloc.request_free_page() as u32); + page_directory_entry.set_addr(alloc.request_free_page(true) as u32); page_directory_entry.set_rw(true); page_directory_entry.set_present(true); unsafe