From e227a50196beb65ff5d318b3c4f1a4643b76e47b Mon Sep 17 00:00:00 2001 From: Yukai Wu Date: Wed, 22 Jan 2025 14:34:24 +0800 Subject: [PATCH] temp kernel heap & dummy ata --- Cargo.lock | 17 +++++++++++++++++ kernel/Cargo.toml | 1 + kernel/src/ata.rs | 5 +++++ kernel/src/int.rs | 7 +++++++ kernel/src/lib.rs | 1 + kernel/src/main.rs | 2 ++ kernel/src/mm.rs | 13 +++++++++++++ 7 files changed, 46 insertions(+) create mode 100644 kernel/src/ata.rs diff --git a/Cargo.lock b/Cargo.lock index 212b42a..ff68f66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,7 @@ version = 4 name = "DoglinkOS-2nd" version = "0.0.2-20250105" dependencies = [ + "good_memory_allocator", "limine", "noto-sans-mono-bitmap", "raw-cpuid 11.3.0", @@ -201,6 +202,12 @@ dependencies = [ "syn", ] +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "errno" version = "0.3.10" @@ -280,6 +287,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "good_memory_allocator" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1651659e016ea4259760966432aebcc96c81e26743fb018c59585ddd677127e" +dependencies = [ + "either", + "spin", +] + [[package]] name = "gpt" version = "4.0.0" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 2827fab..629ad2d 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -4,6 +4,7 @@ version = "0.0.2-20250105" edition = "2021" [dependencies] +good_memory_allocator = "0.1.7" limine = "0.3.1" noto-sans-mono-bitmap = "0.3.1" raw-cpuid = "11.3.0" diff --git a/kernel/src/ata.rs b/kernel/src/ata.rs new file mode 100644 index 0000000..50fc08a --- /dev/null +++ b/kernel/src/ata.rs @@ -0,0 +1,5 @@ +use crate::println; + +pub fn init_and_test() { + +} diff --git a/kernel/src/int.rs b/kernel/src/int.rs index 02dcd28..35050b6 100644 --- a/kernel/src/int.rs +++ b/kernel/src/int.rs @@ -4,6 +4,7 @@ use crate::{print, println}; use x86_64::structures::idt::HandlerFunc; use x86_64::structures::idt::InterruptDescriptorTable; use x86_64::structures::idt::InterruptStackFrame; +use x86_64::structures::idt::PageFaultErrorCode; use spin::{Lazy, Mutex}; pub static IDT: Lazy = Lazy::new(|| { @@ -12,6 +13,7 @@ pub static IDT: Lazy = Lazy::new(|| { temp[33].set_handler_fn(handler2); temp[34].set_handler_fn(handler3); temp[36].set_handler_fn(handler4); + temp.page_fault.set_handler_fn(handler5); temp }); @@ -42,3 +44,8 @@ pub extern "x86-interrupt" fn handler4(_: InterruptStackFrame) { } crate::apic::local::eoi(); } + +pub extern "x86-interrupt" fn handler5(_: InterruptStackFrame, _1: PageFaultErrorCode) { + println!("page fault"); + loop{} +} diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 65e5f5b..a37ecc9 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -9,3 +9,4 @@ pub mod cpu; pub mod int; pub mod mm; pub mod pcie; +pub mod ata; diff --git a/kernel/src/main.rs b/kernel/src/main.rs index 2a0c737..214add4 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -13,6 +13,7 @@ use DoglinkOS_2nd::cpu::show_cpu_info; use DoglinkOS_2nd::int::init as init_interrupt; use DoglinkOS_2nd::mm::init as init_mm; use DoglinkOS_2nd::pcie::enumrate::doit; +use DoglinkOS_2nd::ata::init_and_test as test_ata; use DoglinkOS_2nd::println; #[used] @@ -60,6 +61,7 @@ extern "C" fn kmain() -> ! { init_ioapic(parse_madt()); show_cpu_info(); doit(); + test_ata(); hang(); } diff --git a/kernel/src/mm.rs b/kernel/src/mm.rs index 92aa389..aabb845 100644 --- a/kernel/src/mm.rs +++ b/kernel/src/mm.rs @@ -1,12 +1,25 @@ use crate::println; use limine::response::HhdmResponse; use spin::Mutex; +use good_memory_allocator::SpinLockedAllocator; + +#[global_allocator] +static ALLOCATOR: SpinLockedAllocator = SpinLockedAllocator::empty(); + +#[used] +static mut RESERVED_HEAP: [u8; 8 * 1024 * 1024] = [0; 8 * 1024 * 1024]; pub static offset: Mutex = Mutex::new(0); pub fn init(res: &HhdmResponse) { println!("[INFO] mm: init() called"); + unsafe { + println!("[INFO] RESERVED_HEAP is at {:?}", &RESERVED_HEAP as *const u8); + } *offset.lock() = res.offset(); + unsafe { + ALLOCATOR.init(&mut RESERVED_HEAP as *mut u8 as usize, 8 * 1024 * 1024); + } } pub fn phys_to_virt(addr: u64) -> u64 {