diff --git a/src/lib.rs b/src/lib.rs
index d47c3533..93f26c69 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -34,9 +34,11 @@ pub extern fn rust_main(multiboot_address: usize) {
use vga_buffer::{Writer, Color};
vga_buffer::clear_screen();
- let multiboot = unsafe{multiboot2::load(multiboot_address)};
- memory::init(multiboot);
-
+ if let Some(multiboot) = unsafe{multiboot2::load(multiboot_address)} {
+ memory::init(multiboot);
+ } else {
+ println!("MULTIBOOT INOFORMATION STRUCTURE INVALID");
+ }
let mut writer = Writer::new(Color::Blue, Color::LightGreen);
writer.write_byte(b'H');
diff --git a/src/memory/mod.rs b/src/memory/mod.rs
index 072d481f..0684880a 100644
--- a/src/memory/mod.rs
+++ b/src/memory/mod.rs
@@ -14,8 +14,6 @@ pub fn init(multiboot: &Multiboot) {
let mut c = unsafe{paging::Controller::new(allocator)};
c.begin_new_table();
- c.identity_map(Page{number: 0xb8}, true, false);
-
for section in multiboot.elf_tag().unwrap().sections() {
let in_memory = section.flags & 0x2 != 0;
@@ -32,7 +30,25 @@ pub fn init(multiboot: &Multiboot) {
c.identity_map(page, writable, executable);
}
}
+
+ // identity map VGA text buffer
+ c.identity_map(Page{number: 0xb8}, true, false);
+
+ // identity map Multiboot structure
+ let multiboot_address = multiboot as *const _ as usize;
+ let start_page = Page::containing_address(multiboot_address);
+ let end_page = Page::containing_address(multiboot_address + multiboot.total_size as usize);
+ for page in range_inclusive(start_page.number, end_page.number).map(|n| Page{number: n}) {
+ c.identity_map(page, false, false);
+ }
+
c.activate_new_table();
+
+ let maximal_memory = multiboot.memory_area_tag().unwrap().areas().map(
+ |area| area.base_addr + area.length).max().unwrap();
+ println!("maximal_memory: 0x{:x}", maximal_memory);
+
+ let core_map = allocator.allocate_frames((maximal_memory / paging::PAGE_SIZE) as usize);
}
struct VirtualAddress(*const u8);
@@ -50,8 +66,12 @@ impl FrameAllocator {
}
fn allocate_frame(&mut self) -> Option {
+ self.allocate_frames(1)
+ }
+
+ fn allocate_frames(&mut self, number: usize) -> Option {
let page_number = self.next_free_frame;
- self.next_free_frame += 1;
+ self.next_free_frame += number;
Some(Frame {
number: page_number
})