文件系统(三):嵌入式、计算机系统启动流程与步骤

liwen01 2024.04.14

前言

我们身边的各种电子设备,手机、手表、相机、个人电脑等等,从用户体验的角度看,好像只要给它们一上电,它们就开始启动可以工作了,这个过程一般是比较短暂的。

从一个嵌入式开发的角度来看,不管是嵌入式系统,还是其它的计算机系统,其启动过程都是一个相对复杂的过程。这个过程一旦出错,基本上设备就不能正常运行了。

(一)嵌入式系统启动

(1)存储架构示意图

我们先看一个嵌入式系统的存储架构示意图

嵌入式设备的存储介质一般有NOR FlashNAND FlashSD卡EEPROM等,其中根据Flash接口的不同,又可以分期串行Flash(SPI Flash)并行Flash。在芯片内部有它们对应的控制器。

于此同时,一般在芯片的内部,都会有一个比较小的SRAM和ROM,我们一般称它为内部SRAM和内部ROM。

我们的程序,包括系统程序和应用程序,一般都是存放在这些外接的存储介质上。

(2)启动过程

  1. 芯片上电执行的第一条程序,不是执行放置在外部Flash中的Boot程序,执行的是内部ROM上的程序
  2. 内部ROM里面的程序,会根据BOOT_SEL引脚的电平状态,判断需要从哪个存储器中启动,然后初始化该存储器的接口
  3. 存储器接口初始化完成后,将存储设备最开始的一小段程序程序(一般4~5K)加载到内部SRAM,通过这一小部分程序去初始化外部的DDR内存
  4. 外部DDR初始化完之后,再将Flash中剩下的代码复制到外部DDR中,然后再跳转到外部DDR中去执行BOOT剩下的代码
  5. DDR上的BOOT程序会去初始化硬件并引导kernel的启动,随后kernel去挂载根文件系统
  6. 根文件系统去执行应用程序、并挂载在存储器上其它分区上的文件系统

这里需要对几个知识点需要注意:

  • 并不是所有的系统都有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的主要功能有:

  1. 电源管理
  2. 温度监测和风扇控制
  3. 输入设备管理
  4. 系统监控与故障检测
  5. 启动时序管理
  6. 电池管理(适用于笔记本电脑)

(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系统中大概的一个启动流程是:

  1. 计算机上电
  2. BIOS自检
  3. UEFI固件启动
  4. 根据RAM中保存的启动顺序加载启动设备
  5. 判断启动设备中是否存在ESP分区,如果有则加载,没有则下一个存储器中查找
  6. 读取ESP分区中的EFI应用信息,加载到BCD文件
  7. 读取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启动流程介绍。对于系统工程师而言,这些应该是需要熟练掌握,但是对于应用工程师而言,我个人认为只要了解基本流程和概念就可以了。

以上内容,如有错误,欢迎批评指正
---------------------------End--------------------------- 如需获取更多内容 请关注 liwen01 公众号

相关推荐
想想吴3 个月前
07 - procfs
文件系统·procfs·proc·seq_file
Adward.xi3 个月前
操作系统真象还原:遍历目录
操作系统·文件系统·系统调用·readdir·sys_readdir·sys_opendir·sys_closedir
GOTXX4 个月前
【Linux学习】文件系统 - 第一篇
android·linux·学习·文件系统
写bug的小屁孩4 个月前
分布式文件存储行业解决方案和技术选型分析
大数据·linux·分布式·开源·云计算·文件系统·minio
JerryHe5 个月前
Android 常用文件系统命令
android·文件系统·常用命令·分区修复
efls1115 个月前
Linux_文件IO
linux·运维·服务器·文件系统
妙BOOK言5 个月前
High Performance Design for HDFS with Byte-Addressability of NVM and RDMA——论文泛读
论文阅读·文件系统
小乌龟不会飞5 个月前
【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念
linux·运维·服务器·文件·文件系统
xuchaoxin13756 个月前
现代操作系统上创建各类链接的方法汇总
文件系统·硬链接·符号链接
DeadPool loves Star6 个月前
论文悦读(8)——Disk文件系统之OptFS(SOSP‘13)文件系统
linux·文件系统·崩溃一致性