From 02ea0327f11f6715ae0d34c597cc8095884f2216 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sun, 6 Sep 2026 13:28:08 +0800 Subject: mm: fix translation --- kernel/src/mm.rs | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/kernel/src/mm.rs b/kernel/src/mm.rs index 0a2c5ad..4f9004d 100644 --- a/kernel/src/mm.rs +++ b/kernel/src/mm.rs @@ -1,11 +1,12 @@ -use core::ops::Deref; +use core::{ops::Deref, sync::atomic::Ordering}; use atomic::Atomic; +use bytemuck::{Pod, Zeroable}; -static KERNEL_VIRTUAL_BASE: Atomic = - Atomic::new(PhysicalMemoryAddress(0xFFFFFFFF80000000)); +static KERNEL_VIRTUAL_BASE: Atomic = Atomic::new(PhysicalMemoryAddress(0)); -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Pod, Zeroable)] +#[repr(transparent)] pub struct VirtualMemoryAddress(pub usize); impl Deref for VirtualMemoryAddress { @@ -18,23 +19,24 @@ impl Deref for VirtualMemoryAddress { impl From for VirtualMemoryAddress { fn from(value: usize) -> Self { - VirtualMemoryAddress(value) + Self(value) } } impl From for usize { fn from(value: VirtualMemoryAddress) -> Self { - value.0 + *value } } impl From for VirtualMemoryAddress { fn from(value: PhysicalMemoryAddress) -> Self { - VirtualMemoryAddress(value.0) + VirtualMemoryAddress(*value + *KERNEL_VIRTUAL_BASE.load(Ordering::Relaxed)) } } -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Pod, Zeroable)] +#[repr(transparent)] pub struct PhysicalMemoryAddress(pub usize); impl Deref for PhysicalMemoryAddress { @@ -53,13 +55,13 @@ impl From for PhysicalMemoryAddress { impl From for usize { fn from(value: PhysicalMemoryAddress) -> Self { - value.0 + *value } } impl From for PhysicalMemoryAddress { fn from(value: VirtualMemoryAddress) -> Self { - PhysicalMemoryAddress(value.0) + PhysicalMemoryAddress(*value - *KERNEL_VIRTUAL_BASE.load(Ordering::Relaxed)) } } @@ -94,7 +96,16 @@ impl From for VirtualMemoryAddress { fn from(value: MemoryAddress) -> Self { match value { MemoryAddress::Virtual(v) => v, - MemoryAddress::Physical(p) => VirtualMemoryAddress(p.0), + MemoryAddress::Physical(p) => p.into(), + } + } +} + +impl From for PhysicalMemoryAddress { + fn from(value: MemoryAddress) -> Self { + match value { + MemoryAddress::Virtual(v) => v.into(), + MemoryAddress::Physical(p) => p, } } } -- cgit v1.2.3