提到 ESP32,大家先想到的是 Wi-Fi、蓝牙和 FreeRTOS。S31 刚公开时,大家比的还是价格:模组能不能接近 ESP32-S3,跟更贵的 ESP32-P4 又差多少。
到了 8 月下旬,乐鑫放出 ESP32-S31 的 Linux BSP 开发者预览,话题才转到「ESP32 也能跑 Linux」。
- 打包:esp-linux-bsp(
integration/v1.0-esp32s31) - 构建:esp-buildroot-external
- 内核:espressif/linux(
integration/v6.18-esp32s31)
1. 为什么这颗ESP32能跑Linux
S31 是双核 32 位 RISC-V,最高 320 MHz,规格书里有 Sv32 页表,也就是 MMU。Linux 靠它做虚拟内存,每个进程有自己的地址空间。以前没有 MMU 的 ESP32 只能硬凑一个裁过的内核,普通程序跑起来别扭,fork 也不顺。S31 有了页表,用起来才比较像常见的嵌入式 Linux。
片上 SRAM 只有 512KB,放不下整个系统。开发板模组多是 16MB Flash 加 16MB PSRAM,系统内存用的就是这颗 PSRAM。16MB 放到电脑上几乎可以忽略。裁剪之后能进命令行,桌面和容器放不下,也当不了树莓派。

芯片 3 月公开,开发板 5 月出来,7 月 27 日量产。量产新闻里写的软件仍是 ESP-IDF、Matter 和 BLE Audio。Linux 是后来单独放出来的预览。
2. 官方给了什么
乐鑫公开了编译和打包用的仓库,可以自己编出镜像。esp-linux-bsp 负责打包,Buildroot 的配置在 esp-buildroot-external,内核是 Linux 6.18 的乐鑫分支。Buildroot 用的是 2025.02,32 位 RISC-V、musl,一并带上 OpenSBI 1.6 和 U-Boot 2024.07。
上电之后是这一串,最后进 root shell:
| 顺序 | 谁 | 干什么 |
|---|---|---|
| 1 | U-Boot SPL | 闪存里最先跑的一段,把后面的程序载起来 |
| 2 | OpenSBI | 内核起来之前的 RISC-V 固件 |
| 3 | U-Boot | 把内核和设备树交出去 |
| 4 | Linux 6.18(XIP) | 指令放在 Flash 里跑,省下 PSRAM |
| 5 | cramfs | 只读的根文件系统 |
这几段合成一个烧录文件 s31_full_flash.bin,从闪存开头一次写进去。默认配置对的是 Function CoreBoard。

仓库里写了:只支持 S31,更新没有固定周期,以后接口也可能改,不建议用在量产和要长期维护的设备上。README 写清楚的是能进 shell,Wi-Fi 通不通没写。规格书里有 Wi-Fi 6、蓝牙 5.4、802.15.4 和千兆以太网,那是芯片带了这些接口。用 ESP32 的人最关心无线。官方说明没有写无线是否已经测通。
cramfs 只能读,在板子上改配置、存日志留不住。串口看日志用 115200。
3. 怎么编译、烧录
CNX 的 Jean-Luc 当时手头没有板子,按文档把镜像编了出来。他机器上的 esptool 4.7 认不出这颗芯片,要换成 5.3 以上。Buildroot 2025.02 和乐鑫的外部配置仓库拉下来之后,用 espressif_esp32s31_function_core_board_nor_defconfig 来配。第一次编译超过一小时,镜像大约 13.1MB。
x86_64 或 AArch64 的 Linux 可以用乐鑫已经编好的 musl 工具链。别的主机在 defconfig 最后加 BR2_TOOLCHAIN_BUILDROOT_MUSL=y。
sh
git clone --branch 2025.02 --depth 1 \
https://gitlab.com/buildroot.org/buildroot.git esp-buildroot
git clone -b buildroot/v2025.02-esp32s31 \
https://github.com/espressif/esp-buildroot-external.git esp-buildroot-external
make -C esp-buildroot \
BR2_EXTERNAL=$PWD/esp-buildroot-external \
O=$PWD/esp32-s31-linux \
espressif_esp32s31_function_core_board_nor_defconfig
ESP_ESPTOOL=$(which esptool) \
make -C esp-buildroot O=$PWD/esp32-s31-linux -j"$(nproc)"
esptool --chip esp32s31 --port /dev/ttyUSB0 --baud 1152000 \
write-flash 0x0 esp32-s31-linux/images/s31_full_flash.bin
按住 Boot 再按一下 Reset,板子进入下载模式。烧录不稳时,把速度改成 460800。写完后用 115200 打开串口,复位,等 root shell。串口名按板子改。Korvo 的日志从 UART Type-C 出来,对应 UART0,GPIO58 发送、GPIO59 接收。
4. 社区把屏幕和无线先调通了
社区刚开始移植的时候,镜像只能进系统,屏幕和无线大多还没通。后面两个仓库补上了一部分,有的能看屏幕、连 Wi-Fi。表里仍标着实验的,还不能当成稳定功能。
| 乐鑫官方 | GrieferPig | annoyedmilk | |
|---|---|---|---|
| 内核 | 6.18 | 6.18,Sv32,双核 | 7.2 |
| 根文件系统 | 闪存里的 cramfs,只读 | SquashFS,上面有一层可写的 | microSD 上的 ext4 |
| 已经能用的 | 进 shell | 串口、重启;Wi-Fi、蓝牙、SD、以太网仍标实验 | Korvo-1 的 800×480 屏、USB 键盘和 U 盘、wpa_supplicant |
GrieferPig 测过的模组是 ESP32-S31-WROOM-3(16MB Flash + 16MB PSRAM),默认 root 没有密码。annoyedmilk 写的是复位后大约 30 秒进 root,串口和屏幕会自动登录。SSH 密码在 README 里,上网之前先改掉。两家都标明还在实验,先别拿去出货。Korvo 上要看屏幕、连 Wi-Fi,用社区镜像。官方这份 cramfs 里没有这些功能。
5. 现在拿来干什么
如果只是接几个传感器、转一颗电机、定时上报,FreeRTOS 更省资源,启动也更快。要用现成的 shell、文件系统和网络工具时,Linux 能少做一层适配,熟悉 Linux 的人接手也更顺。
它比常见单片机更接近一套小系统,又比树莓派更轻、更便宜。无线和常用外设的驱动,官方预览里还没补齐,维护也没有固定节奏。现在适合在板子上把启动过程走一遍,看看 16MB 内存里的 Linux 实际什么样。要出货的产品,继续用 ESP-IDF。
