diff --git a/kernel-rs/src/arch/x86/boot.asm b/kernel-rs/src/arch/x86/boot.asm index 170d2591..72d057d8 100644 --- a/kernel-rs/src/arch/x86/boot.asm +++ b/kernel-rs/src/arch/x86/boot.asm @@ -11,7 +11,6 @@ start: push ebx call check_multiboot - call set_up_page_tables ; load the new gdt @@ -36,6 +35,10 @@ set_up_page_tables: mov eax, 0b10000011 ; huge + present + writable mov [p2_table], eax ; map first entry + mov eax, 0b10000011 ; huge + present + writable + or eax, 0x400000 ; 4MB + mov [p2_table + 4], eax ; map second entry + mov eax, p2_table mov cr3, eax ret @@ -55,7 +58,7 @@ align 4096 p2_table: resb 4096 stack_bottom: - resb 4096 * 4 + resb 4096 * 3 stack_top: section .gdt diff --git a/kernel-rs/src/arch/x86/idt.rs b/kernel-rs/src/arch/x86/idt.rs index 2b645697..4a511522 100644 --- a/kernel-rs/src/arch/x86/idt.rs +++ b/kernel-rs/src/arch/x86/idt.rs @@ -53,5 +53,6 @@ pub fn init() { // .expect("could not allocate double fault stack"); // println!("DF stack: {:#?}", double_fault_stack); // flush!(); + IDT.load(); } diff --git a/kernel-rs/src/arch/x86/interrupt/exception.rs b/kernel-rs/src/arch/x86/interrupt/exception.rs index fa1682dc..06c6cdf4 100644 --- a/kernel-rs/src/arch/x86/interrupt/exception.rs +++ b/kernel-rs/src/arch/x86/interrupt/exception.rs @@ -69,6 +69,9 @@ pub extern "x86-interrupt" fn page_fault( println!("Error code: {:?}", code); println!("{:#?}", stack_frame); flush!(); + unsafe { + asm!("hlt"); + } } exception!(x87_fpu, {}); diff --git a/kernel-rs/src/arch/x86/linker.ld b/kernel-rs/src/arch/x86/linker.ld index d02b7510..2dc25860 100644 --- a/kernel-rs/src/arch/x86/linker.ld +++ b/kernel-rs/src/arch/x86/linker.ld @@ -43,12 +43,6 @@ SECTIONS { . = ALIGN(4K); } - .bss : - { - *(.bss .bss.*) - . = ALIGN(4K); - } - .gdt : { *(.gdt) @@ -66,4 +60,10 @@ SECTIONS { *(.got.plt) . = ALIGN(4K); } + + .bss : + { + *(.bss .bss.*) + . = ALIGN(4K); + } } diff --git a/kernel-rs/src/arch/x86/mod.rs b/kernel-rs/src/arch/x86/mod.rs index 6fb594eb..8cee6b38 100644 --- a/kernel-rs/src/arch/x86/mod.rs +++ b/kernel-rs/src/arch/x86/mod.rs @@ -17,6 +17,10 @@ pub unsafe extern "C" fn x86_rust_start(multiboot_info_addr: usize) { // parse multiboot2 info let boot_info = multiboot2::load(multiboot_info_addr); + // println!("{:?}", boot_info); + // flush!(); + // asm!("hlt"); + // ACPI must be intialized BEFORE paging is active if let Some(rsdp) = boot_info.rsdp_v2_tag() { acpi::load(rsdp).expect("ACPI failed"); @@ -26,15 +30,28 @@ pub unsafe extern "C" fn x86_rust_start(multiboot_info_addr: usize) { acpi::init().expect("ACPI failed"); } - // fill and load idt (exceptions + irqs) - idt::init(); - // set up physical allocator ::memory::init(&boot_info); - // set up virtual mapping + // let memory_map_tag = boot_info.memory_map_tag().expect("Memory map tag required"); + // println!("memory areas:"); + // for area in memory_map_tag.memory_areas() { + // println!( + // " start: {:#x}, end: {:#x} length: {:#x}", + // area.start_address(), + // area.end_address(), + // area.size() + // ); + // } + // flush!(); + // asm!("hlt"); + + // set up virtual addressing (paging) let mut active_table = paging::init(&boot_info); + // fill and load idt (exceptions + irqs) + idt::init(); + // set up heap ::allocator::init(&mut active_table); diff --git a/kernel-rs/src/arch/x86/paging/mapper.rs b/kernel-rs/src/arch/x86/paging/mapper.rs index 56ba3517..c3d8115d 100644 --- a/kernel-rs/src/arch/x86/paging/mapper.rs +++ b/kernel-rs/src/arch/x86/paging/mapper.rs @@ -11,7 +11,7 @@ use super::table::RecTable; pub const P2: *mut PageTable = 0xffff_f000 as *mut _; pub struct Mapper { - p2: Unique, + pub p2: Unique, } impl Mapper { diff --git a/kernel-rs/src/arch/x86/paging/mod.rs b/kernel-rs/src/arch/x86/paging/mod.rs index 698d2cf9..58fac763 100644 --- a/kernel-rs/src/arch/x86/paging/mod.rs +++ b/kernel-rs/src/arch/x86/paging/mod.rs @@ -101,6 +101,12 @@ impl InactivePageTable { temporary_page: &mut TemporaryPage, ) -> InactivePageTable { { + println!("mapping temp page:"); + println!("frame: {:?}", frame); + flush!(); + // unsafe { + // asm!("hlt"); + // } let table = temporary_page.map_table_frame(frame.clone(), active_table); table.zero(); diff --git a/kernel-rs/src/console.rs b/kernel-rs/src/console.rs index 0e1eff02..7b24dc20 100644 --- a/kernel-rs/src/console.rs +++ b/kernel-rs/src/console.rs @@ -117,7 +117,7 @@ fn print_line(line: &[u8], address: usize) { } /// Print the kernel stack -fn print_stack() -> Result<(), &'static str> { +pub fn print_stack() -> Result<(), &'static str> { let esp: usize; let ebp: usize; unsafe { asm!("" : "={esp}"(esp), "={ebp}"(ebp):::) }; diff --git a/kernel-rs/src/lib.rs b/kernel-rs/src/lib.rs index 9d542d82..020db3d2 100644 --- a/kernel-rs/src/lib.rs +++ b/kernel-rs/src/lib.rs @@ -81,7 +81,7 @@ pub extern "C" fn panic_fmt(fmt: core::fmt::Arguments, file: &'static str, line: loop {} } -pub const HEAP_START: usize = (1 << 22); //first entry of p2 +pub const HEAP_START: usize = (2 << 22); //third entry of p2 pub const HEAP_SIZE: usize = 10 * 4096 * 8; //~ 100 KiB #[global_allocator] diff --git a/kernel-rs/src/memory/bump.rs b/kernel-rs/src/memory/bump.rs index 4e62a672..fce35247 100644 --- a/kernel-rs/src/memory/bump.rs +++ b/kernel-rs/src/memory/bump.rs @@ -58,6 +58,12 @@ impl FrameAllocator for BumpFrameAllocator { if count == 0 { return None; }; + // println!("allocate {}", count); + // println!("kstart {:?}", self.kernel_start); + // println!("kend {:?}", self.kernel_end); + // println!("multiboot start {:?}", self.multiboot_start); + // println!("multiboot end {:?}", self.multiboot_end); + // flush!(); if let Some(area) = self.current_area { let start_frame = PhysFrame { number: self.next_free_frame.number, @@ -68,6 +74,7 @@ impl FrameAllocator for BumpFrameAllocator { let current_area_last_frame = PhysFrame::containing_address(PhysAddr::new(area.end_address() as u32)); + if end_frame > current_area_last_frame { // all frames are taken in this area self.choose_next_area(); diff --git a/kernel-rs/src/memory/mod.rs b/kernel-rs/src/memory/mod.rs index 7d9de270..5bcadcdd 100644 --- a/kernel-rs/src/memory/mod.rs +++ b/kernel-rs/src/memory/mod.rs @@ -46,6 +46,20 @@ pub fn init(boot_info: &multiboot2::BootInformation) { memory_map_tag.memory_areas(), ); + println!("memory areas from the f allocator:"); + for area in memory_map_tag.memory_areas() { + println!( + " start: {:#x}, end: {:#x} length: {:#x}", + area.start_address(), + area.end_address(), + area.size() + ); + } + flush!(); + // unsafe { + // asm!("hlt"); + // } + let frame_allocator = RecycleAllocator::new(bump_allocator); // let stack_allocator = { diff --git a/kernel-rs/x86 b/kernel-rs/x86 index b61535ec..ae98bfcd 160000 --- a/kernel-rs/x86 +++ b/kernel-rs/x86 @@ -1 +1 @@ -Subproject commit b61535ecda89a6588a2c092dfa3bfbcc7f841575 +Subproject commit ae98bfcd4f30217a4bfe944549d222bb07f81deb