Overview
Relevant source files
Purpose and Scope
The page_table_multiarch repository provides a generic, unified, architecture-independent page table management library for Rust systems programming. This library enables operating systems, hypervisors, and bare-metal applications to manage virtual memory translation across multiple hardware architectures through a single, consistent API.
The repository implements hardware abstraction for page table operations on x86_64, AArch64, RISC-V, and LoongArch64 architectures, providing both low-level page table entry manipulation and high-level page table management functionality. For detailed information about individual architecture implementations, see Architecture Support. For development and contribution guidelines, see Development Guide.
Sources: README.md(L1 - L16) Cargo.toml(L17 - L18)
System Architecture
The library implements a layered architecture that separates generic page table operations from architecture-specific implementations through Rust's trait system.
Core System Structure
flowchart TD
subgraph subGraph3["Architecture Implementations"]
X86_IMPL["X64PageTableX64PTEX64PagingMetaData"]
ARM_IMPL["A64PageTableA64PTEA64PagingMetaData"]
RV_IMPL["Sv39PageTable, Sv48PageTableRv64PTESvPagingMetaData"]
LA_IMPL["LA64PageTableLA64PTELA64PagingMetaData"]
end
subgraph subGraph2["Trait Abstraction Layer"]
PMD["PagingMetaData trait"]
GPTE["GenericPTE trait"]
PH["PagingHandler trait"]
end
subgraph subGraph1["Generic API Layer"]
PT64["PageTable64<M,PTE,H>"]
API["map(), unmap(), protect()"]
FLAGS["MappingFlags"]
end
subgraph subGraph0["Application Layer"]
OS["Operating Systems"]
HV["Hypervisors"]
BM["Bare Metal Code"]
end
API --> GPTE
API --> PH
API --> PMD
BM --> PT64
GPTE --> ARM_IMPL
GPTE --> LA_IMPL
GPTE --> RV_IMPL
GPTE --> X86_IMPL
HV --> PT64
OS --> PT64
PH --> ARM_IMPL
PH --> LA_IMPL
PH --> RV_IMPL
PH --> X86_IMPL
PMD --> ARM_IMPL
PMD --> LA_IMPL
PMD --> RV_IMPL
PMD --> X86_IMPL
PT64 --> API
PT64 --> FLAGS
Sources: Cargo.toml(L4 - L7) README.md(L5 - L10)
Workspace Structure
The repository is organized as a Rust workspace containing two interdependent crates that together provide the complete page table management functionality.
Crate Dependencies and Relationships
flowchart TD
subgraph subGraph5["page_table_multiarch Workspace"]
WS["Cargo.tomlworkspace root"]
PT64_TYPE["PageTable64<M,PTE,H>"]
GPTE_TRAIT["GenericPTE trait"]
ARCH_TABLES["X64PageTableA64PageTableSv39PageTableSv48PageTableLA64PageTable"]
PTE_TYPES["X64PTEA64PTERv64PTELA64PTE"]
FLAGS_TYPE["MappingFlags"]
subgraph subGraph4["External Dependencies"]
MEMADDR["memory_addr"]
LOG["log"]
BITFLAGS["bitflags"]
end
subgraph subGraph3["page_table_entry crate"]
PTE["page_table_entry"]
PTE_LIB["lib.rs"]
PTE_ARCH["arch/ modules"]
subgraph subGraph2["Low-level Types"]
GPTE_TRAIT["GenericPTE trait"]
PTE_TYPES["X64PTEA64PTERv64PTELA64PTE"]
FLAGS_TYPE["MappingFlags"]
end
end
subgraph subGraph1["page_table_multiarch crate"]
PTM["page_table_multiarch"]
PTM_LIB["lib.rs"]
PTM_BITS["bits64.rs"]
PTM_ARCH["arch/ modules"]
subgraph subGraph0["High-level Types"]
PT64_TYPE["PageTable64<M,PTE,H>"]
ARCH_TABLES["X64PageTableA64PageTableSv39PageTableSv48PageTableLA64PageTable"]
end
end
end
ARCH_TABLES --> PTE_TYPES
GPTE_TRAIT --> FLAGS_TYPE
PT64_TYPE --> GPTE_TRAIT
PTE --> BITFLAGS
PTE --> MEMADDR
PTE_TYPES --> GPTE_TRAIT
PTM --> LOG
PTM --> MEMADDR
PTM --> PTE
WS --> PTE
WS --> PTM
The page_table_multiarch crate provides high-level page table management through the PageTable64 generic struct and architecture-specific type aliases. The page_table_entry crate provides low-level page table entry definitions and the GenericPTE trait that enables architecture abstraction.
Sources: Cargo.toml(L4 - L7) README.md(L12 - L15)
Supported Architectures
The library supports four major processor architectures, each with specific paging characteristics and implementation details.
Architecture Support Matrix
| Architecture | Page Table Levels | Virtual Address Width | Physical Address Width | Implementation Types |
|---|---|---|---|---|
| x86_64 | 4 levels | 48-bit | 52-bit | X64PageTable,X64PTE |
| AArch64 | 4 levels | 48-bit | 48-bit | A64PageTable,A64PTE |
| RISC-V Sv39 | 3 levels | 39-bit | 56-bit | Sv39PageTable,Rv64PTE |
| RISC-V Sv48 | 4 levels | 48-bit | 56-bit | Sv48PageTable,Rv64PTE |
| LoongArch64 | 4 levels | 48-bit | 48-bit | LA64PageTable,LA64PTE |
Each architecture implementation provides the same generic interface through the trait system while handling architecture-specific page table formats, address translation mechanisms, and memory attribute encodings.
Sources: README.md(L5 - L10) CHANGELOG.md(L21)
Key Abstractions
The library's architecture independence is achieved through three core traits that define the interface between generic and architecture-specific code.
Trait System Overview
flowchart TD
subgraph subGraph4["Generic Implementation"]
PT64_STRUCT["PageTable64<M: PagingMetaData,PTE: GenericPTE,H: PagingHandler>"]
end
subgraph subGraph3["PagingHandler Methods"]
PH_METHODS["alloc_frame()dealloc_frame()phys_to_virt()"]
end
subgraph subGraph2["GenericPTE Methods"]
GPTE_METHODS["new_page()new_table()paddr()flags()is_present()is_huge()empty()"]
end
subgraph subGraph1["PagingMetaData Methods"]
PMD_METHODS["PAGE_SIZEVADDR_SIZEPADDR_SIZEENTRY_COUNTMAX_LEVEL"]
end
subgraph subGraph0["Core Trait Definitions"]
PMD_TRAIT["PagingMetaData"]
GPTE_TRAIT["GenericPTE"]
PH_TRAIT["PagingHandler"]
end
API_METHODS["map()unmap()protect()map_region()unmap_region()protect_region()"]
GPTE_TRAIT --> GPTE_METHODS
GPTE_TRAIT --> PT64_STRUCT
PH_TRAIT --> PH_METHODS
PH_TRAIT --> PT64_STRUCT
PMD_TRAIT --> PMD_METHODS
PMD_TRAIT --> PT64_STRUCT
PT64_STRUCT --> API_METHODS
The PagingMetaData trait defines architecture constants, GenericPTE provides page table entry manipulation methods, and PagingHandler abstracts memory allocation and address translation for the operating system interface.
Sources: README.md(L3) CHANGELOG.md(L7) CHANGELOG.md(L61 - L63)