a working vmm

This commit is contained in:
Zoe
2024-08-26 23:13:48 -05:00
parent 224a9783d9
commit f93484bf81
4 changed files with 40 additions and 92 deletions

12
.vscode/launch.json vendored
View File

@@ -4,13 +4,23 @@
{ {
"type": "gdb", "type": "gdb",
"request": "attach", "request": "attach",
"name": "Attach to QEMU", "name": "Build and Attach to QEMU",
"preLaunchTask": "(Debug) Build the kernel and run qemu", "preLaunchTask": "(Debug) Build the kernel and run qemu",
"executable": "${workspaceFolder}/target/x86_64-unknown-none/debug/CappuccinOS.elf", "executable": "${workspaceFolder}/target/x86_64-unknown-none/debug/CappuccinOS.elf",
"target": ":1234", "target": ":1234",
"remote": true, "remote": true,
"cwd": "${workspaceRoot}", "cwd": "${workspaceRoot}",
// "gdbpath": "${workspaceRoot}/target/x86_64-unknown-none/debug/CappuccinOS.elf" // "gdbpath": "${workspaceRoot}/target/x86_64-unknown-none/debug/CappuccinOS.elf"
},
{
"type": "gdb",
"request": "attach",
"name": "Attach to QEMU",
"executable": "${workspaceFolder}/target/x86_64-unknown-none/debug/CappuccinOS.elf",
"target": ":1234",
"remote": true,
"cwd": "${workspaceRoot}",
// "gdbpath": "${workspaceRoot}/target/x86_64-unknown-none/debug/CappuccinOS.elf"
} }
] ]
} }

View File

@@ -46,7 +46,8 @@ impl LinkedListAllocator {
pub fn init(&mut self, pages: usize) { pub fn init(&mut self, pages: usize) {
unsafe { unsafe {
self.add_free_region(pmm_alloc(1).to_higher_half(), PAGE_SIZE * pages); // fucking kill me
self.add_free_region(pmm_alloc(pages).to_higher_half(), PAGE_SIZE * pages);
} }
} }

View File

@@ -278,12 +278,7 @@ pub static ALLOCATOR: Mutex<LinkedListAllocator> = Mutex::new(LinkedListAllocato
// TODO: Limine-rs 0.2.0 does NOT have debug implemented for a lot of it's types, so until that is fixed, either go without Type, or hack limine-rs locally (tracking https://github.com/limine-bootloader/limine-rs/pull/30) // TODO: Limine-rs 0.2.0 does NOT have debug implemented for a lot of it's types, so until that is fixed, either go without Type, or hack limine-rs locally (tracking https://github.com/limine-bootloader/limine-rs/pull/30)
// pub fn log_memory_map() { // pub fn log_memory_map() {
// let memmap_request = unsafe { MEMMAP_REQUEST.get_response_mut() }; // let memmap = get_memmap();
// if memmap_request.is_none() {
// panic!("Memory map was None!");
// }
// let memmap = memmap_request.unwrap().entries();
// crate::log!(LogLevel::Trace, "====== MEMORY MAP ======"); // crate::log!(LogLevel::Trace, "====== MEMORY MAP ======");
// for entry in memmap.iter() { // for entry in memmap.iter() {

View File

@@ -2,12 +2,9 @@ use core::arch::x86_64::__cpuid;
use limine::memory_map::EntryType; use limine::memory_map::EntryType;
use crate::{ use crate::libs::{
hcf, cell::OnceCell,
libs::{ limine::{get_hhdm_offset, get_kernel_address, get_memmap, get_paging_level},
cell::OnceCell,
limine::{get_hhdm_offset, get_kernel_address, get_memmap, get_paging_level},
},
}; };
use super::{align_down, align_up, pmm::pmm_alloc, PhysicalPtr}; use super::{align_down, align_up, pmm::pmm_alloc, PhysicalPtr};
@@ -17,7 +14,7 @@ const PT_FLAG_WRITE: u64 = 1 << 1;
const PT_FLAG_USER: u64 = 1 << 2; const PT_FLAG_USER: u64 = 1 << 2;
const PT_FLAG_LARGE: u64 = 1 << 7; const PT_FLAG_LARGE: u64 = 1 << 7;
const PT_FLAG_NX: u64 = 1 << 63; const PT_FLAG_NX: u64 = 1 << 63;
const PT_PADDR_MASK: u64 = 0x000F_FFFF_FFFF_FFFF; const PT_PADDR_MASK: u64 = 0x0000_FFFF_FFFF_F000;
const PT_TABLE_FLAGS: u64 = PT_FLAG_VALID | PT_FLAG_WRITE | PT_FLAG_USER; const PT_TABLE_FLAGS: u64 = PT_FLAG_VALID | PT_FLAG_WRITE | PT_FLAG_USER;
@@ -137,7 +134,19 @@ pub fn vmm_init() {
unsafe { KENREL_PAGE_DIRECTORY = page_directory as *mut PageDirectory }; unsafe { KENREL_PAGE_DIRECTORY = page_directory as *mut PageDirectory };
let mut i = 0; let mut i = 0_usize;
while i < 0x100000000 {
vmm_map(
page_directory,
i + get_hhdm_offset(),
i,
PT_FLAG_WRITE,
PageSize::Size1GiB,
);
i += 0x40000000;
}
for entry in get_memmap() { for entry in get_memmap() {
if entry.entry_type != EntryType::KERNEL_AND_MODULES { if entry.entry_type != EntryType::KERNEL_AND_MODULES {
continue; continue;
@@ -145,47 +154,24 @@ pub fn vmm_init() {
let kernel_addr = get_kernel_address(); let kernel_addr = get_kernel_address();
let base = kernel_addr.physical_base(); let base = kernel_addr.physical_base() as usize;
let length = entry.length; let length = entry.length as usize;
let top = base + length;
let aligned_base = align_down(base as usize, 0x40000000); crate::println!("{length:X} {base:X} {:X}", entry.base);
let aligned_top = align_up(top as usize, 0x40000000);
let aligned_length = aligned_top - aligned_base;
while i <= aligned_length {
let page = aligned_base + i;
crate::println!(
"Mapping the kernel from {:X} to {:X}",
page,
kernel_addr.virtual_base()
);
i = 0;
while i < length {
vmm_map( vmm_map(
page_directory, page_directory,
page + kernel_addr.virtual_base() as usize, kernel_addr.virtual_base() as usize + i,
page as usize, base + i,
0x02, 0x02,
PageSize::Size1GiB, PageSize::Size4KiB,
); );
i += 0x40000000 i += 0x1000;
} }
} }
while i <= 0x100000000 {
// vmm_map(page_directory, i, i, 0x03, PageSize::Size4KiB);
vmm_map(
page_directory,
i + get_hhdm_offset(),
i,
0x02,
PageSize::Size1GiB,
);
i += 0x40000000;
}
for entry in get_memmap() { for entry in get_memmap() {
if entry.entry_type == EntryType::RESERVED || entry.entry_type == EntryType::BAD_MEMORY { if entry.entry_type == EntryType::RESERVED || entry.entry_type == EntryType::BAD_MEMORY {
continue; continue;
@@ -230,33 +216,6 @@ pub fn vmm_init() {
} }
} }
for entry in get_memmap() {
if entry.entry_type != EntryType::FRAMEBUFFER {
continue;
}
let base = entry.base;
let length = entry.length;
let top = base + length;
let aligned_base = align_down(base as usize, 0x1000);
let aligned_top = align_up(top as usize, 0x1000);
let aligned_length = aligned_top - aligned_base;
while i < aligned_length {
let page = aligned_base + i;
vmm_map(
page_directory,
page + get_hhdm_offset(),
page,
0x02 | 1 << 3,
PageSize::Size4KiB,
);
i += 0x1000;
}
}
unsafe { va_space_switch(page_directory) }; unsafe { va_space_switch(page_directory) };
} }
@@ -382,8 +341,6 @@ fn get_next_level(
let old_page_size = PAGE_SIZES[level]; let old_page_size = PAGE_SIZES[level];
let new_page_size = PAGE_SIZES[desired_size as usize]; let new_page_size = PAGE_SIZES[desired_size as usize];
crate::println!("OLD {old_page_size:X} NEW {new_page_size:X}");
// ((x) & (PT_FLAG_WRITE | PT_FLAG_NX)) // ((x) & (PT_FLAG_WRITE | PT_FLAG_NX))
let old_flags = page_directory.entries[entry].vmm_flags(); let old_flags = page_directory.entries[entry].vmm_flags();
let old_phys = page_directory.entries[entry].addr(); let old_phys = page_directory.entries[entry].addr();
@@ -467,22 +424,7 @@ unsafe fn va_space_switch(page_directory: &mut PageDirectory) {
"Page directory pointer is not aligned" "Page directory pointer is not aligned"
); );
let mut cr3 = 0;
unsafe { core::arch::asm!("mov rax, cr3", out("rax") cr3) };
crate::println!("{cr3:X}");
// hcf();
unsafe { core::arch::asm!("mov cr3, {0:r}", in(reg) pd_ptr) }; unsafe { core::arch::asm!("mov cr3, {0:r}", in(reg) pd_ptr) };
// test(pd_ptr);
crate::println!("waa"); crate::println!("waa");
} }
#[naked]
pub extern "C" fn test(ptr: *mut u8) {
unsafe {
core::arch::asm!("mov cr3, rdi", "ret", options(noreturn));
}
}