diff --git a/kernel-rs/src/arch/x86/boot.asm b/kernel-rs/src/arch/x86/boot.asm index 8355baf6..9737350d 100644 --- a/kernel-rs/src/arch/x86/boot.asm +++ b/kernel-rs/src/arch/x86/boot.asm @@ -25,6 +25,8 @@ check_multiboot: mov al, "0" jmp error +; minimal page tables (first 8MB identity mapped) +; core page tables will be loaded in rust set_up_page_tables: ; map P2 table recursively mov eax, p2_table @@ -32,12 +34,13 @@ set_up_page_tables: mov [p2_table + 1023 * 4], eax ; identity map first P2 entry to a huge page - mov eax, 0b10000011 ; huge + present + writable - mov [p2_table], eax ; map first entry + mov eax, 0x0 ; 0MB -> 4MB (first page) + or eax, 0b10000011 ; huge + present + writable + mov [p2_table], eax - mov eax, 0b10000011 ; huge + present + writable - or eax, 0x400000 ; 4MB - mov [p2_table + 4], eax ; map second entry + mov eax, 0x400000 ; 4MB -> 8Mb (second page) + or eax, 0b10000011 ; huge + present + writable + mov [p2_table + 4], eax mov eax, p2_table mov cr3, eax @@ -61,6 +64,8 @@ stack_bottom: resb 4096 * 4 stack_top: +; minimal boot gdt (cs & ds) +; core gdt will be loaded in rust section .gdt GDTR: ; http://tuttlem.github.io/2014/07/11/a-gdt-primer.html diff --git a/kernel-rs/src/arch/x86/gdt.rs b/kernel-rs/src/arch/x86/gdt.rs index 8d720bf9..974c8a9b 100644 --- a/kernel-rs/src/arch/x86/gdt.rs +++ b/kernel-rs/src/arch/x86/gdt.rs @@ -21,18 +21,17 @@ pub fn init() { let mut gdt = gdt::Gdt::new(); code_selector = gdt.add_entry(gdt::Descriptor::kernel_code_segment()); tss_selector = gdt.add_entry(gdt::Descriptor::tss_segment(&tss)); - println!("cs: {:?}", code_selector); gdt }); - println!("0 upper: {:#x}", gdt.table[0] as u32); - println!("0 lower: {:#x}", gdt.table[0] >> 32 as u32); - println!("1 upper: {:#x}", gdt.table[1] as u32); - println!("1 lower: {:#x}", gdt.table[1] >> 32 as u32); - println!("2 upper: {:#x}", gdt.table[2] as u32); - println!("2 lower: {:#x}", gdt.table[2] >> 32 as u32); - println!("3 upper: {:#x}", gdt.table[3] as u32); - println!("3 lower: {:#x}", gdt.table[3] >> 32 as u32); + println!("gdt 0 upper: {:#x}", gdt.table[0] as u32); + println!("gdt 0 lower: {:#x}", gdt.table[0] >> 32 as u32); + println!("gdt 1 upper: {:#x}", gdt.table[1] as u32); + println!("gdt 1 lower: {:#x}", gdt.table[1] >> 32 as u32); + println!("gdt 2 upper: {:#x}", gdt.table[2] as u32); + println!("gdt 2 lower: {:#x}", gdt.table[2] >> 32 as u32); + println!("gdt 3 upper: {:#x}", gdt.table[3] as u32); + println!("gdt 3 lower: {:#x}", gdt.table[3] >> 32 as u32); flush!(); gdt.load(); diff --git a/kernel-rs/src/arch/x86/start.asm b/kernel-rs/src/arch/x86/start.asm index 45ec32c2..ea3fe179 100644 --- a/kernel-rs/src/arch/x86/start.asm +++ b/kernel-rs/src/arch/x86/start.asm @@ -12,8 +12,6 @@ x86_start: mov gs, ax call x86_rust_start - - cli ; clear interrupt HALT: hlt jmp HALT