page table something idk i'm tired

This commit is contained in:
fekhesk 2022-10-26 16:31:33 -07:00
parent 3bb18ee8f7
commit 1d810657ff
No known key found for this signature in database
GPG key ID: 6B3D8CB511646891
6 changed files with 62 additions and 27 deletions

View file

@ -22,7 +22,7 @@ clean:
run: $(final) $(iso)
@qemu-system-$(arch) -bios $(efi_bios) -cdrom $(iso) \
-chardev stdio,id=char0,mux=on,logfile=serial.log,signal=off \
-serial chardev:char0 -mon chardev=char0
-serial chardev:char0 -mon chardev=char0 -m 512M
quick_invalidate:
@echo "quick invalidation"

View file

@ -11,6 +11,16 @@ SECTIONS {
.text :
{
*(.text)
*(.text .text.*)
}
.rodata :
{
*(.rodata .rodata.*)
}
.data.rel.ro :
{
*(.data.rel.ro.local*) *(.data.rel.ro .data.rel.ro.*)
}
}

View file

@ -6,19 +6,11 @@ BdsDxe: starting Boot0001 "UEFI QEMU DVD-ROM QM00003 " from PciRoot(0x0)/Pci(0x1
WARNING: no console will be available to OS
error: no suitable video mode found.
hello from wukkOS!
using serial port 0 as console
welcome to wukkOS!
(c) 2022 Real Microsoft, LLC
initialising memory maps...[OK]
memory map:
0 - a0000 : available
100000 - 800000 : available
800000 - 808000 : reserved for hibernation
808000 - 80b000 : available
80b000 - 80c000 : reserved for hibernation
80c000 - 810000 : available
810000 - 900000 : reserved for hibernation
900000 - 78ef000 : available
78ef000 - 79ef000 : reserved
L4 entry 0: PageTableEntry { addr: PhysAddr(0x128000), flags: PRESENT | WRITABLE | ACCESSED }

View file

@ -5,17 +5,31 @@ use crate::KernelArgs;
use multiboot2::{load, MemoryMapTag, BootInformation};
pub struct KernelInfo {
kernel_start: u64,
kernel_end: u64,
safe_mem_start: u64,
#[cfg(feature = "f_multiboot2")]
boot_info: BootInformation,
}
impl KernelInfo {
pub fn init_from_kernel_args(args: KernelArgs) -> Self {
let mut kernel_info = KernelInfo {
#[cfg(feature = "f_multiboot2")]
boot_info: unsafe { load(args.multiboot_information_address).expect("ERR ARGS BAD!") },
};
kernel_info
#[cfg(feature = "f_multiboot2")]
{
let boot_info = unsafe { load(args.multiboot_information_address) }.expect("failed to load multiboot2 information");
let elf_sections = boot_info.elf_sections_tag().expect("no elf sections tag");
let kernel_start = elf_sections.sections().map(|s| s.start_address()).min().unwrap();
let kernel_end = elf_sections.sections().map(|s| s.end_address()).max().unwrap();
// get end of multiboot for safe memory
let safe_mem_start = boot_info.start_address() + boot_info.total_size();
let kernel_info = KernelInfo {
kernel_start,
kernel_end,
safe_mem_start: safe_mem_start as u64,
boot_info,
};
kernel_info
}
}
#[cfg(feature = "f_multiboot2")]
@ -23,4 +37,8 @@ impl KernelInfo {
let mm_tag = self.boot_info.memory_map_tag().expect("ERR NO MEM MAP TAG!");
mm_tag.all_memory_areas()
}
pub fn is_safe_memory(&self, addr: u64) -> bool {
addr >= self.safe_mem_start && addr >= self.kernel_end
}
}

View file

@ -11,8 +11,10 @@ use lazy_static::lazy_static;
use core::panic::PanicInfo;
use multiboot2::MemoryAreaType;
use x86_64::structures::idt::{InterruptDescriptorTable, InterruptStackFrame};
use x86_64::VirtAddr;
use crate::boot::KernelInfo;
use crate::internals::WhyDoTheyCallItOvenWhenYouOfInTheColdFoodOfOutHotEatTheFood::*;
use crate::memory::active_level_4_table;
use crate::serial::terminal::ST;
mod font;
@ -78,6 +80,7 @@ pub extern fn kernel_main(args: KernelArgs) -> ! {
if let Some(i) = console_port {
let port = &serial_ports.ports[i];
ST.init_from_port(*port);
println!("using serial port {} as console", i);
}
@ -90,15 +93,12 @@ pub extern fn kernel_main(args: KernelArgs) -> ! {
let kern_info = KernelInfo::init_from_kernel_args(args);
let mut mem_areas = kern_info.memory_areas();
println!("[OK]");
println!("memory map:");
while let Some(area) = mem_areas.next() {
println!("{:x} - {:x} : {}", area.start_address(), area.end_address(), match area.typ() {
MemoryAreaType::Available => "available",
MemoryAreaType::Reserved => "reserved",
MemoryAreaType::AcpiAvailable => "ACPI available",
MemoryAreaType::ReservedHibernate => "reserved for hibernation",
MemoryAreaType::Defective => "defective",
});
let l4_table = active_level_4_table(VirtAddr::new(0));
for (i, entry) in l4_table.iter().enumerate() {
if !entry.is_unused() {
println!("L4 entry {}: {:?}", i, entry);
}
}
loop {}

View file

@ -0,0 +1,15 @@
use x86_64::registers::control::Cr3;
use x86_64::structures::paging::PageTable;
use x86_64::VirtAddr;
pub fn active_level_4_table(physical_memory_offset: VirtAddr) -> &'static mut PageTable {
use x86_64::registers::control::Cr3;
let (level_4_table_frame, _) = Cr3::read();
let phys = level_4_table_frame.start_address();
let virt = physical_memory_offset + phys.as_u64();
let page_table_ptr: *mut PageTable = virt.as_mut_ptr();
unsafe { &mut *page_table_ptr } // unsafe
}