C 语言仓库引入 Rust: MCUboot 为例

背景

MCUboot 是一个成熟的嵌入式设备安全引导加载程序,核心代码由 C 语言编写。然而在其代码仓库中,我们能发现 Cargo.tomlCargo.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
  • 使用 cc crate 在构建时编译 C 源码
  • 提供 extern "C" FFI 接口供 Rust 调用

3. 🎢工作流程

构建过程:

  1. mcuboot-sysbuild.rs 脚本调用 cc crate

  2. 将仓库中的 C 代码编译成静态库

  3. 生成 Rust FFI 绑定

  4. bootsim 通过这些绑定调用 C 函数

  5. 实现模拟 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 集成是一个务实的工程决策

不是替换,而是增强。通过 -sys crate 模式,让 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生态优势。

相关推荐
Chester_19997 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲9 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员9 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导9 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan9 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251499 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
q平面人10 小时前
【总工笔记】mindoc平板、桌面端笔记软件,发布到mindoc服务端
rust·tauri·华为平板·mindoc·总工笔记
大衛說11 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
MC皮蛋侠客11 小时前
Tauri 2.x 系列(九):安全模型——Capabilities、Permissions、Scope 与 CSP
rust·tauri
可乐鸡翅yeah_12 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线