os/arch/riscv/mm/mod.rs
1//! RISC-V 架构内存管理模块
2//!
3//! 此模块提供了针对 **RISC-V 架构** 的内存管理实现,
4//! 使用 **SV39 分页方案 (SV39 Paging Scheme)**。
5//!
6//! # SV39 分页方案
7//!
8//! SV39 是 RISC-V 上的一个 39 位虚拟地址分页方案:
9//! - **虚拟地址 (Virtual address)**: 39 个有效位 (位 38-63 必须与位 38 匹配)
10//! - **物理地址 (Physical address)**: 56 位 (位 0-55)
11//! - **页大小 (Page size)**: 4 KiB
12//!
13//! # 地址转换
14//!
15//! 此模块使用**直接映射 (direct mapping)** 进行地址转换:
16//! - 虚拟地址起始点 (Virtual address start): `0xffff_ffc0_0000_0000`
17//! - **提取物理地址** 使用与 `PADDR_MASK` 进行**位与 (bitwise AND)** 操作
18//! - **创建虚拟地址** 使用与 `VADDR_START` 进行**位或 (bitwise OR)** 操作
19
20mod page_table; // 模块:页表
21mod page_table_entry; // 模块:页表项
22
23pub use page_table::PageTableInner; // 导出:页表内部结构
24pub use page_table_entry::PageTableEntry; // 导出:页表项结构体
25
26/// SV39 中虚拟地址空间的起始地址
27///
28/// 此常量定义了内核高位虚拟地址空间的起始位置。
29/// 在 SV39 分页方案中,这是一个合法的**高半区 (higher-half)** 内核地址。
30pub const VADDR_START: usize = 0xffff_ffc0_0000_0000;
31
32/// 物理地址掩码,用于从虚拟地址中提取物理地址
33///
34/// 此掩码保留了低 38 位 (位 0-37),这对应于
35/// SV39 中的物理地址空间大小。
36pub const PADDR_MASK: usize = 0x0000_003f_ffff_ffff;
37
38/// 转换虚拟地址到物理地址
39///
40/// # 参数
41///
42/// * `vaddr` - 虚拟地址
43///
44/// # 返回
45///
46/// 对应的物理地址
47///
48/// # 注意
49///
50/// 此函数必须在所有架构特定的内存管理模块中实现。
51pub const unsafe fn vaddr_to_paddr(vaddr: usize) -> usize {
52 vaddr & PADDR_MASK
53}
54
55/// 转换物理地址到虚拟地址
56///
57/// # 参数
58///
59/// * `paddr` - 物理地址
60///
61/// # 返回
62///
63/// 对应的虚拟地址
64///
65/// # 注意
66///
67/// 此函数必须在所有架构特定的内存管理模块中实现。
68pub const fn paddr_to_vaddr(paddr: usize) -> usize {
69 paddr | VADDR_START
70}