This commit is contained in:
mii443
2025-07-02 23:39:08 +09:00
parent 8665ada832
commit 6c4d79ef2e
3 changed files with 20 additions and 9 deletions

View File

@@ -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::<usize>();
pub const ENTRY_COUNT: usize = FRAME_COUNT / BITS_PER_ENTRY;

View File

@@ -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();

View File

@@ -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<Size4KiB>) -> PhysFrame {
let (lv4_frame, lv4_table) = new_page_table(frame_allocator);
pub fn init_page_table(frame_allocator: &mut impl FrameAllocator<Size4KiB>) -> &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;
unsafe {
let lv4: &mut PageTable = &mut *lv4_table;
let lv4: &mut PageTable = unsafe { &mut *lv4_table };
lv4[0].set_frame(lv3_frame, base_flags);
unsafe {
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(