7 个不稳定版本
0.4.1 | 2023年9月6日 |
---|---|
0.4.0 | 2023年1月26日 |
0.3.1 | 2023年1月18日 |
0.3.0 | 2022年11月21日 |
0.1.0 | 2022年1月28日 |
#270 在 硬件支持
每月下载量 443
8KB
74 行
RISC-V原子仿真陷阱处理器
用于在没有原子扩展的硅上仿真原子扩展的替换陷阱处理器。
用法
我们需要告诉Rust编译器启用原子代码生成。我们可以通过设置一些 rustflags
来实现,如下所示
rustflags = [
# enable the atomic codegen option for RISCV
"-C", "target-feature=+a",
# tell the core library have atomics even though it's not specified in the target definition
"--cfg", "target_has_atomic_load_store",
"--cfg", 'target_has_atomic_load_store="8"',
"--cfg", 'target_has_atomic_load_store="16"',
"--cfg", 'target_has_atomic_load_store="32"',
"--cfg", 'target_has_atomic_load_store="ptr"',
# enable cas
"--cfg", "target_has_atomic",
"--cfg", 'target_has_atomic="8"',
"--cfg", 'target_has_atomic="16"',
"--cfg", 'target_has_atomic="32"',
"--cfg", 'target_has_atomic="ptr"',
]
或者也可以为目标编译,该目标具有启用的原子扩展。例如,一个 riscv32imc
可以使用 riscv32imac
目标。
最后,在 main.rs
中包含此行
use riscv_atomic_emulation_trap as _;
工作原理
最终的二进制文件将包含(原子)硬件不支持的操作;当硬件遇到这些操作之一时,它将产生陷阱,这就是这个crate的作用所在。
此crate覆盖了 riscv-rt
crate的默认陷阱处理器。通过这样做,可以解码指令,检查是否是可以仿真的指令,仿真它,最后将程序计数器(pc)向前移动以继续程序。无法仿真的任何指令都将报告给用户的异常处理器。
此crate的优点
- 非侵入式。其他原子仿真解决方案需要在第三方crate中依赖。但是,使用此crate,您只需将其包含在最终二进制文件中即可。
此crate的缺点
- 与上下文切换、仿真指令和恢复修改后的上下文相关的性能惩罚。根据限制性测试,您可能期望与本地支持的指令相比,执行速度慢2-4倍。
与riscv_rt一起使用
默认情况下,riscv_rt
在异常发生时没有存储足够的寄存器以执行原子仿真。您必须覆盖陷阱行为以捕获平台寄存器 x0-x31
。您可以在v0.3
中查看此crate如何实现示例