From 922c9685e9e905a4e0f4acb6ce49e2471485bf8d Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sun, 6 Sep 2026 11:49:20 +0800 Subject: init: mm just some ground work and newtype pattern --- kernel/Cargo.toml | 3 ++ kernel/src/lib.rs | 2 ++ kernel/src/mm.rs | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 kernel/src/mm.rs (limited to 'kernel') diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index fda2a4a..e1e5f5a 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -4,5 +4,8 @@ version = "0.1.0" edition = "2024" [dependencies] +acpi = "6.1.1" +atomic = "0.6.1" bootloader_api = { git = "https://github.com/rust-osdev/bootloader" } +linkme = "0.3.37" uart_16550 = "0.8.0" diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 2832ab2..ed7bd16 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -1,4 +1,6 @@ #![no_std] +pub mod init; pub mod io; +pub mod mm; pub mod pm; diff --git a/kernel/src/mm.rs b/kernel/src/mm.rs new file mode 100644 index 0000000..0a2c5ad --- /dev/null +++ b/kernel/src/mm.rs @@ -0,0 +1,100 @@ +use core::ops::Deref; + +use atomic::Atomic; + +static KERNEL_VIRTUAL_BASE: Atomic = + Atomic::new(PhysicalMemoryAddress(0xFFFFFFFF80000000)); + +#[derive(Clone, Copy)] +pub struct VirtualMemoryAddress(pub usize); + +impl Deref for VirtualMemoryAddress { + type Target = usize; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for VirtualMemoryAddress { + fn from(value: usize) -> Self { + VirtualMemoryAddress(value) + } +} + +impl From for usize { + fn from(value: VirtualMemoryAddress) -> Self { + value.0 + } +} + +impl From for VirtualMemoryAddress { + fn from(value: PhysicalMemoryAddress) -> Self { + VirtualMemoryAddress(value.0) + } +} + +#[derive(Clone, Copy)] +pub struct PhysicalMemoryAddress(pub usize); + +impl Deref for PhysicalMemoryAddress { + type Target = usize; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for PhysicalMemoryAddress { + fn from(value: usize) -> Self { + PhysicalMemoryAddress(value) + } +} + +impl From for usize { + fn from(value: PhysicalMemoryAddress) -> Self { + value.0 + } +} + +impl From for PhysicalMemoryAddress { + fn from(value: VirtualMemoryAddress) -> Self { + PhysicalMemoryAddress(value.0) + } +} + +#[derive(Clone, Copy)] +pub enum MemoryAddress { + Virtual(VirtualMemoryAddress), + Physical(PhysicalMemoryAddress), +} + +impl From for MemoryAddress { + fn from(value: VirtualMemoryAddress) -> Self { + MemoryAddress::Virtual(value) + } +} + +impl From for MemoryAddress { + fn from(value: PhysicalMemoryAddress) -> Self { + MemoryAddress::Physical(value) + } +} + +impl From for usize { + fn from(value: MemoryAddress) -> Self { + match value { + MemoryAddress::Virtual(v) => *v, + MemoryAddress::Physical(p) => *p, + } + } +} + +impl From for VirtualMemoryAddress { + fn from(value: MemoryAddress) -> Self { + match value { + MemoryAddress::Virtual(v) => v, + MemoryAddress::Physical(p) => VirtualMemoryAddress(p.0), + } + } +} -- cgit v1.2.3