summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Cargo.toml3
-rw-r--r--kernel/src/lib.rs2
-rw-r--r--kernel/src/mm.rs100
3 files changed, 105 insertions, 0 deletions
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<PhysicalMemoryAddress> =
+ 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<usize> for VirtualMemoryAddress {
+ fn from(value: usize) -> Self {
+ VirtualMemoryAddress(value)
+ }
+}
+
+impl From<VirtualMemoryAddress> for usize {
+ fn from(value: VirtualMemoryAddress) -> Self {
+ value.0
+ }
+}
+
+impl From<PhysicalMemoryAddress> 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<usize> for PhysicalMemoryAddress {
+ fn from(value: usize) -> Self {
+ PhysicalMemoryAddress(value)
+ }
+}
+
+impl From<PhysicalMemoryAddress> for usize {
+ fn from(value: PhysicalMemoryAddress) -> Self {
+ value.0
+ }
+}
+
+impl From<VirtualMemoryAddress> for PhysicalMemoryAddress {
+ fn from(value: VirtualMemoryAddress) -> Self {
+ PhysicalMemoryAddress(value.0)
+ }
+}
+
+#[derive(Clone, Copy)]
+pub enum MemoryAddress {
+ Virtual(VirtualMemoryAddress),
+ Physical(PhysicalMemoryAddress),
+}
+
+impl From<VirtualMemoryAddress> for MemoryAddress {
+ fn from(value: VirtualMemoryAddress) -> Self {
+ MemoryAddress::Virtual(value)
+ }
+}
+
+impl From<PhysicalMemoryAddress> for MemoryAddress {
+ fn from(value: PhysicalMemoryAddress) -> Self {
+ MemoryAddress::Physical(value)
+ }
+}
+
+impl From<MemoryAddress> for usize {
+ fn from(value: MemoryAddress) -> Self {
+ match value {
+ MemoryAddress::Virtual(v) => *v,
+ MemoryAddress::Physical(p) => *p,
+ }
+ }
+}
+
+impl From<MemoryAddress> for VirtualMemoryAddress {
+ fn from(value: MemoryAddress) -> Self {
+ match value {
+ MemoryAddress::Virtual(v) => v,
+ MemoryAddress::Physical(p) => VirtualMemoryAddress(p.0),
+ }
+ }
+}