#risc-v #atomic #emulation

riscv-atomic-emulation-trap

非原子RISC-V目标的原子仿真陷阱处理器

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硬件支持

Download history 315/week @ 2024-04-08 328/week @ 2024-04-15 297/week @ 2024-04-22 281/week @ 2024-04-29 266/week @ 2024-05-06 235/week @ 2024-05-13 232/week @ 2024-05-20 245/week @ 2024-05-27 193/week @ 2024-06-03 134/week @ 2024-06-10 224/week @ 2024-06-17 178/week @ 2024-06-24 30/week @ 2024-07-01 87/week @ 2024-07-08 165/week @ 2024-07-15 144/week @ 2024-07-22

每月下载量 443

MIT/Apache

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如何实现示例

无运行时依赖