Hasty Briefsbeta

双语

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。