memory_addr Crate
Relevant source files
Purpose and Scope
The memory_addr
crate provides foundational abstractions for physical and virtual memory addresses in the ArceOS ecosystem. It serves as the lowest-level component in the memory management stack, offering type-safe address representations, alignment utilities, and iteration capabilities over memory regions.
This crate focuses specifically on address manipulation primitives and does not handle memory mapping or higher-level memory management operations. For memory mapping functionality and management of memory regions, see memory_set Crate.
The crate is designed for no-std
environments and provides essential building blocks for operating system kernels, hypervisors, and embedded systems that need precise control over memory addresses.
Sources: memory_addr/Cargo.toml(L1 - L17) memory_addr/README.md(L1 - L30) memory_addr/src/lib.rs(L1 - L11)
Core Address Type System
The crate implements a type-safe address system built around a common trait with specialized implementations for different address spaces.
flowchart TD subgraph Constants["Constants"] PAGE_SIZE_4K["PAGE_SIZE_4Kconst = 0x1000"] end subgraph subGraph2["Iteration Support"] PageIter["PageIter<SIZE, A>generic iterator"] PageIter4K["PageIter4K<A>type alias"] end subgraph subGraph1["Range Types"] AddrRange["AddrRange<A>generic range"] PhysAddrRange["PhysAddrRangetype alias"] VirtAddrRange["VirtAddrRangetype alias"] end subgraph subGraph0["Core Types"] MemoryAddr["MemoryAddrtrait"] PhysAddr["PhysAddrstruct"] VirtAddr["VirtAddrstruct"] end AddrRange --> PhysAddrRange AddrRange --> VirtAddrRange MemoryAddr --> PageIter MemoryAddr --> PhysAddr MemoryAddr --> VirtAddr PAGE_SIZE_4K --> PageIter4K PageIter --> PageIter4K PhysAddr --> PhysAddrRange VirtAddr --> VirtAddrRange
Sources: memory_addr/src/lib.rs(L8 - L16)
Address Operations and Utilities
The crate provides a comprehensive set of alignment and arithmetic operations that work consistently across all address types.
flowchart TD subgraph subGraph2["Address Methods"] addr_align_down["addr.align_down(align)"] addr_align_up_4k["addr.align_up_4k()"] addr_align_offset_4k["addr.align_offset_4k()"] addr_is_aligned_4k["addr.is_aligned_4k()"] end subgraph subGraph1["4K-Specific Functions"] align_down_4k["align_down_4k(addr)"] align_up_4k["align_up_4k(addr)"] align_offset_4k["align_offset_4k(addr)"] is_aligned_4k["is_aligned_4k(addr)"] end subgraph subGraph0["Generic Functions"] align_down["align_down(addr, align)"] align_up["align_up(addr, align)"] align_offset["align_offset(addr, align)"] is_aligned["is_aligned(addr, align)"] end align_down --> addr_align_down align_down --> align_down_4k align_offset --> align_offset_4k align_offset_4k --> addr_align_offset_4k align_up --> align_up_4k align_up_4k --> addr_align_up_4k is_aligned --> is_aligned_4k is_aligned_4k --> addr_is_aligned_4k
Sources: memory_addr/src/lib.rs(L18 - L76)
Function Categories and Implementation
The crate organizes its functionality into several key categories that build upon each other to provide a complete address manipulation toolkit.
Category | Functions | Purpose |
---|---|---|
Generic Alignment | align_down,align_up,align_offset,is_aligned | Power-of-two alignment operations for any alignment value |
4K Page Helpers | align_down_4k,align_up_4k,align_offset_4k,is_aligned_4k | Specialized functions for common 4K page operations |
Type Wrappers | PhysAddr,VirtAddr | Type-safe address representations with built-in methods |
Range Operations | AddrRange,PhysAddrRange,VirtAddrRange | Address range abstractions for memory region management |
Iteration Support | PageIter,PageIter4K | Iterator types for traversing memory in page-sized chunks |
Sources: memory_addr/src/lib.rs(L18 - L76)
Core Constants and Type Aliases
The crate defines essential constants and type aliases that standardize common memory management patterns:
// From memory_addr/src/lib.rs:12-16
pub const PAGE_SIZE_4K: usize = 0x1000;
pub type PageIter4K<A> = PageIter<PAGE_SIZE_4K, A>;
The PAGE_SIZE_4K
constant (4096 bytes) is fundamental to the system's page-oriented design, while PageIter4K
provides a convenient type alias for the most common page iteration scenario.
Sources: memory_addr/src/lib.rs(L12 - L16)
Module Structure and Exports
The crate follows a clean modular design with focused responsibilities:
flowchart TD subgraph subGraph1["Public API"] MemoryAddr_export["MemoryAddr"] PhysAddr_export["PhysAddr"] VirtAddr_export["VirtAddr"] PageIter_export["PageIter"] AddrRange_export["AddrRange"] PhysAddrRange_export["PhysAddrRange"] VirtAddrRange_export["VirtAddrRange"] end subgraph memory_addr/src/["memory_addr/src/"] lib["lib.rsMain module & re-exports"] addr_mod["addr.rsMemoryAddr trait & types"] iter_mod["iter.rsPageIter implementation"] range_mod["range.rsAddrRange types"] end addr_mod --> MemoryAddr_export addr_mod --> PhysAddr_export addr_mod --> VirtAddr_export iter_mod --> PageIter_export lib --> AddrRange_export lib --> MemoryAddr_export lib --> PageIter_export lib --> PhysAddrRange_export lib --> PhysAddr_export lib --> VirtAddrRange_export lib --> VirtAddr_export range_mod --> AddrRange_export range_mod --> PhysAddrRange_export range_mod --> VirtAddrRange_export
Sources: memory_addr/src/lib.rs(L4 - L10)
Alignment Implementation Details
The alignment functions implement efficient bit manipulation operations that require power-of-two alignments:
align_down(addr, align)
: Usesaddr & !(align - 1)
to mask off lower bitsalign_up(addr, align)
: Uses(addr + align - 1) & !(align - 1)
to round upalign_offset(addr, align)
: Usesaddr & (align - 1)
to get remainderis_aligned(addr, align)
: Checks ifalign_offset(addr, align) == 0
These operations are marked const fn
, enabling compile-time computation when used with constant values.
Sources: memory_addr/src/lib.rs(L24 - L51)
Integration with ArceOS Ecosystem
The memory_addr
crate serves as the foundation layer in the ArceOS memory management stack. It provides the type-safe primitives that higher-level components build upon, particularly the memory_set
crate which uses these address types for memory region management.
The crate's no_std
compatibility and const function implementations make it suitable for both kernel and embedded environments where compile-time optimization and resource constraints are critical.
Sources: memory_addr/Cargo.toml(L5) memory_addr/src/lib.rs(L1)