外观
Mac 原生编译瑞芯微与地瓜机器人平台
在 Apple Silicon Mac 上,用 arm64 原生容器全量编译 Rockchip RV1126B 与 D-Robotics S100P 两套嵌入式 SDK。 kernel 编译提速 4~7 倍,amd64/x86 原路径零破坏,两平台均已烧录上板验证。
成果
| 指标 | 说明 |
|---|---|
| ~7× | S100P kernel:63.5 → 9.1 min(gcc 整数密集负载下 Rosetta 损耗远超估算) |
| ~4.1× | RV1126B kernel:1217s → 293s(-j14 高并行摊薄了单核损耗,提升倍数低于 S100P) |
| 全链路 | S100P:mcu / kernel / deb-all / 完整镜像 ✓;RV1126B:kernel / buildroot / recovery / update.img / AMP RISC-V MCU ✓ |
| 零破坏 | x86 Linux 原生、Mac+Rosetta、Mac arm64 原生三套并存,同一命令切换 |
总览:怎么跑起来的
平台切换只是一个环境变量,默认仍是 amd64(同事 x86 主机零影响):
| 平台 | 命令 |
|---|---|
| RV1126B | RV1126B_BUILD_PLATFORM=linux/arm64 scripts/docker/build.sh kernel |
| S100P | S100_BUILD_PLATFORM=linux/arm64 west s100-build kernel |
两道入场关卡
血泪前提
没有「区分大小写卷」这个前提,后面一切皆空——内核 netfilter 成对文件会被 macOS 静默合并。
核心突破一:官方根本不给 aarch64 宿主工具链
适配的中心难题:SDK 硬编码 aarch64-none-linux-gnu-* 前缀,但 ARM/Linaro 从来不发布 aarch64 宿主的这个工具链。
配套小修(都因 GCC 11.4 比旧工具链严格):
| 现象 | 根因 | 对策 |
|---|---|---|
RV1126B get_toolchain 直接 exit 1 | 「aarch64 宿主编 aarch64 目标」分支没人写 | 补 native 分支返回 shim 前缀 |
| rtl8733bu 驱动编译报错 | CONFIG_WERROR=y + GCC 11 加强的 -Wmisleading-indentation | native 下追加 KCFLAGS=-Wno-error |
核心突破二:rkbin 是 x86-only,但只卡在打包
另外实测澄清了一个交接误传:check-sdk 根本没有 arch 检查(只查 FSTYPE 白名单 + 工具存在性),arm64 容器直接能过——真正的 x86-only 只有 rkbin。
S100P 全链路
| 关卡 | 坑 | 修法 |
|---|---|---|
| deb-all | 依赖 rootfs sysroot,裸跑直接挂 | 先 image-prepare(下载 samplefs 2.5GB) |
| image-prepare | tar --same-owner 在 virtiofs 被拒(容器 root 实为 uid 501) | 检测 virtiofs 跳过 owner 修正 |
| 打镜像 | mkfs.ext4 -d 对 symlink 报 ENOENT(1.46 太老) | 编译 e2fsprogs 1.47 + -E no_copy_xattrs |
| 首启扩容失败 | 1.47 默认开 orphan_file,板端 1.46 不识别 | mke2fs 加 -O ^orphan_file |
| adb 起不来 | 见下面「三层断案」 | fix_rootfs_ld_path() 落进镜像 |
adb 断案:-ENODEV 不是驱动缺补丁
RV1126B 全链路
AMP MCU 五连坑(RISC-V 固件编通记)
编译查不出的坑
AMP 共享内存地址在 link.lds / ITS / DTS / 三处源码里各硬编码一次——改布局必须 6 处同步,错位只能上板才发现。
buildroot 的坑
| 坑 | 修法 |
|---|---|
| Go 1.4 bootstrap 不支持 aarch64 | 换预编译 Go 1.19 作 stage1 |
| sources.buildroot.net 国内 ~1KB/s | 大包手动下载放 dl/ |
rkaiq 的 j2s 宿主工具硬编码 x86 标志(-m64 等) | 直接删掉(本就冗余) |
rsync --exclude 'rockdev/' 误伤打包工具目录 | 改顶层锚定 '/rockdev/' |
烧录:两家各一套机制
| RV1126B(Rockchip) | S100P(D-Robotics) | |
|---|---|---|
| 工具 | upgrade_tool / rkdeveloptool | Horizon fastboot(flash_all.sh -m all) |
| 进下载模式 | adb reboot loader,等 5-18s 枚举(Vid 0x2207) | 串口连发 Ctrl+C 打断 0 延迟 autoboot → Hobot$ → fastboot 0 |
| 关键细节 | mac 版工具需 unzip + chmod | \x03 必须 ~100ms 间隔逐个发;10ms 连发会淹没 U-Boot 输入缓冲反而失败 |
工具链分发:重要的工具,自己托管一份
换机、换同事、上游链接失效都不怕——构建时自动补齐,实测公网 24 MB/s。
踩坑速查
| 现象 | 根因 | 修法 |
|---|---|---|
| kernel 成对文件丢失 | APFS 大小写不敏感 | 区分大小写卷 |
| check-sdk 报 ext4 | virtiofs 不在白名单 | Docker 卷构建 |
| 容器 apt 代理 refused | 容器内 127.0.0.1 是容器自己 | 代理写 host.docker.internal |
| "no name for user ID 501" | Mac uid 无容器用户 | Dockerfile ARG 动态建用户 |
| docker build 拉 metadata 超时 | auth.docker.io 需代理 | 仅给 metadata 设代理,apt 走直连 |
| 改了源码重跑仍报旧错 | buildroot .stamp_extracted 门控 | rm -rf output/*/build/<pkg>-* |
| adb 多台报 more than one | 两台板子并存 | ANDROID_SERIAL=<序列号> 指定 |