diff --git a/nel_os_kernel/src/constant.rs b/nel_os_kernel/src/constant.rs index 33676d6..2274b5a 100644 --- a/nel_os_kernel/src/constant.rs +++ b/nel_os_kernel/src/constant.rs @@ -13,7 +13,7 @@ pub const HEAP_START: usize = 0x4444_4444_0000; pub const HEAP_SIZE: usize = 128 * 1024; pub const PAGE_SIZE: usize = 4096; -pub const MAX_MEMORY: usize = 1024 * 1024 * 1024 * 1024; // 1 TiB +pub const MAX_MEMORY: usize = 256 * 1024 * 1024 * 1024; pub const FRAME_COUNT: usize = MAX_MEMORY / PAGE_SIZE; pub const BITS_PER_ENTRY: usize = 8 * core::mem::size_of::(); pub const ENTRY_COUNT: usize = FRAME_COUNT / BITS_PER_ENTRY; diff --git a/nel_os_kernel/src/main.rs b/nel_os_kernel/src/main.rs index 321f513..b6035ca 100644 --- a/nel_os_kernel/src/main.rs +++ b/nel_os_kernel/src/main.rs @@ -97,8 +97,8 @@ pub extern "sysv64" fn main(usable_memory: &nel_os_common::memory::UsableMemory) info!("Usable memory in bitmap: {}MiB", usable_frame * 4 / 1024); - let level_4_table = get_active_level_4_table(); - let mut mapper = unsafe { OffsetPageTable::new(level_4_table, VirtAddr::new(0x0)) }; + let lv4_table = paging::init_page_table(&mut bitmap_table); + let mut mapper = unsafe { OffsetPageTable::new(lv4_table, VirtAddr::new(0x0)) }; allocator::init_heap(&mut mapper, &mut bitmap_table).unwrap(); diff --git a/nel_os_kernel/src/paging.rs b/nel_os_kernel/src/paging.rs index d3be942..6b5cb90 100644 --- a/nel_os_kernel/src/paging.rs +++ b/nel_os_kernel/src/paging.rs @@ -1,23 +1,34 @@ use x86_64::{ registers::control::Cr3, structures::paging::{ - page_table::FrameError, FrameAllocator, PageTable, PageTableFlags, PhysFrame, Size4KiB, + page_table::FrameError, FrameAllocator, PageSize, PageTable, PageTableFlags, PhysFrame, + Size1GiB, Size4KiB, }, PhysAddr, VirtAddr, }; -pub fn init_page_table(frame_allocator: &mut impl FrameAllocator) -> PhysFrame { - let (lv4_frame, lv4_table) = new_page_table(frame_allocator); +pub fn init_page_table(frame_allocator: &mut impl FrameAllocator) -> &mut PageTable { + let (_, lv4_table) = new_page_table(frame_allocator); let (lv3_frame, lv3_table) = new_page_table(frame_allocator); let base_flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::GLOBAL; + let lv4: &mut PageTable = unsafe { &mut *lv4_table }; + + lv4[0].set_frame(lv3_frame, base_flags); + unsafe { - let lv4: &mut PageTable = &mut *lv4_table; - lv4[0].set_frame(lv3_frame, base_flags); + let lv3: &mut PageTable = &mut *lv3_table; + + for (index, lv3_pte) in lv3.iter_mut().enumerate() { + lv3_pte.set_addr( + PhysAddr::new(index as u64 * Size1GiB::SIZE), + base_flags | PageTableFlags::HUGE_PAGE, + ); + } } - lv4_frame + lv4 } fn new_page_table(