a working vmm
This commit is contained in:
12
.vscode/launch.json
vendored
12
.vscode/launch.json
vendored
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
110
src/mem/vmm.rs
110
src/mem/vmm.rs
@@ -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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user