diff --git a/arch/x86_64/src/linker.ld b/arch/x86_64/src/linker.ld index c5e3a9d..c1ac875 100644 --- a/arch/x86_64/src/linker.ld +++ b/arch/x86_64/src/linker.ld @@ -1,6 +1,7 @@ ENTRY(kstart) OUTPUT_FORMAT(elf64-x86-64) +/* KERNEL_OFFSET = 0xfffffe8000100000; */ KERNEL_OFFSET = 0x100000; SECTIONS { diff --git a/arch/x86_64/src/paging/mod.rs b/arch/x86_64/src/paging/mod.rs index 0c48f7a..5055916 100644 --- a/arch/x86_64/src/paging/mod.rs +++ b/arch/x86_64/src/paging/mod.rs @@ -21,6 +21,9 @@ pub const ENTRY_COUNT: usize = 512; /// Size of pages pub const PAGE_SIZE: usize = 4096; +/// Offset of kernel from physical +pub const KERNEL_OFFSET: usize = 0xfffffe8000000000; + /// Initialize paging pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable { extern { @@ -66,7 +69,10 @@ pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable { let start_frame = Frame::containing_address(PhysicalAddress::new(start)); let end_frame = Frame::containing_address(PhysicalAddress::new(end - 1)); for frame in Frame::range_inclusive(start_frame, end_frame) { - mapper.identity_map(frame, flags); + mapper.identity_map(frame.clone(), flags); + + let page = Page::containing_address(VirtualAddress::new(frame.start_address().get() + KERNEL_OFFSET)); + mapper.map_to(page, frame, flags); } } }; diff --git a/bootloader/x86_64/startup-x86_64.asm b/bootloader/x86_64/startup-x86_64.asm index 95c01e2..f5f9bc6 100644 --- a/bootloader/x86_64/startup-x86_64.asm +++ b/bootloader/x86_64/startup-x86_64.asm @@ -58,8 +58,9 @@ startup_arch: rep stosd xor edi, edi - ;Link first PML4 to PDP + ;Link first PML4 and third to last PML4 to PDP mov DWORD [es:edi], 0x71000 | 1 << 1 | 1 + mov DWORD [es:edi + 509*8], 0x71000 | 1 << 1 | 1 add edi, 0x1000 ;Link last PML4 to PML4 mov DWORD [es:edi - 8], 0x70000 | 1 << 1 | 1