google/aarch64-rt

GitHub: google/aarch64-rt

为 ARM64 Cortex-A 处理器上的裸机 Rust 程序提供启动代码、异常处理和页表初始化的运行时库。

Stars: 24 | Forks: 9

# aarch64 裸机启动代码 [![crates.io 页面](https://img.shields.io/crates/v/aarch64-rt.svg)](https://crates.io/crates/aarch64-rt) [![docs.rs 页面](https://docs.rs/aarch64-rt/badge.svg)](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, 嵌入式开发, 异常处理, 操作系统开发, 系统编程, 裸机编程, 运行时环境, 通知系统, 通知系统