恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
ESP32的bootloader介绍
首页
资讯中心
/
ESP32的bootloader介绍
ESP32的bootloader介绍
发布时间:2026/10/18 22:07:48
bootloader不是芯片里的 ROM 启动代码而是 ESP-IDF 二级引导程序second stage bootloader。ROM 里的一级 bootloader 固定不可改IDF 把真正选分区、加载 app、做安全校验的逻辑放在 flash 里的这份程序中。它在启动链里的位置上电后大致是三步一级 ROM bootloader芯片内部不可改读 strapping、配 SPI flash从 flash 偏移CONFIG_BOOTLOADER_OFFSET_IN_FLASH把二级 bootloader 拉进 RAM。二级 bootloader本组件产物是bootloader.bin读分区表、选 app、把镜像装进 IRAM/DRAM 或用 MMU 映射然后跳到 app。应用程序启动esp_system里的call_start_cpu0初始化 C 环境和 FreeRTOS最后进app_main。ESP32-S31 上二级 bootloader 烧在0x2000你工程sdkconfig里就是这个值。前面0x0000–0x1FFF留给 Key Manager / Flash Encryption不能当普通代码区用。分区表默认还在0x8000S31 允许把分区表往后推到最多0x17000给 bootloader 腾空间。这个目录实际装了什么它更像 独立子工程 烧录规则真正干活的代码很少路径作用CMakeLists.txt应用工程侧把bootloader.bin挂到idf.py flash偏移用CONFIG_BOOTLOADER_OFFSET_IN_FLASHKconfig.projbuild等日志级别、优化级别、出厂复位 GPIO、WDT、回滚、恢复 bootloader 等选项subproject/真正编译 bootloader 的独立 CMake 工程BOOTLOADER_BUILD1NON_OS_BUILD1subproject/main/bootloader_start.c入口call_start_cpu0()subproject/main/ld/chip/各芯片内存布局。S31 把 bootloader 塞进 ROM 共享缓冲之前的 SRAM避免踩 ROM.data/.bss和启动栈subproject/components/micro-ecc/Secure Boot 验签用的小型 ECC硬件初始化、读分区表、验镜像、装 app 在隔壁组件bootloader_support里。bootloader只编排流程。构建时应用工程会再跑一遍 CMake把subproject编成独立固件。能进 bootloader 的组件很少bootloader_support、hal、log、spi_flash、efuse、micro-ecc等没有 FreeRTOS 调度、没有一般驱动。项目若有bootloader_components/才会额外链进去。运行流程入口ROM 把二级 bootloader 装进 RAM 后跳到call_start_cpu0()void __attribute__((noreturn)) call_start_cpu0(void) { if (bootloader_before_init) { bootloader_before_init(); } // 1. Hardware initialization if (bootloader_init() ! ESP_OK) { bootloader_reset(); } if (bootloader_after_init) { bootloader_after_init(); } // ... deep sleep 快启、选分区、可选 TEE、加载 app ... bootloader_utility_load_boot_image(bs, boot_index); }对应步骤弱符号钩子bootloader_before_init/bootloader_after_init可在工程里覆盖。bootloader_init()关 cache、配 MMU、时钟/UART/SPI、打印 banner、开随机源、按配置开 RTC WDT。Deep sleep 快启可选上次已校验过的 app 地址存在 RTC FAST 里唤醒时跳过大量检查。读分区表按otadata选 factory / OTA0 / OTA1可 GPIO 长按出厂复位或进 test 分区。若开了 TEE先装 TEE 镜像。bootloader_utility_load_boot_image()把选中 app 的 RAM 段拷进去只读段用 flash MMU 映射校验完整性后跳转函数不返回。选分区逻辑还处理 OTA 回滚新固件没esp_ota_mark_app_valid的话下次启动会退回上一槽。它为什么存在ROM bootloader 只会从固定偏移装一段代码。二级 bootloader 才提供分区表factory / OTA / NVS / SPIFFS 等灵活布局OTA 选槽 回滚 / 反回滚Secure Boot、Flash Encryption 初始化验签、解密出厂复位、测试固件、自定义钩子ROM 用 bootloader 自己的镜像头 配 flash模式/频率还比较保守二级 bootloader 起来后会改用 当前选中 app 的镜像头 再配一次 SPI flash所以 OTA 可以改 flash 参数而不必重烧 bootloader。和本工程相关的默认配置当前 Alta / ESP32-S31 工程大致是偏移0x2000按 size-Os编译日志 Info开 RTC WDT超时 9 s防止启动卡死没开 factory reset、app test、secure boot recovery分区表在0x9000起才是 nvs从你之前的编译日志看nvs 0x9000bootloader 必须小于分区表起点否则会报Bootloader binary size is too large芯片也起不来。定制时要注意钩子实现弱符号即可。整份替换参考examples/custom_bootloader。只能用明确支持 bootloader 的 API普通driver不能直接链进来。体积很紧日志级别、优化、分区表偏移都会挤空间。OTA 能升 app不能可靠地 OTA 换 bootloader现场机器要当不可改固件看待。部分芯片还有 Recovery BootloadereFuse 指向另一份备份主 bootloader 头无效时 ROM 会去加载它。一句话components/bootloader是 无 OS 的独立小固件ROM 把它从0x2000S31拉起来后由它完成最小硬件初始化、读分区表、选并装 app再把 CPU 交给应用程序。