10个版本 (6个重大更改)
0.7.1 | 2024年8月2日 |
---|---|
0.7.0 | 2024年7月19日 |
0.6.0 | 2024年5月31日 |
0.5.0 | 2023年10月25日 |
0.2.1 | 2022年6月29日 |
#464 在 嵌入式开发
每月174次下载
130KB
2K SLoC
ARM64页表操作
本包提供了一个用于操作符合ARM64虚拟内存系统架构的页表的库。
目前它仅支持
- 阶段1页表
- 4 KiB页面
- EL3, NS-EL2, NS-EL2&0和NS-EL1&0转换机制
这不是一个官方支持的谷歌产品。
许可证
根据您的选择,许可协议为以下之一
- Apache License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
如果您想为该项目做出贡献,请参阅我们接受贡献的详细信息。
lib.rs
:
一个用于操作ARM64 VMSA页表的库。
目前它仅支持
- 阶段1页表
- 4 KiB页面
- EL3, NS-EL2, NS-EL2&0和NS-EL1&0转换机制
提供了对身份映射(IdMap
)和线性映射(LinearMap
)的全面支持。如果您想使用不同的映射方案,您必须提供一个Translation
特质的实现,然后直接使用Mapping
。
示例
use aarch64_paging::{
idmap::IdMap,
paging::{Attributes, MemoryRegion, TranslationRegime},
};
const ASID: usize = 1;
const ROOT_LEVEL: usize = 1;
const NORMAL_CACHEABLE: Attributes = Attributes::ATTRIBUTE_INDEX_1.union(Attributes::INNER_SHAREABLE);
// Create a new EL1 page table with identity mapping.
let mut idmap = IdMap::new(ASID, ROOT_LEVEL, TranslationRegime::El1And0);
// Map a 2 MiB region of memory as read-write.
idmap.map_range(
&MemoryRegion::new(0x80200000, 0x80400000),
NORMAL_CACHEABLE | Attributes::NON_GLOBAL | Attributes::VALID | Attributes::ACCESSED,
).unwrap();
// SAFETY: Everything the program uses is within the 2 MiB region mapped above.
unsafe {
// Set `TTBR0_EL1` to activate the page table.
idmap.activate();
}
依赖项
~1–1.6MB
~29K SLoC