Accessing Hardware in Rust
2 months ago
- #Hardware-APIs
- #Rust
- #Bare-Metal
- Ferrous Systems专注于裸机Rust代码开发,涵盖培训示例代码、客户项目及开源贡献。
- Rust中的硬件交互因需操控Rust内存模型之外的硬件而必须使用不安全操作。
- 硬件交互的三种常用方法:I/O读写、系统寄存器、内存映射I/O。
- I/O读写涉及访问I/O地址空间的特殊指令,以x86-64架构为例说明。
- 系统寄存器具有处理器特异性,需要唯一标识符,以Arm和RISC-V架构为例。
- 内存映射I/O允许在内存地址空间内访问硬件,需使用volatile操作防止优化。
- 寄存器内的位域用于将多个设置高效打包到单个寄存器,Rust原生不支持位域操作。
- 硬件API文档至关重要,需清晰说明硬件对象创建及寄存器/位域访问方法。
- 硬件抽象工具包对比:svd2rust/tock-registers/safe-mmio/derive-mmio,各有不同实现方式与取舍。
- svd2rust能根据SVD文件生成完整代码,但文档导航较困难。
- tock-registers支持在Rust源码中定义外设,但使用存在内存安全风险的MMIO引用。
- safe-mmio避免使用MMIO引用并解决AArch64虚拟机监控程序问题,但构造函数复杂且依赖bitflags。
- derive-mmio侧重文档友好型API,使用bitbybit处理位域,未来可能支持AArch64。