google/aarch64-rt
GitHub: google/aarch64-rt
为 ARM64 Cortex-A 处理器上的裸机 Rust 程序提供启动代码、异常处理和页表初始化的运行时库。
Stars: 24 | Forks: 9
# aarch64 裸机启动代码
[](https://crates.io/crates/aarch64-rt)
[](https://docs.rs/aarch64-rt)
此 crate 为 Cortex-A 处理器上的 aarch64 裸机 Rust 二进制文件提供入口点和异常处理。
这并非 Google 官方支持的产品。
## 用法
使用 `entry!` 宏来标记你的主函数:
```
use aarch64_rt::entry;
entry!(main);
fn main(arg0: u64, arg1: u64, arg2: u64, arg3: u64) -> ! {
// ...
}
```
`arg0` 到 `arg3` 将包含寄存器 `x0`–`x3` 的初始值。这些通常用于从前一阶段的 bootloader 传递参数,例如设备树的地址。
你需要在一个 linker script 中提供镜像起始地址(即入口点地址)和最大大小,例如:
```
MEMORY
{
image : ORIGIN = 0x40080000, LENGTH = 2M
}
```
你需要告诉 Rust 在你的 `build.rs` 中同时使用此 crate 和 `aarch64-rt` 的 linker script。假设你的 linker script 名为 `memory.ld`:
```
fn main() {
println!("cargo:rustc-link-arg=-Timage.ld");
println!("cargo:rustc-link-arg=-Tmemory.ld");
println!("cargo:rerun-if-changed=memory.ld");
}
```
## 功能特性
`exceptions`、`initial-pagetable` 和 `psci` 默认处于启用状态。
### el1
如果同时启用了 `exceptions` 功能特性,则使用 `vbar_el1` 作为异常向量。如果同时启用了 `initial-pagetable`,则使用 `ttbr0_el1` 作为页表,以及其他 EL1 MMU 配置寄存器。
### el2
如果同时启用了 `exceptions` 功能特性,则使用 `vbar_el2` 作为异常向量。如果同时启用了 `initial-pagetable`,则使用 `ttbr0_el2` 作为页表,以及其他 EL2 MMU 配置寄存器。
### el3
如果同时启用了 `exceptions` 功能特性,则使用 `vbar_el3` 作为异常向量。如果同时启用了 `initial-pagetable`,则使用 `ttbr0_el3` 作为页表,以及其他 EL3 MMU 配置寄存器。
### exceptions
提供异常向量表,并将其设置到所选异常级别对应的 `vbar` 系统寄存器中。你必须通过实现 `ExceptionHandlers` trait,然后调用 `exception_handlers!` 宏来为每种异常提供处理程序。`ExceptionHandlers` 上的所有方法都有默认实现,该实现仅会引发 panic,因此最简单的实现如下所示:
```
exception_handlers!(Exceptions);
struct Exceptions;
impl ExceptionHandlers for Exceptions {}
```
### initial-pagetable
在相应的 TTBR 中设置初始页表,并在运行任何 Rust 代码或写入任何内存之前启用 MMU 和缓存。
如果在 VM 中以 EL1 运行,这一点尤为重要,因为当 hypervisor 或主机对同一内存存在可缓存别名时,在禁用缓存的情况下访问内存可能会导致缓存一致性问题。即使主机不显式访问该内存,推测性访问也可能导致缓存填充。
这可以与 `elX` 功能特性之一结合使用,以便为该异常级别设置页表。如果未结合使用,将在运行时检查异常级别并使用相应的系统寄存器。
### psci
添加 `start_core` 函数,以通过 PSCI `CPU_ON` 调用启动另一个 CPU 核心。这会添加对 `smccc` crate 的依赖。
## 许可证
根据以下任一许可证授权:
- Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license
([LICENSE-MIT](LICENSE-MIT) 或 http://opensource.org/licenses/MIT)
您可任选其一。
## 贡献
如果您想为项目做出贡献,请参阅关于[我们如何接受贡献](CONTRIBUTING.md)的详情。
标签:AArch64, ARM架构, Bootloader, Cortex-A, EL1/EL2/EL3, Hypervisor, MMU配置, no_std, PSCI, Rust语言, 内核开发, 分布式计算, 可视化界面, 向量表, 启动代码, 嵌入式Rust, 嵌入式开发, 异常处理, 操作系统开发, 系统编程, 裸机编程, 运行时环境, 通知系统, 通知系统