feat(domain): add memory module with page pool, per-process tracking, and region table

This commit is contained in:
2026-10-17 23:45:17 +02:00
parent 021b2d83b9
commit ed80fc43a6
8 changed files with 437 additions and 13 deletions

View File

@@ -0,0 +1,95 @@
use types::{
address::PhysicalAddress,
bounded::PageCount,
generation::Generation,
id::{ProcessId, RegionId},
};
pub mod page_pool;
pub mod process_memory;
#[cfg(test)]
#[path = "tests.rs"]
mod tests;
const MAX_REGIONS: usize = 256;
pub struct MemoryRegion {
id: RegionId,
owner: ProcessId,
base: PhysicalAddress,
size: PageCount,
generation: Generation,
}
impl MemoryRegion {
pub fn new(
id: RegionId,
owner: ProcessId,
base: PhysicalAddress,
size: PageCount,
generation: Generation,
) -> Self {
Self {
id,
owner,
base,
size,
generation,
}
}
pub fn id(&self) -> RegionId {
self.id
}
pub fn owner(&self) -> ProcessId {
self.owner
}
pub fn base(&self) -> PhysicalAddress {
self.base
}
pub fn size(&self) -> PageCount {
self.size
}
pub fn generation(&self) -> &Generation {
&self.generation
}
}
pub struct RegionTable {
regions: [Option<MemoryRegion>; MAX_REGIONS],
}
impl RegionTable {
pub fn new() -> Self {
Self {
regions: [const { None }; MAX_REGIONS],
}
}
pub fn insert(&mut self, region: MemoryRegion) -> Option<RegionId> {
let idx = self.regions.iter().position(|s| s.is_none())?;
let id = RegionId::from_raw(idx as u16);
self.regions[idx] = Some(region);
Some(id)
}
pub fn get(&self, id: RegionId) -> Option<&MemoryRegion> {
self.regions.get(id.raw() as usize).and_then(|s| s.as_ref())
}
pub fn remove(&mut self, id: RegionId) -> Option<MemoryRegion> {
self.regions.get_mut(id.raw() as usize).and_then(|s| s.take())
}
pub fn regions_for_process(&self, process: ProcessId) -> impl Iterator<Item = &MemoryRegion> {
self.regions
.iter()
.filter_map(|s| s.as_ref())
.filter(move |r| r.owner() == process)
}
}