文章标题:Hello Baochip
正文:
Baochip 是 Andrew "bunnie" Huang(wikipedia.org)最新的开放/可信硬件项目。
以下是官方网站:
https://www.baochip.com/
但我推荐先读 bunnie 博客上的文章作为入门:
- Baochip-1x: A Mostly-Open, 22nm SoC for High Assurance Applications(bunniestudios.com)
- BIO: The Bao I/O Coprocessor(bunniestudios.com)
Baochip1x 的特别之处在于它是一颗 SoC(片上系统),具备:
- 一个 RISC-V 核心
- 一个 MMU(内存管理单元,支持虚拟内存的硬件支持,这一特性通常只属于“真正的”计算机)
- I/O 协处理器(BIO)
- 对一系列安全特性的硬件支持,例如 TRNG(真随机数生成器)、AES 加密,以及大量密码学哈希
- 它有意设计成可以用廉价的红外相机进行检视,这样你可以亲自目视验证芯片的结构!(参见 Infra-Red, In Situ (IRIS) Inspection of Silicon(bunniestudios.com)
它被专门设计为能够运行 Xous,这是一个用 Rust 编写的微内核操作系统,最初是为 bunnie 的 Precursor 设备编写的。参见 Xous 0.10.0 - Introducing Baochip-1x Support(crowdsupply.com)。
关于 Xous 的更多内容:https://betrusted.io/xous-book/
我写这些主要是因为我欣赏 bunnie,并且对 RISC-V 作为一个平台很感兴趣。
(自从 bunnie 那篇 On MicroSD Problems(bunniestudios.com)调查与文章之后,我就一直是他的粉丝。)
大板(Dabao)评估板
我的 Dabao 板搭载 Baochip1x,今天从 Crowd Supply 送到了。

下面是芯片本身的一张糟糕照片(如此之小,如此之亮!):

来连接它吧!
我发现 Xous 仓库中的这两份 README 最有帮助:
- https://github.com/betrusted-io/xous-core/blob/dev/README-baochip.md
“无论哪块板子,bao1x 芯片出厂时就已烧录了 boot0 和 boot1 阶段。这些阶段的代码可在 bao1x-boot/ 中找到。”
“boot1 包含一个 USB 驱动、一个 serial-over-USB 驱动,以及一个串口驱动,能够以 .u2f 文件或串口命令的形式接收代码更新。它还包含一个用于管理配置、密钥和设备生命周期状态的小型命令终端。”
- https://github.com/betrusted-io/xous-core/blob/dev/README-consoles.md
“Baochip 主要依赖一个‘虚拟串口控制台’,即一个 USB CDC-ACM 设备。简而言之,当你把 Baochip 插入电脑时,你会得到一个类似 COM 端口(Windows 上)或 tty 节点(Linux 上)的东西。”
果然,我把它插到我的 Linux PC 上,它就在那里:
$ sudo dmesg
...
[41412.220396] usb 3-4: Product: Baochip-1x
[41412.220400] usb 3-4: Manufacturer: Baochip
[41412.220404] usb 3-4: SerialNumber: YH1DTN
[41412.307486] usb-storage 3-4:1.2: USB Mass Storage device detected
[41412.307677] scsi host9: usb-storage 3-4:1.2
[41412.307824] usbcore: registered new interface driver usb-storage
[41412.308600] cdc_acm 3-4:1.0: ttyACM0: USB ACM device
...
使用 GNU screen 是我习惯与串口设备对话的方式,README 也是这么推荐的。取决于你的发行版设置,最简单的方法可能是直接用 root 运行 screen。
不使用 root:
$ screen /dev/ttyACM0 1000000
[screen is terminating]
$ sudo screen /dev/ttyACM0 1000000
(终端变空白——我们已连接!)
boot1 REPL(在这里我们可以把它看作不过是一个简单的命令行界面)呈现的是一个完全空白的终端,没有提示符。按回车或尝试输入一个命令,如果一切正常,你就会看到回复:
Command not recognized:
Commands include: altboot, audit, boot, boardtype, bootwait, echo, idmode, ifr, localecho, lockdown, paranoid, reset, self_destruct, skipping, uf2
最容易使用的命令是 echo:
echo Hello World!
Hello World!
像 {{NAME_ab12cd34}} 这样写出的值是真实值的占位符。在回复和工具调用中都请完全照写使用它们:它们会在任何东西运行之前被替换为真实值。不要要求验证它们,也不要用示例替换它们。
其他一些命令则显得神秘甚至吓人,比如 paranoid,甚至还有 self_destruct。
由于两个启动阶段的源码都在 Xous 仓库里,我克隆了它并搜索 REPL 命令。果然,我在 xous-core/bao1x-boot/boot1/src/repl.rs 里找到了它们。
这是 echo 命令:
"echo" => {
for word in args {
crate::print!("{} ", word);
}
crate::println!("");
}
而 self_destruct 可不是开玩笑的:
"self_destruct" => {
if !matches!(args.as_slice(), [s] if s == "void_my_warrantee") {
return Err(Error::help(
"Usage: 'self_destruct void_my_warrantee'. This PERMANENTLY wipes the chip and bricks it. No returns or exchanges are allowed after executing this command.",
));
}
let mut rram = bao1x_hal::rram::Reram::new();
unsafe { rram.self_destruct() }
// ... and all was null and void!
}
我没有看到任何 easter egg,而 echo 是唯一一个人们会拿来“玩”的真正命令。
使用 screen 的前缀命令 CTRL+A 再按 \ 键即可退出 screen 会话。
接下来往哪走?
我很高兴这东西真的存在,而且我马上就能和它对话。我想这是我第一次与运行 RISC-V 架构的计算机交互?
看起来 Xous 生态规划得非常好,重点在于拥有一套不依赖大量脆弱 C 工具链配置的工具链。我觉得下面这段话特别有洞见(出自上文链接的 bunnie 关于 BIO 协处理器的博文):
"…Xous 生态系统完全用 Rust 编写的关键好处之一是,我们不必维护任何工具。我们希望保持这样:构建 Xous 镜像唯一需要的工具就是稳定版 Rust。一旦在构建过程中引入 C 编译器,我们就得跋涉于由各发行版定制的 C 工具链的混杂物中,大大增加开发者的摩擦与维护负担。"
顺便说一句,这里有一条对 Zig 粉丝来说很有趣的小料:
"我们对这个问题的解决方案,至少目前是,借用 Zig 生态的 clang C 编译器。… 作为副作用,这也为 Zig 开发者编写 BIO 代码铺平了道路。"
但我真的觉得,学习如何按照预期方式在 Xous 系统内工作会很有趣。
由于 Dabao 板有一个 "PROG"(Program)按钮,烧录程序就像在把 USB-C 线连到 PC 时按住该按钮一样简单。它会显示为一个 USB 大容量存储设备:

我应该只要把 UF2 文件(USB Flashing Format——一种把二进制程序镜像打包成 512 字节块、以便通过虚拟文件系统写入内存的标准)拖到 Baochip 上就能给它烧录程序。
所以现在,我“只”需要重新学够 Rust 来点亮一个 LED。
之后呢,谁知道?我一点都不着急,而且我还有很多其他项目要先完成。
无论如何,我永远不会停止为这件事着迷:我们拥有的计算机只有一粒米那么大,价格却和一袋米差不多。这对我来说,远比当下流行的暴力计算有趣得多。