wip
This commit is contained in:
@@ -13,7 +13,7 @@ pub const HEAP_START: usize = 0x4444_4444_0000;
|
|||||||
pub const HEAP_SIZE: usize = 128 * 1024;
|
pub const HEAP_SIZE: usize = 128 * 1024;
|
||||||
|
|
||||||
pub const PAGE_SIZE: usize = 4096;
|
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 FRAME_COUNT: usize = MAX_MEMORY / PAGE_SIZE;
|
||||||
pub const BITS_PER_ENTRY: usize = 8 * core::mem::size_of::<usize>();
|
pub const BITS_PER_ENTRY: usize = 8 * core::mem::size_of::<usize>();
|
||||||
pub const ENTRY_COUNT: usize = FRAME_COUNT / BITS_PER_ENTRY;
|
pub const ENTRY_COUNT: usize = FRAME_COUNT / BITS_PER_ENTRY;
|
||||||
|
|||||||
@@ -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);
|
info!("Usable memory in bitmap: {}MiB", usable_frame * 4 / 1024);
|
||||||
|
|
||||||
let level_4_table = get_active_level_4_table();
|
let lv4_table = paging::init_page_table(&mut bitmap_table);
|
||||||
let mut mapper = unsafe { OffsetPageTable::new(level_4_table, VirtAddr::new(0x0)) };
|
let mut mapper = unsafe { OffsetPageTable::new(lv4_table, VirtAddr::new(0x0)) };
|
||||||
|
|
||||||
allocator::init_heap(&mut mapper, &mut bitmap_table).unwrap();
|
allocator::init_heap(&mut mapper, &mut bitmap_table).unwrap();
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,34 @@
|
|||||||
use x86_64::{
|
use x86_64::{
|
||||||
registers::control::Cr3,
|
registers::control::Cr3,
|
||||||
structures::paging::{
|
structures::paging::{
|
||||||
page_table::FrameError, FrameAllocator, PageTable, PageTableFlags, PhysFrame, Size4KiB,
|
page_table::FrameError, FrameAllocator, PageSize, PageTable, PageTableFlags, PhysFrame,
|
||||||
|
Size1GiB, Size4KiB,
|
||||||
},
|
},
|
||||||
PhysAddr, VirtAddr,
|
PhysAddr, VirtAddr,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn init_page_table(frame_allocator: &mut impl FrameAllocator<Size4KiB>) -> PhysFrame {
|
pub fn init_page_table(frame_allocator: &mut impl FrameAllocator<Size4KiB>) -> &mut PageTable {
|
||||||
let (lv4_frame, lv4_table) = new_page_table(frame_allocator);
|
let (_, lv4_table) = new_page_table(frame_allocator);
|
||||||
let (lv3_frame, lv3_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 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 {
|
unsafe {
|
||||||
let lv4: &mut PageTable = &mut *lv4_table;
|
let lv3: &mut PageTable = &mut *lv3_table;
|
||||||
lv4[0].set_frame(lv3_frame, base_flags);
|
|
||||||
|
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(
|
fn new_page_table(
|
||||||
|
|||||||
Reference in New Issue
Block a user