libkenrel: memory: move paging-related modules to paging module

Move PtePermissions to paging module which is feature-gated behind
`paging`.

Also move all AddressSpace related functionality behind the `proc_vm`
feature gate.
This commit is contained in:
Matthew Leach
2026-04-11 09:03:33 +01:00
parent 3423d738e6
commit 465fcb7acb
46 changed files with 99 additions and 80 deletions

View File

@@ -13,7 +13,7 @@ gates to keep the dependency footprint minimal.
|-----------|-------------------------------------------------------|------------------|
| `sync` | Synchronisation primitives (spinlock, mutex, rwlock…) | — |
| `alloc` | Memory allocators (buddy, slab) and collection types | `sync` |
| `paging` | Page tables, address-space management, PTE helpers | `alloc` |
| `paging` | Page tables, PTE helpers | `alloc` |
| `proc` | Process identity types (UID/GID, capabilities) | — |
| `fs` | VFS traits, path manipulation, block I/O | `proc`, `sync` |
| `proc_vm` | Process virtual-memory management (mmap, brk, CoW) | `paging`, `fs` |

View File

@@ -6,7 +6,7 @@ use tock_registers::{register_bitfields, registers::InMemoryRegister};
use crate::memory::PAGE_SHIFT;
use crate::memory::address::{PA, VA};
use crate::memory::permissions::PtePermissions;
use crate::memory::paging::permissions::PtePermissions;
use crate::memory::region::PhysMemoryRegion;
/// Trait for common behavior across different types of page table entries.

View File

@@ -14,7 +14,7 @@ use crate::{
memory::{
PAGE_SIZE,
address::{TPA, TVA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -135,7 +135,7 @@ mod tests {
use super::*;
use crate::arch::arm64::memory::pg_tables::tests::TestHarness;
use crate::memory::address::VA;
use crate::memory::permissions::PtePermissions;
use crate::memory::paging::permissions::PtePermissions;
use std::collections::HashSet;
fn capture_freed_pages<PM: PageTableMapper>(

View File

@@ -189,7 +189,7 @@ mod tests {
use crate::error::KernelError;
use crate::memory::PAGE_SIZE;
use crate::memory::address::{PA, VA};
use crate::memory::permissions::PtePermissions;
use crate::memory::paging::permissions::PtePermissions;
use std::sync::atomic::{AtomicUsize, Ordering};
#[test]

View File

@@ -1,3 +1,4 @@
//! Architecture-specific support code.
pub mod arm64;
pub mod x86_64;

View File

@@ -1,13 +1,13 @@
//! RAM-backed block device implementation.
use crate::{
KernAddressSpace,
error::{IoError, KernelError, Result},
fs::BlockDevice,
memory::{
PAGE_SIZE,
address::{TVA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::KernAddressSpace,
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -18,7 +18,7 @@
//! |-----------|-------------------------------------------------------|------------------|
//! | `sync` | Synchronisation primitives (spinlock, mutex, rwlock…) | — |
//! | `alloc` | Memory allocators (buddy, slab) and collection types | `sync` |
//! | `paging` | Page tables, address-space management, PTE helpers | `alloc` |
//! | `paging` | Page tables, PTE helpers | `alloc` |
//! | `proc` | Process identity types (UID/GID, capabilities) | — |
//! | `fs` | VFS traits, path manipulation, block I/O | `proc`, `sync` |
//! | `proc_vm` | Process virtual-memory management (mmap, brk, CoW) | `paging`, `fs` |
@@ -66,9 +66,6 @@ pub mod sync;
extern crate alloc;
#[cfg(feature = "paging")]
pub use memory::address_space::{KernAddressSpace, PageInfo, UserAddressSpace, VirtualMemory};
/// Trait abstracting the small set of CPU operations that the
/// architecture-independent kernel code requires.
///

View File

@@ -9,8 +9,6 @@
//! feature flags.
pub mod address;
#[cfg(feature = "paging")]
pub mod address_space;
#[cfg(feature = "alloc")]
pub mod allocators;
#[cfg(feature = "alloc")]
@@ -19,9 +17,7 @@ pub mod claimed_page;
pub mod kbuf;
pub mod page;
#[cfg(feature = "paging")]
pub mod permissions;
#[cfg(feature = "paging")]
pub mod pg_offset;
pub mod paging;
#[cfg(feature = "proc_vm")]
pub mod proc_vm;
pub mod region;

View File

@@ -0,0 +1,3 @@
//! Architecture agnostic paging-related traits and types.
pub mod permissions;

View File

@@ -3,7 +3,7 @@
use core::fmt;
#[cfg(feature = "proc_vm")]
use super::proc_vm::vmarea::VMAPermissions;
use crate::memory::proc_vm::vmarea::VMAPermissions;
/// Represents the memory permissions for a virtual memory mapping.
#[derive(Clone, Copy, PartialEq, Eq, Default)]
@@ -135,7 +135,7 @@ impl PtePermissions {
///
/// # Example
/// ```
/// use libkernel::memory::permissions::PtePermissions;
/// use libkernel::memory::paging::permissions::PtePermissions;
///
/// let perms = PtePermissions::rw(true);
/// let cow_perms = perms.into_cow();
@@ -165,7 +165,7 @@ impl PtePermissions {
///
/// # Example
/// ```
/// use libkernel::memory::permissions::PtePermissions;
/// use libkernel::memory::paging::permissions::PtePermissions;
///
/// let cow_perms = PtePermissions::rw(true).into_cow();
/// let writable_perms = cow_perms.from_cow();

View File

@@ -8,7 +8,7 @@ use crate::{
memory::{
address::VA,
page::PageFrame,
permissions::PtePermissions,
paging::permissions::PtePermissions,
region::{PhysMemoryRegion, VirtMemoryRegion},
},
sync::spinlock::SpinLockIrq,

View File

@@ -1,11 +1,13 @@
//! Memory map management for a process address space.
use super::vmarea::{VMAPermissions, VMArea, VMAreaKind};
use super::{
address_space::UserAddressSpace,
vmarea::{VMAPermissions, VMArea, VMAreaKind},
};
use crate::{
UserAddressSpace,
error::{KernelError, Result},
memory::{
PAGE_MASK, PAGE_SIZE, address::VA, page::PageFrame, permissions::PtePermissions,
PAGE_MASK, PAGE_SIZE, address::VA, page::PageFrame, paging::permissions::PtePermissions,
region::VirtMemoryRegion,
},
};

View File

@@ -1,14 +1,14 @@
use super::MemoryMap;
use crate::{
PageInfo, UserAddressSpace,
error::Result,
fs::Inode,
memory::{
PAGE_SIZE,
address::VA,
page::PageFrame,
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::{
address_space::{PageInfo, UserAddressSpace},
memory_map::{AddressRequest, MMAP_BASE},
vmarea::{VMAPermissions, VMArea, VMAreaKind, VMFileMapping, tests::DummyTestInode},
},

View File

@@ -1,16 +1,16 @@
//! Manages the virtual memory address space of a process.
use crate::{
UserAddressSpace,
error::{KernelError, Result},
use super::{
PAGE_SIZE, address::VA, proc_vm::address_space::UserAddressSpace, region::VirtMemoryRegion,
};
use crate::error::{KernelError, Result};
use alloc::string::ToString;
use memory_map::{AddressRequest, MemoryMap};
use vmarea::{AccessKind, FaultValidation, VMAPermissions, VMArea, VMAreaKind};
use super::{PAGE_SIZE, address::VA, region::VirtMemoryRegion};
pub mod address_space;
pub mod memory_map;
pub mod pg_offset;
pub mod vmarea;
const BRK_PERMISSIONS: VMAPermissions = VMAPermissions::rw();

View File

@@ -1,7 +1,7 @@
//! Page-offset arithmetic helpers.
use super::address::{AddressTranslator, TPA, TVA};
use crate::VirtualMemory;
use super::address_space::VirtualMemory;
use crate::memory::address::{AddressTranslator, TPA, TVA};
use core::marker::PhantomData;
/// Translates between physical and virtual addresses using a fixed page-offset mapping.

View File

@@ -16,7 +16,7 @@ use libkernel::{
error::Result,
memory::{
address::{TPA, TVA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
},
};

View File

@@ -14,7 +14,7 @@ use libkernel::{
memory::{
PAGE_SIZE,
address::{PA, TPA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -10,7 +10,7 @@ use libkernel::arch::arm64::memory::pg_tables::{
use libkernel::arch::arm64::memory::tlb::NullTlbInvalidator;
use libkernel::error::{KernelError, Result};
use libkernel::memory::address::{AddressTranslator, IdentityTranslator, PA, TPA, TVA};
use libkernel::memory::permissions::PtePermissions;
use libkernel::memory::paging::permissions::PtePermissions;
use libkernel::memory::region::PhysMemoryRegion;
use libkernel::memory::{PAGE_MASK, PAGE_SIZE};
use tock_registers::interfaces::{ReadWriteable, Writeable};

View File

@@ -24,11 +24,12 @@ use core::{
time::Duration,
};
use libkernel::{
CpuOps, KernAddressSpace, VirtualMemory,
CpuOps,
error::{KernelError, Result},
memory::{
address::{PA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
},
};
use log::{info, warn};

View File

@@ -14,11 +14,11 @@ use aarch64_cpu::registers::{CPACR_EL1, ReadWriteable, VBAR_EL1};
use core::{arch::global_asm, fmt::Display};
use esr::{Esr, Exception};
use libkernel::{
KernAddressSpace, VirtualMemory,
error::Result,
memory::{
address::VA,
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -10,7 +10,6 @@ use aarch64_cpu::{
};
use alloc::vec::Vec;
use libkernel::{
PageInfo, UserAddressSpace,
arch::arm64::memory::{
pg_descriptors::{L3Descriptor, MemoryType, PaMapper, PageTableEntry},
pg_tables::{
@@ -24,7 +23,8 @@ use libkernel::{
PAGE_SIZE,
address::{TPA, VA},
page::PageFrame,
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::{PageInfo, UserAddressSpace},
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -16,9 +16,12 @@ use crate::{
};
use alloc::{boxed::Box, sync::Arc};
use libkernel::{
UserAddressSpace,
error::Result,
memory::{address::VA, proc_vm::vmarea::AccessKind, region::VirtMemoryRegion},
memory::{
address::VA,
proc_vm::{address_space::UserAddressSpace, vmarea::AccessKind},
region::VirtMemoryRegion,
},
};
#[repr(C)]

View File

@@ -16,7 +16,7 @@ use libkernel::{
memory::{
PAGE_SIZE,
address::{IdentityTranslator, TPA, TVA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
region::PhysMemoryRegion,
},
};

View File

@@ -1,7 +1,6 @@
use super::{MMIO_BASE, tlb::AllEl1TlbInvalidator};
use crate::sync::{OnceLock, SpinLock};
use libkernel::{
KernAddressSpace,
arch::arm64::memory::{
pg_descriptors::{MemoryType, PaMapper},
pg_tables::{L0Table, MapAttributes, MappingContext, PgTableArray, map_range},
@@ -10,7 +9,8 @@ use libkernel::{
error::Result,
memory::{
address::{PA, TPA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::KernAddressSpace,
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -7,10 +7,13 @@ use alloc::sync::Arc;
use cpu_ops::{local_irq_restore, local_irq_save};
use exceptions::ExceptionState;
use libkernel::{
CpuOps, VirtualMemory,
CpuOps,
arch::arm64::memory::pg_tables::{L0Table, PgTableArray},
error::Result,
memory::address::{UA, VA},
memory::{
address::{UA, VA},
proc_vm::address_space::VirtualMemory,
},
};
use memory::{
PAGE_OFFSET,

View File

@@ -1,6 +1,6 @@
use crate::process::Task;
use alloc::sync::Arc;
use libkernel::UserAddressSpace;
use libkernel::memory::proc_vm::address_space::UserAddressSpace;
pub mod idle;
pub mod signal;

View File

@@ -4,14 +4,14 @@ use crate::{
process::owned::OwnedTask,
};
use core::arch::global_asm;
use libkernel::{
UserAddressSpace, VirtualMemory,
memory::{
address::VA,
permissions::PtePermissions,
proc_vm::vmarea::{VMAPermissions, VMArea, VMAreaKind},
region::VirtMemoryRegion,
use libkernel::memory::{
address::VA,
paging::permissions::PtePermissions,
proc_vm::{
address_space::{UserAddressSpace, VirtualMemory},
vmarea::{VMAPermissions, VMArea, VMAreaKind},
},
region::VirtMemoryRegion,
};
global_asm!(include_str!("idle.s"));

View File

@@ -1,10 +1,10 @@
use core::arch::global_asm;
use libkernel::{
KernAddressSpace, VirtualMemory,
error::Result,
memory::{
address::VA,
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::{PhysMemoryRegion, VirtMemoryRegion},
},
};

View File

@@ -20,9 +20,12 @@ use crate::{
use alloc::string::String;
use alloc::sync::Arc;
use libkernel::{
CpuOps, VirtualMemory,
CpuOps,
error::Result,
memory::address::{UA, VA},
memory::{
address::{UA, VA},
proc_vm::address_space::VirtualMemory,
},
};
pub trait Arch: CpuOps + VirtualMemory {

View File

@@ -12,8 +12,8 @@ use crate::{
};
use alloc::{boxed::Box, sync::Arc};
use core::ptr::NonNull;
use libkernel::memory::proc_vm::address_space::{KernAddressSpace, VirtualMemory};
use libkernel::{
KernAddressSpace, VirtualMemory,
error::{KernelError, ProbeError, Result},
memory::{
address::{PA, VA},

View File

@@ -3,9 +3,12 @@ use alloc::{
sync::{Arc, Weak},
};
use libkernel::{
KernAddressSpace, VirtualMemory,
error::{KernelError, Result},
memory::{address::PA, region::PhysMemoryRegion},
memory::{
address::PA,
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::PhysMemoryRegion,
},
};
use log::info;
use tock_registers::{

View File

@@ -16,10 +16,10 @@ use aarch64_cpu::registers::MPIDR_EL1;
use alloc::{boxed::Box, sync::Arc};
use core::arch::asm;
use libkernel::{
KernAddressSpace, VirtualMemory,
error::{KernelError, Result},
memory::{
address::{PA, VA},
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::PhysMemoryRegion,
},
};

View File

@@ -12,8 +12,8 @@ use crate::{
};
use alloc::{boxed::Box, sync::Arc};
use core::ptr::NonNull;
use libkernel::memory::proc_vm::address_space::{KernAddressSpace, VirtualMemory};
use libkernel::{
KernAddressSpace, VirtualMemory,
error::{KernelError, ProbeError, Result},
memory::{
address::{PA, VA},

View File

@@ -9,8 +9,8 @@ use alloc::sync::Arc;
use core::time::Duration;
use libkernel::error::{ProbeError, Result};
use libkernel::memory::address::{PA, VA};
use libkernel::memory::proc_vm::address_space::{KernAddressSpace, VirtualMemory};
use libkernel::memory::region::PhysMemoryRegion;
use libkernel::{KernAddressSpace, VirtualMemory};
/// Driver for a PL031 real-time clock.
pub struct PL031 {

View File

@@ -12,10 +12,10 @@ use aarch64_cpu::registers::{ReadWriteable, Readable, Writeable};
use alloc::{boxed::Box, sync::Arc};
use core::hint::spin_loop;
use libkernel::{
KernAddressSpace, VirtualMemory,
error::Result,
memory::{
address::{PA, VA},
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::PhysMemoryRegion,
},
};

View File

@@ -13,10 +13,10 @@ use arm_pl011_uart::{
};
use core::ptr::NonNull;
use libkernel::{
KernAddressSpace, VirtualMemory,
error::{ProbeError, Result},
memory::{
address::{PA, VA},
proc_vm::address_space::{KernAddressSpace, VirtualMemory},
region::PhysMemoryRegion,
},
};

View File

@@ -1,9 +1,9 @@
use crate::arch::ArchImpl;
use crate::memory::PageOffsetTranslator;
use core::ptr::NonNull;
use libkernel::VirtualMemory;
use libkernel::memory::PAGE_SIZE;
use libkernel::memory::address::{PA, TPA};
use libkernel::memory::proc_vm::address_space::VirtualMemory;
use libkernel::memory::region::PhysMemoryRegion;
use log::trace;
use virtio_drivers::{BufferDirection, Hal, PhysAddr};

View File

@@ -21,13 +21,14 @@ use drivers::{fdt_prober::get_fdt, fs::register_fs_drivers};
use fs::VFS;
use getargs::{Opt, Options};
use libkernel::{
CpuOps, VirtualMemory,
CpuOps,
fs::{
BlockDevice, OpenFlags, attr::FilePermissions, blk::ramdisk::RamdiskBlkDev, path::Path,
pathbuf::PathBuf,
},
memory::{
address::{PA, VA},
proc_vm::address_space::VirtualMemory,
region::PhysMemoryRegion,
},
};

View File

@@ -2,9 +2,15 @@ use crate::{process::ProcVM, sync::SpinLock};
use alloc::boxed::Box;
use alloc::sync::Arc;
use libkernel::{
PageInfo, UserAddressSpace,
error::{KernelError, MapError, Result},
memory::{address::VA, permissions::PtePermissions, proc_vm::vmarea::AccessKind},
memory::{
address::VA,
paging::permissions::PtePermissions,
proc_vm::{
address_space::{PageInfo, UserAddressSpace},
vmarea::AccessKind,
},
},
};
use super::{PAGE_ALLOC, page::ClaimedPage};

View File

@@ -1,11 +1,11 @@
use alloc::vec;
use alloc::vec::Vec;
use libkernel::memory::proc_vm::address_space::UserAddressSpace;
use crate::memory::uaccess::copy_to_user_slice;
use crate::sched::syscall_ctx::ProcessCtx;
use libkernel::memory::region::VirtMemoryRegion;
use libkernel::{
UserAddressSpace,
error::{KernelError, Result},
memory::PAGE_SHIFT,
memory::address::{UA, VA},

View File

@@ -18,7 +18,8 @@ pub mod page;
pub mod process_vm;
pub mod uaccess;
pub type PageOffsetTranslator = libkernel::memory::pg_offset::PageOffsetTranslator<ArchImpl>;
pub type PageOffsetTranslator =
libkernel::memory::proc_vm::pg_offset::PageOffsetTranslator<ArchImpl>;
// Initial memory allocator. Used for initial memory setup.
const STATIC_REGION_COUNT: usize = 128;

View File

@@ -16,14 +16,14 @@ use alloc::{string::String, vec};
use alloc::{string::ToString, sync::Arc, vec::Vec};
use auxv::{AT_BASE, AT_ENTRY, AT_NULL, AT_PAGESZ, AT_PHDR, AT_PHENT, AT_PHNUM, AT_RANDOM};
use core::{ffi::c_char, mem, slice};
use libkernel::memory::proc_vm::address_space::{UserAddressSpace, VirtualMemory};
use libkernel::{
UserAddressSpace, VirtualMemory,
error::{ExecError, KernelError, Result},
fs::{Inode, path::Path},
memory::{
PAGE_SIZE,
address::{TUA, VA},
permissions::PtePermissions,
paging::permissions::PtePermissions,
proc_vm::{
ProcessVM,
memory_map::MemoryMap,

View File

@@ -18,8 +18,8 @@ use alloc::{
use core::sync::atomic::{AtomicU32, AtomicUsize, Ordering};
use creds::Credentials;
use fd_table::FileDescriptorTable;
use libkernel::memory::proc_vm::address_space::{UserAddressSpace, VirtualMemory};
use libkernel::{
UserAddressSpace, VirtualMemory,
error::{KernelError, Result},
fs::{Inode, pathbuf::PathBuf},
memory::{

View File

@@ -20,11 +20,10 @@ use alloc::sync::Arc;
use core::ops::Deref;
use core::sync::atomic::AtomicUsize;
use libkernel::{
VirtualMemory,
fs::pathbuf::PathBuf,
memory::{
address::{TUA, VA},
proc_vm::{ProcessVM, vmarea::VMArea},
proc_vm::{ProcessVM, address_space::VirtualMemory, vmarea::VMArea},
},
};

View File

@@ -1,7 +1,7 @@
use crate::sched::syscall_ctx::ProcessCtx;
use libkernel::UserAddressSpace;
use libkernel::error::{KernelError, Result};
use libkernel::memory::address::{TUA, VA};
use libkernel::memory::proc_vm::address_space::UserAddressSpace;
#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
pub enum FutexKey {