1.2 内联装配
02-内联装配 — Comprehensive Rust
2 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/bare-metal/aps/inline-assembly.html
1.2 内联装配
有时我们需要使用汇编来完成 Rust 无法完成的事情 代码。例如,进行 HVC(管理程序调用)来告诉固件 关闭系统电源:
| |
(如果您确实想这样做,请使用 smccc 有包装纸的板条箱
对于所有这些功能。)
- PSCI 是 Arm 电源状态协调接口,是一组标准的 管理系统和 CPU 电源状态等功能。它是 由许多系统上的 EL3 固件和虚拟机管理程序实现。
- 这
0 => _语法意味着在运行之前将寄存器初始化为0 内联汇编代码,然后忽略其内容。我们需要使用inout而不是in因为该调用可能会破坏 寄存器的内容。- 这
main函数需要是#[unsafe(no_mangle)]和extern "C"因为它是从我们的入口点调用的entry.S.
- 只是
#[no_mangle]就足够了,但是 RFC3325 使用 此符号是为了引起审阅者注意可能导致 如果使用不正确,则会出现未定义的行为。_x0–_x3是寄存器的值x0–x3,这通常是 引导加载程序使用它来传递诸如指向设备树的指针之类的东西。 根据标准 aarch64 调用约定(这就是extern "C"指定使用),寄存器x0–x7用于前 8 个 参数传递给函数,所以entry.S不需要做任何事 特殊之处在于确保它不会更改这些寄存器。- 在 QEMU 中运行示例
make qemu_psci在下面src/bare-metal/aps/examples.