背景
MCUboot 是一个成熟的嵌入式设备安全引导加载程序,核心代码由 C 语言编写。然而在其代码仓库中,我们能发现 Cargo.toml、Cargo.lock 等 Rust 项目的典型文件。这是否意味着项目正在从 C 迁移到 Rust?实际情况更加巧妙。

发现
MCUboot 并未重写核心代码,而是在工具层引入了 Rust。 具体来说:
- C 代码仍是主体:引导加载器本身依然用 C 实现
- Rust 用于工具链 :模拟器、测试工具等辅助组件采用 Rust 编写
- 通过 FFI 桥接:两种语言通过外部函数接口(FFI)协作
架构
1. Workspace 结构
根目录的 Cargo.toml 定义了 Rust workspace:

这表明 Rust 代码主要集中在 sim 目录(模拟器组件)。
2. 关键组件
bootsim(sim/Cargo.toml)
-
用 Rust 编写的引导加载器模拟器
-
依赖现代 Rust 生态库(ring、aes、cipher 等)
-
通过 feature 映射调用底层 C 功能
mcuboot-sys
- 标准的
-sys风格 Rust crate - 使用
cccrate 在构建时编译 C 源码 - 提供
extern "C"FFI 接口供 Rust 调用
3. 🎢工作流程

构建过程:
-
mcuboot-sys的build.rs脚本调用cccrate -
将仓库中的 C 代码编译成静态库
-
生成 Rust FFI 绑定
-
bootsim通过这些绑定调用 C 函数 -
实现模拟 flash、签名验证等功能
为什么这样做?
优势
保留既有投资 :无需重写经过验证的 C 代码
现代工具链 :利用 Rust 的包管理、测试框架
渐进式改进 :从工具层开始,风险可控
生态互补:Rust 的密码学库 + C 的底层控制
场景
这种模式特别适合:
- 有大量成熟 C 代码的项目
- 需要更好的开发工具和测试设施
- 希望逐步引入现代语言特性
- 团队同时具备 C 和 Rust 能力
实践
相关文件位置
css
mcuboot/
├── Cargo.toml # Workspace 定义
├── Cargo.lock # 依赖锁定
├── sim/
│ ├── Cargo.toml # bootsim crate
│ └── src/ # Rust 模拟器代码
└── mcuboot-sys/
├── Cargo.toml # FFI 绑定 crate
├── build.rs # C 代码编译脚本
└── src/ # extern "C" 接口
交互
想了解 C/Rust 交互,可以学习下面文件(之后有机会 可以对这部分 开一个专栏,其中代码有很多我们可以学习到的tricks~)
sim/src/ - Rust 如何调用 C 函数

mcuboot-sys/build.rs - C 代码如何被编译

mcuboot-sys/src/ - FFI 绑定的具体实现

总结
MCUboot 的 Rust 集成是一个务实的工程决策:
不是替换,而是增强。通过
-syscrate 模式,让 C 和 Rust 各司其职------C 负责关键的引导逻辑,Rust 提供强大的工具和测试能力。
这种模式在开源社区中越来越常见(如 curl、OpenSSL 等项目),为传统 C 项目提供了一条平滑的现代化路径。对于考虑引入 Rust 的 C 项目,这是一个值得参考的实践案例。
参考
摘要:
MCUboot项目在保持核心C代码不变的同时,巧妙引入Rust构建工具链。Rust主要用于开发模拟器和测试工具等辅助组件,通过FFI与底层C代码交互。这种架构既保留了成熟的C实现,又利用Rust的现代特性增强开发体验。项目采用workspace模式组织代码,mcuboot-sys crate负责编译C代码并提供FFI绑定,bootsim则实现上层工具功能。这种渐进式改造模式为传统C项目现代化提供了可参考的实践路径,在保留既有投资的同时获得Rust生态优势。