一颗带 MMU 的双核 RISC-V 芯片,配上 16MB PSRAM,已经可以启动完整的 Linux 系统。不过现阶段更适合尝鲜,距离产品落地还有一段路。
提到 ESP32,多数开发者首先想到的是 Wi-Fi、蓝牙、FreeRTOS,以及各种低成本物联网设备。
现在,乐鑫准备让 ESP32-S31 再往前走一步:运行 Linux。
乐鑫近日发布了面向 ESP32-S31 的 Linux BSP 开发者预览版。官方已经公开 Buildroot 配置、启动组件、Linux 内核分支和镜像打包工具,开发者可以自行编译系统,并将完整镜像烧录到开发板。
https://github.com/espressif/esp-linux-bsp
这不是社区爱好者做的概念验证,而是乐鑫提供的官方支持。不过“官方”不等于“成熟”。从目前的完成度来看,它更像一套供开发者测试和反馈的早期工具链。
为什么 ESP32-S31 能运行 Linux?
ESP32-S31 是一款双核 RISC-V 微处理器。与过去不少 ESP32 芯片相比,它有一个对 Linux 很重要的硬件单元:MMU,也就是内存管理单元。
Linux 依赖虚拟内存和进程地址空间管理。没有 MMU,虽然也能通过 µClinux 等方案运行经过调整的系统,但软件兼容性和开发体验都会受到限制。ESP32-S31 加入 MMU 后,运行常规 Linux 内核就容易得多。
目前配套开发板还带有 16MB PSRAM。这个容量放在桌面设备上几乎可以忽略,但对于一个经过裁剪的嵌入式 Linux 系统,已经足够完成启动并进入命令行。
需要注意的是,这里的“能跑 Linux”并不意味着它能替代树莓派,也不适合直接运行桌面环境。ESP32-S31 的优势仍然是成本、功耗、无线连接和外围接口。Linux 带来的价值,是更成熟的软件生态和更熟悉的开发方式。
官方 BSP 里有什么?
乐鑫这次公开的内容分布在几个代码仓库中。
esp-linux-bsp 仓库负责镜像布局和打包。构建流程会将 U-Boot SPL、U-Boot FIT 镜像、设备树、XIP Linux 内核和 cramfs 根文件系统合并,最终生成一个可以直接烧录的完整镜像:
s31_full_flash.bin
真正的 Buildroot 配置位于 esp-buildroot-external 仓库。当前方案基于 Buildroot 2025.02,采用32位 RISC-V musl 工具链,主要组件包括:
- Linux 6.18 的 ESP32-S31 分支
系统启动时,会依次经过 SPL、OpenSBI、U-Boot、Linux 内核和根文件系统,最后进入 root shell。
换句话说,这已经是一条完整的 Linux 启动链,不只是单独把内核“点亮”。
实际编译要花多久?
作者 Jean-Luc Aufranc 按照官方文档做了一次编译测试。
首先需要准备 Buildroot 2025.02 和乐鑫的外部配置树:
git clone --branch 2025.02 --depth 1 \ https://gitlab.com/buildroot.org/buildroot.git \ esp-buildrootgit clone -b buildroot/v2025.02-esp32s31 \ https://github.com/espressif/esp-buildroot-external.git \ esp-buildroot-external
随后加载 ESP32-S31 的默认配置:
make -C esp-buildroot \ BR2_EXTERNAL=~/edev/sandbox/esp-buildroot-external \ O=~/edev/sandbox/esp32-s31-linux \ espressif_esp32s31_function_core_board_nor_defconfig
再开始正式编译:
ESP_ESPTOOL=$(which esptool) \make -C ~/edev/sandbox/esp-buildroot \ O=~/edev/sandbox/esp32-s31-linux/ \ -j$(nproc)
由于需要下载软件包并构建完整工具链,首次编译耗时超过一个小时。最终生成的完整 Flash 镜像约为 13.8MB。
还有一个容易踩坑的地方:ESP32-S31 要求 esptool 版本不低于 5.3.0。旧版工具无法正确处理这款芯片。
如何烧录?
开发板进入下载模式后,可以用下面的命令写入镜像:
esptool \ --chip esp32s31 \ --port <serial-port> \ --baud 1152000 \ write-flash \ 0x0 <output-directory>/images/s31_full_flash.bin
如果高速串口连接不稳定,可以将烧录波特率降至 460800。完成烧录后,通过 115200 波特率打开串口,即可查看 Linux 启动日志并进入控制台。
先别急着拿它做产品
这次发布的是 Developer Preview,而不是稳定版。
乐鑫在项目说明中写得很直接:
官方建议将它用于硬件评估、原型开发和兼容性测试,不建议用于量产项目、需要长期维护的设备或关键系统。
现阶段还有一些问题没有明确答案。例如,Wi-Fi 是否已经具备完整可用的驱动支持,官方文档中尚未给出清晰说明。对 ESP32 来说,无线连接恰恰是最受关注的能力之一。
因此,现在最适合做的事情是体验启动流程、检查外设支持,并评估 Linux 在 16MB 内存下的实际运行表现。直接把它写进量产方案,还为时过早。
社区移植已经先行一步
在官方 BSP 发布之前,社区已经开始为 ESP32-S31-Korvo-1 开发板移植 Linux。
其中一个项目基于 Linux 6.12,目前 Buildroot 根文件系统和重启功能可以稳定工作,但关机尚未实现,Wi-Fi、蓝牙双模和双核支持仍处于实验阶段。
另一个社区项目尝试运行 Linux 7.1 和 OpenSBI 1.9。它已经完成基础启动,不过 LCD、microSD、USB Host 和 WLAN Modem 等外设仍未启用。
这些项目说明 ESP32-S31 的硬件确实具备运行 Linux 的条件,也从侧面反映出驱动和外设适配才是接下来最费时间的部分。内核能够启动只是第一关。
GrieferPig 为 ESP32-S31 移植的 Linux 6.12
ESP32 跑 Linux,真正有用吗?
如果只是控制几个传感器、驱动电机或者定时上传数据,FreeRTOS 通常更省资源,启动也更快。换成 Linux 未必划算。
但在另一些场景中,Linux 会带来明显便利。例如,需要使用成熟网络工具、文件系统、Shell 脚本和现成开源程序时,开发者可以少做不少底层适配。熟悉 Linux 的团队也更容易接手应用开发。
ESP32-S31 可能由此进入一个以前不太适合 ESP32 的位置:比常规 MCU 更接近通用操作系统,同时又比传统 Linux SoC 更轻、更便宜。
现在谈它会改变哪类市场还太早。更现实的问题是,乐鑫接下来能否补齐无线和常用外设驱动,并让 BSP 获得稳定、持续的维护。等这些条件满足后,ESP32-S31 才算真正迈进 Linux 设备的门槛。