liwen01 2024.04.14
前言
我们身边的各种电子设备,手机、手表、相机、个人电脑等等,从用户体验的角度看,好像只要给它们一上电,它们就开始启动可以工作了,这个过程一般是比较短暂的。
从一个嵌入式开发的角度来看,不管是嵌入式系统,还是其它的计算机系统,其启动过程都是一个相对复杂的过程。这个过程一旦出错,基本上设备就不能正常运行了。
(一)嵌入式系统启动
(1)存储架构示意图
我们先看一个嵌入式系统的存储架构示意图
嵌入式设备的存储介质一般有NOR Flash
,NAND Flash
、SD卡
、EEPROM
等,其中根据Flash接口的不同,又可以分期串行Flash(SPI Flash)
和并行Flash
。在芯片内部有它们对应的控制器。
于此同时,一般在芯片的内部,都会有一个比较小的SRAM和ROM,我们一般称它为内部SRAM和内部ROM。
我们的程序,包括系统程序和应用程序,一般都是存放在这些外接的存储介质上。
(2)启动过程
-
芯片上电执行的第一条程序,不是执行放置在外部Flash中的Boot程序,执行的是内部ROM上的程序 -
内部ROM里面的程序,会根据BOOT_SEL引脚的电平状态,判断需要从哪个存储器中启动,然后初始化该存储器的接口 -
存储器接口初始化完成后,将存储设备最开始的一小段程序程序(一般4~5K)加载到内部SRAM,通过这一小部分程序去初始化外部的DDR内存 -
外部DDR初始化完之后,再将Flash中剩下的代码复制到外部DDR中,然后再跳转到外部DDR中去执行BOOT剩下的代码 -
DDR上的BOOT程序会去初始化硬件并引导kernel的启动,随后kernel去挂载根文件系统 -
根文件系统去执行应用程序、并挂载在存储器上其它分区上的文件系统
这里需要对几个知识点需要注意:
-
并不是所有的系统都有BOOT_SEL引脚,在有些SOC上,还会通过BOOT_SEL引脚判断是否在烧录模式 -
如果去分析boot的编译连接脚本,你会发现,放置在boot程序最前面4K位置的代码,都是一些初始化、代码复制、重定位的代码,这部分一般是汇编实现。 -
因为内部SRAM的空间很小,所以内部ROM上的程序才会只复制前面的一小段程序。 -
启动过程的1~4步骤,有叫BOOT的自举,也有的叫BOOT 的重定位。
(3)启动阶段
其实不管是嵌入式系统,还是其它的计算机系统,其启动过程大概都可以分为三个阶段
-
ROM 阶段 -
RAM 阶段 -
BOOT 阶段
ROM阶段:指的是处理器内部的ROM程序阶段,主要作用是加载存储头部的一小段程序到内部RAM上,这部分的程序一般是使用汇编来实现。
RAM阶段:是指外部DDR已经被初始化,并且存储器中的程序已经被重定位到外部DDR上,从这开始,程序的堆栈空间可以被建立起来,C语言可以开始执行。
BOOT阶段:是指开始其它外围硬件初始化和引导系统启动。
(二)计算机系统启动
计算机系统因为历史悠久,外设种类众多,它的启动流程会复杂一些,根据固件类型
(BIOS或UEFI)和分区表类型
(MBR或GPT)的不同,计算机的启动一般可以分为BIOS启动
和UEFI启动
两种。
查资料看文档发现BIOS、UEFI、LEGACY这几个概念有些混乱,没有统一的定义。对大部分来说,它们理解的引导计算机启动的程序就叫BIOS
因此在这之前,我们统一一下说法,计算通过BIOS引导系统启动,根据BIOS固件的不同和磁盘的分区类型不同,又可以分为两种方式:LEGACY(传统BIOS) 和 UEFI启动。
(1)计算机主板接口与组件介绍
要了解计算机的启动流程,我们先看下一台个人计算机的主板上都有些什么接口和组件
主要的组件有:电源
、CPU
、南桥北桥芯片组
、BIOS芯片
、磁盘接口
、还有各种扩展接口和连接器(内存、显卡、网卡声卡等等)
与启动比较相关的是电源
、CPU
、南北桥芯片组
,BIOS芯片
、磁盘
、内存
(1)ATX电源ATX是一种主板的规范、符合ATX规范的电源就叫ATX电源,它的作用是是把交流220V的电源转换为计算机内部使用的5V、12V、24V等不同压值的直流电源。
另外,它还支持电源管理, ATX电源标准接口(如PS_ON、PWR_OK等)与主板通信,以实现电源的管理和控制,包括开机、关机、睡眠模式和节能功能等。
(2)嵌入式控制器(EC)
EC(Embedded Controller)是笔记本电脑上的一个16位小芯片,在不同的设备上,它的名字有些不一样,功能也有些差异:
-
台式机一般使用的是超级输入输出控制器(SIO) -
手机上一般使用的是功率管理集成电路(PMIC) -
笔记本上使用的是嵌入式控制器(EC)
EC的主要功能有:
-
电源管理 -
温度监测和风扇控制 -
输入设备管理 -
系统监控与故障检测 -
启动时序管理 -
电池管理(适用于笔记本电脑)
(3)BIOS芯片
我们常说的BIOS(Basic Input/Output System,基本输入/输出系统),它其实是位于主板上的一块芯片,里面存储着BIOS程序。
它主要负责启动、初始化计算机硬件,引导操作系统启动。
最开始BIOS程序是存储在ROM中,后面存储在EEPROM,现在大多数都存储在Nor Flash中,因为是存储在Nor Flash 中,所以现在的BIOS 程序是可以被升级更新的。
(4)南桥与北桥
南桥和北桥是指计算机主板上的两个重要芯片组,它们协同工作以连接和管理主板上的各种硬件组件。
北桥(Northbridge):
-
位于主板上靠近CPU的区域,负责处理与CPU及高速外设连接相关的任务。 -
包括内存控制器、图形接口(AGP或PCIe)、高速系统总线(例如FSB,Front Side Bus),负责管理CPU与内存之间的数据传输和控制显卡。 -
在较新的主板设计中,随着技术的发展,一些功能逐渐集成到CPU中,北桥的功能逐渐减少。
南桥(Southbridge):
-
位于主板上较远离CPU的区域,负责处理I/O设备和外围总线的控制。 -
包括硬盘控制器、USB控制器、PCI总线、声卡、网卡等外围设备接口,负责管理和控制这些设备。 -
处理I/O设备的低速操作,与北桥的高速总线相对应。
随着技术的发展和新型架构的出现,北桥和南桥的功能划分逐渐变得模糊。现代的芯片组设计趋向于集成更多的功能到单个芯片中,以提高效率并减少组件数量
(5)磁盘
磁盘在前面已经有过介绍
(6)扩展介绍
不同的主板规格,主板上的接口和器件会有差异。
对于台式计算机而言,关机和设备断电,它是处于不同的工作状态的,关机状态下,BIOS和主板上的一些其它器件还是在工作的,比如跟开机按键检测相关的一些器件。
台式机在断电的时候,它里面的时钟也是有在运行,它是通过主板上的纽扣电池来进行供电。纽扣电池最开始是为CMOS供电的,这里的CMOS其实就是一个小的RAM,保存的是用户设置的一些BIOS参数,以及主板器件的一些参数。
(2)LEGACY(BIOS) + MBR 方式启动
LEGACY 方式它只能加载MBR分区格式的引导盘,它的启动方式,大概可以分为6个阶段:
-
CPU上电 -
BIOS硬件检测 -
BIOS更新参数 -
BIOS交出控制权 -
执行MBR引导程序 -
活动分区加载操作系统
(a)CPU上电
-
按下开机键,电源开始给主板和其他器件供电,CPU开始初始化 -
电源稳定后(电源会发出PWR_OK信号),CPU开始从FFFF0H处开始执行指令 -
FFFF0H是BIOS器件在CPU的一个映射地址,这个地址程序的功能是跳转到BIOS的代码处
(b)BIOS硬件检测
-
BIOS 检测系统中的关键器件是否正常,比如内存、显卡 -
BIOS 找到显卡后,调用显卡上初始化代码,完成显卡的初始化 -
BIOS 逐一的查找主板上的其它器件,看它们是否存在 -
BIOS 显示自己的启动画面 -
检测CPU类型和CPU的频率,并显示在屏幕上 -
检测系统中的一些标准硬件设备,比如硬盘,串行接口,并行接口等
(c)BIOS更新参数
-
BIOS完成硬件检测完之后,会去更新ESCD(Extended System Configuration Data,扩展系统配置数据) -
实际是系统硬件配置发生变化才会去更新
(d)BIOS交出控制权
-
BIOS执行完ESCD更新操作后,BIOS会依次去查找磁盘、光盘、U盘等设备上是否有操作系统(该顺序用户可以通过BIOS参数设置)。 -
传统的LEGACY启动方式,它只能识别MBR方式分区的存储设备 -
探测到存储设备存在后,将启动控制权交给MBR分区上的引导程序
(e)执行MBR引导程序
-
先将第0扇区的512字节复制到内存的一个安全区域去执行 -
判断第0扇区的最后两个字节是否为"55 AA",如果不是,提示出错 -
查找分区表中是否有活动分区 -
如果有活动分区,判断活动分区所在的扇区位置 -
将活动分区的引导扇区读入内存中,并判断数据是否合法 -
如果活动扇区数据合法,就将引导权交给活动扇区 -
活动扇区去引导操作系统启动,MBR引导程序退出 -
如果该MBR上没有活动分区,引导权交还给BIOS,由BIOS去查找下一个存储设备
(f)活动分区加载操作系统
-
MBR的引导程序找到活动分区后,会跳转到活动分区所在为止,将引导权交给活动分区 -
活动分区是指包含引导加载程序(Boot Loader)的分区,它负责加载操作系统的核心部分 -
操作系统的引导是由操作系统的类型来决定的。
(3)UEFI+GPT 方式启动
Windows系统中大概的一个启动流程是:
-
计算机上电 -
BIOS自检 -
UEFI固件启动 -
根据RAM中保存的启动顺序加载启动设备 -
判断启动设备中是否存在ESP分区,如果有则加载,没有则下一个存储器中查找 -
读取ESP分区中的EFI应用信息,加载到BCD文件 -
读取BCD文件下的记录以加载系统
在UEFI启动模式中,大部分的工作是在ESP分区中进行
ESP分区ESP(EFI System Partition)是用于存储 EFI(Extensible Firmware Interface)引导加载程序和相关引导文件的分区。它是启动过程中的重要组成部分,包含操作系统引导加载程序、配置文件和其他与引导相关的文件。
与启动比较相关的是下面三个文件:
-
EFI/Boot/bootx64.efi(或bootia32.efi) -
EFI/Microsoft/Boot/bootmgfw.efi -
EFI/Microsoft/Boot/BCD 其中必须要有的是:BCD和bootmgfw.efi 两个文件文件
UEFI BIOS 程序执行阶段
一般分为7个过程:
步骤 | 阶段缩写 | 英文全称 | 中文名字 |
---|---|---|---|
1 | SEC | Security Phase | 安全验证阶段 |
2 | PEI | Pre-EFI Initialization | EFI前期初始化阶段 |
3 | DXE | Driver Execution Environment | 驱动执行环境阶段 |
4 | BDS | Boot Device Selection | 启动设备选择阶段 |
5 | TSL | Transitional System Load | 操作系统加载前期阶段 |
6 | RT | Runtime | 系统运行时阶段 |
7 | AL | System Recovery or Shutdown | 系统灾难恢复期或关机阶段 |
1.SEC(安全验证):安全验证是UEFI启动过程的第一步。在这个阶段,执行UEFI固件的固定代码,主要负责初始化CPU、内存和一些基本的系统硬件。
2.PEI(EFI前期初始化):在这个阶段,UEFI固件负责执行更多的硬件初始化,包括DRAM初始化,建立PEI系统服务,为后续的DXE阶段做准备。
3.DXE(驱动执行环境):DXE阶段是加载和执行UEFI驱动程序的阶段。这些驱动程序可以是固件驱动程序、外部设备驱动程序等,以提供更多的硬件支持和功能。
4.BDS(启动设备选择):在这个阶段,UEFI选择启动设备,例如硬盘、光盘、USB驱动器等。用户可以通过UEFI设置来配置启动顺序。
5.TSL(操作系统加载前期):这个阶段涉及加载操作系统引导加载器,准备操作系统加载。UEFI启动管理器在这个阶段起到关键作用。
6.RT(系统运行时):一旦操作系统加载完成,系统进入运行时阶段。UEFI仍然提供了一些运行时服务,使操作系统能够访问硬件资源。
7. AL(系统灾难恢复期或关机):这是系统的最终阶段,涉及系统的灾难恢复、关机或重启。
(三)各种启动的区别
(1)嵌入式系统与个人计算机启动的区别
嵌入式设备与个人计算机系统,在启动方面,个人认为最大的区别是个人计算机将嵌入式设备系统SOC中大部分的功能放到BIOS上去实现了。主要的原因是嵌入式设备的SOC的外设接口和器件相对比较固定,没有个人PC机的主板这么复杂,所以放在SOC的ROM上去实现会更加的高效。
我们可以从硬件平台、引导程序、启动时间上做简单介绍
1. 硬件平台:
-
嵌入式系统通常设计用于特定用途,硬件资源相对较少,例如智能家居设备、工业控制系统或电子设备。因此,它们的启动过程通常是针对特定硬件的定制化。 -
个人计算机电脑是通用计算设备,硬件配置通常更为复杂和强大,例如桌面电脑、笔记本电脑或平板电脑。
2. 引导加载程序:
-
在个人计算机上,通常使用一个引导加载程序(bootloader)来启动操作系统。这个引导加载程序会加载并运行操作系统的内核,例如Windows的NT Loader或者GNU GRUB。 -
在嵌入式系统中,可能会使用不同的引导加载机制,例如简单的启动加载器(Simple Boot Loader)或直接由硬件启动,如芯片上的固件。
3. 启动时间:
-
由于个人计算机通常具有更复杂的启动过程,包括硬件自检(POST)、引导加载程序和操作系统加载等步骤,因此它们的启动时间可能会相对较长。 -
嵌入式系统通常更注重启动速度和即时响应性,因此它们的启动时间通常更短。
整体来说:嵌入式系统更加注重定制化和高效性,而个人计算机则更注重通用性和功能性。
(2)LEGACY(BIOS) 与 UEFI 启动的区别
它们主要的区别在于启动方式、启动速度、容量限制、图形界面、安全性上
1.启动方式:
-
Legacy BIOS是传统的启动方式,它使用基本输入/输出系统来启动计算机。在这种方式下,计算机会首先执行BIOS固件中存储的启动程序,然后加载操作系统。 -
UEFI是一种新一代的启动方式,它取代了传统的BIOS。UEFI提供了更加灵活和强大的启动环境,支持更多的硬件特性和功能。UEFI启动过程中,计算机会执行存储在UEFI固件中的启动程序,并且可以加载操作系统和引导加载程序。
2. 启动速度:
-
UEFI启动通常比Legacy BIOS启动更快,因为UEFI固件在启动过程中能够更有效地初始化硬件和执行启动程序。 -
Legacy BIOS启动可能会比较慢,因为它是基于较老的技术,并且在初始化硬件和执行启动程序时可能需要更多的时间。
3. 容量限制:
-
Legacy BIOS有一些容量限制,例如对于硬盘分区的大小或启动介质的容量有限制。 -
UEFI则更加灵活,支持更大容量的硬盘分区和启动介质,因此能够更好地适应现代计算机系统的需求。
4. 图形界面:
-
UEFI通常支持图形界面,可以提供更友好的用户交互体验,例如在启动时显示启动菜单或设置界面。 -
Legacy BIOS通常是基于文本界面的,用户交互相对简单,一般通过键盘输入来进行选择和设置。
5. 安全性:
-
UEFI提供了更多的安全功能,例如Secure Boot,可以帮助防止恶意软件在系统启动时加载。 -
Legacy BIOS相对较为简单,安全功能较少,容易受到恶意软件的攻击。
总的来说,UEFI相比Legacy BIOS具有更快的启动速度、更大的容量支持、更丰富的功能和更好的安全性,因此在现代计算机系统中越来越受到广泛应用。
结尾
以前在嵌入式软件开发岗位面试的时候,经常被问到系统启动流程,或者是uboot启动流程介绍。对于系统工程师而言,这些应该是需要熟练掌握,但是对于应用工程师而言,我个人认为只要了解基本流程和概念就可以了。
以上内容,如有错误,欢迎批评指正