Accessing Hardware in Rust
18 hours ago
- #Hardware-APIs
- #Rust
- #Bare-Metal
- Ferrous Systems specializes in bare-metal Rust code, including example code for training, client projects, and open-source contributions.
- Hardware interaction in Rust requires unsafe operations due to the need to command hardware outside Rust's memory model.
- Three common methods for hardware interaction: I/O Read/Write, System Registers, and Memory-Mapped I/O.
- I/O Read/Write involves special instructions for accessing I/O address space, with examples from x86-64 architecture.
- System Registers are processor-specific and require unique identifiers, with examples from Arm and RISC-V architectures.
- Memory-Mapped I/O allows hardware to be accessed within the same address space as memory, requiring volatile operations to prevent optimization.
- Bitfields within registers are used to efficiently pack multiple settings into a single register, with Rust lacking native support for bitfields.
- Documentation is crucial for hardware APIs, with emphasis on clarity for creating hardware objects and accessing registers and bitfields.
- Comparison of hardware abstraction toolkits: svd2rust, tock-registers, safe-mmio, and derive-mmio, each with different approaches and trade-offs.
- svd2rust generates comprehensive code from SVD files but can be difficult to navigate in documentation.
- tock-registers allows peripheral definition in Rust source but uses MMIO references, which are considered unsound.
- safe-mmio avoids MMIO references and solves AArch64 hypervisor issues but has complex constructors and relies on bitflags.
- derive-mmio focuses on documentation-friendly APIs and uses bitbybit for bitfield handling, with potential for future AArch64 support.