嵌入式系统启动流程对比
对比了各类嵌入式系统启动流程
·
裸机启动流程
“裸机”指直接运行在硬件上的程序(无操作系统,通常是MCU/单片机),启动流程极简:
-
硬件复位
- 上电/复位后,CPU强制从固定启动地址(如0x00000000)读取指令(该地址通常映射到片内Flash或ROM)。0x0000000此处存储的是向量表的起始地址,向量表的第 1 项是栈顶地址,第 2 项是复位中断服务程序(Reset_Handler)的入口地址。。
-
初始化与执行
- 启动地址的程序直接包含硬件初始化逻辑:设置堆栈指针(SP)、配置时钟(如晶振→PLL)、初始化GPIO/UART等外设。这些代码通常位于启动文件(如 STM32 的startup.s)或初始化函数(如SystemInit())。
- 无中间层(无BootLoader/OS),初始化后直接运行应用逻辑(如传感器采集、电机控制)。
特点:程序必须包含所有硬件驱动和逻辑,适用于简单场景(如单片机控制LED、温湿度采集)。
STM32启动流程(以Cortex-M内核为例)
STM32是基于ARM Cortex-M系列内核的嵌入式微控制器,其启动流程由硬件复位逻辑和启动模式共同决定,核心是从指定存储介质加载程序并跳转执行:
-
硬件复位阶段
- 芯片上电或复位引脚触发后,硬件自动执行复位序列:关闭中断、初始化部分核心寄存器(如PC指针、SP指针)。
- 复位后,
PC(程序计数器)强制指向启动地址(0x00000000),SP(栈指针)从启动地址+4的位置读取(即向量表第0项为栈顶地址,第1项为复位中断服务程序入口)。
-
启动模式选择
STM32通过BOOT0、BOOT1引脚电平决定启动介质(如Flash、SRAM、系统存储器):- 若从Flash启动(最常用):程序存储在片内Flash,启动地址映射到Flash基地址(0x08000000),向量表默认位于此处。
- 若从系统存储器启动(ISP模式):执行芯片出厂固化的BootLoader(用于通过UART/SPI等更新程序)。
-
向量表与中断服务程序
- 启动地址处是向量表(中断服务程序入口地址的数组),第1项为复位中断服务程序(Reset_Handler)。
- 硬件自动跳转到Reset_Handler执行:初始化系统时钟(如PLL)、配置外设、初始化堆栈,最终调用
main()函数。
-
进入应用程序
- Reset_Handler执行完毕后,跳转到用户编写的
main()函数,开始运行应用逻辑。
- Reset_Handler执行完毕后,跳转到用户编写的
Linux嵌入式设备启动流程
嵌入式Linux设备(如ARM开发板)的启动依赖“硬件初始化→BootLoader→内核→根文件系统”的链式加载,核心是从存储介质加载并启动操作系统:
-
BootROM阶段(固化初始程序)
- 上电后,CPU从固化的BootROM(只读存储器) 开始执行(如ARM的iROM、MIPS的BootROM)。
- 功能:初始化最小硬件(如时钟、SPI/NAND控制器),检测启动介质(eMMC、SD卡、NAND Flash),加载BootLoader到片内RAM。
-
BootLoader阶段(如U-Boot)
- BootLoader是用户可定制的引导程序,分两个阶段:
- 阶段1(汇编实现):初始化关键硬件(DDR内存、串口),将自身剩余部分加载到DDR。
- 阶段2(C实现):解析启动参数(如从环境变量读取内核地址),加载Linux内核和设备树(Device Tree)到DDR指定地址。
- 最终通过
bootm或bootz命令跳转到内核入口(如0x80008000)。
- BootLoader是用户可定制的引导程序,分两个阶段:
-
Linux内核启动
- 内核启动:解压自身(若内核是压缩的),初始化核心组件(进程管理、内存管理、中断系统),解析设备树(识别硬件),挂载根文件系统(通过
root=参数指定,如/dev/mmcblk0p2)。 - 启动
init进程(PID=1,如systemd、busybox init),作为用户空间第一个进程。
- 内核启动:解压自身(若内核是压缩的),初始化核心组件(进程管理、内存管理、中断系统),解析设备树(识别硬件),挂载根文件系统(通过
-
用户空间启动
init进程加载配置文件(如/etc/inittab),启动服务(如网络、驱动),最终进入命令行或应用程序。
Windows设备启动流程
- 启动自检阶段:设备通电后,首先会读取BIOS(基本输入/输出系统)或UEFI(统一可扩展固件接口),对内存、CPU、硬盘、键盘等设备进行自检。此阶段屏幕上会显示自检相关的打印信息,若检测到硬件故障,可能会报警或显示错误提示。
- 初始化启动阶段:BIOS或UEFI会根据预设的启动顺序,查找可启动的优先设备,如本地磁盘、CD - Driver、USB设备等,并准备从该设备启动系统。此时屏幕一般为黑屏状态。
- Boot加载阶段:若从硬盘启动,会从启动分区(如C盘)加载Ntldr(Windows Vista之前的系统)或bootmgr.exe(Windows Vista及之后的系统)。Ntldr会设置内存模式,若是x86处理器且操作系统为32位,则设置为32 - bit flat memory mode,若为64位操作系统+64位处理器,则设置为64位内存模式。然后启动文件系统,读取boot.ini文件(用于确定启动选项)。如果按F8或存在多系统时,会显示启动选项菜单,否则屏幕仍为黑屏。
- 检测和配置硬件阶段:系统开始检查和配置一些硬件设备,包括系统固件(如时间和日期)、总线和适配器、显示适配器、键盘、通讯端口、磁盘、软盘、输入设备(如鼠标)、并口以及在ISA总线上运行的设备等。此过程屏幕依旧是黑屏。
- 内核加载阶段:Ntldr或bootmgr.exe将首先加载Windows内核Ntoskrnl.exe和硬件抽象层(HAL)。接着从注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet下读取这台机器安装的驱动程序,并依次加载。驱动程序加载完成后,系统会创建系统环境变量,启动win32.sys(Windows子系统的内核模式部分)、csrss.exe(Windows子系统的用户模式部分)和winlogon.exe,创建虚拟内存页面文件,还可能对一些必要的文件进行改名(主要是驱动文件)。此时屏幕会显示Windows logo界面和进度条。
- 登录阶段:系统会启动机器上安装的所有需要自动启动的Windows服务,启动本地安全认证Lsass.exe,然后显示登录界面,等待用户输入用户名和密码进行登录,登录成功后,系统启动完成,用户可开始使用计算机。
总结
- 复杂系统(Linux电脑/嵌入式)依赖“固件→BootLoader→内核→用户空间”的链式加载,核心是分层初始化硬件并加载更大的程序。
- 简单系统(STM32裸机、无BootLoader)直接从固定地址执行,程序需包含所有硬件初始化逻辑。
- BootLoader的作用是“桥接硬件与目标程序”,解决“目标程序太大无法直接从ROM执行”或“需要灵活加载不同程序”的问题。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)