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

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 公众号

相关推荐
物联网心球4 小时前
图文详解Linux根文件系统
linux内核·文件系统·根文件系统·ext4·initramfs
Trouvaille ~19 小时前
【Linux】从磁盘到文件系统:深入理解Ext2文件系统
linux·运维·网络·c++·磁盘·文件系统·inode
Trouvaille ~2 天前
【Linux】目录、路径与软硬链接:Linux文件组织的奥秘
linux·运维·服务器·chrome·文件系统·软硬链接·路径缓存
加勒比之杰克5 天前
【操作系统原理】重定向和文件系统
文件系统·os·重定向
列逍9 天前
Linux文件(二)
linux·磁盘·文件系统·挂载·软硬链接·缓冲区
物联网心球11 天前
从ext4文件系统到Linux文件树
linux·linux内核·文件系统
边疆.17 天前
【Linux】文件系统
linux·运维·服务器·磁盘·文件系统·软硬链接
J2虾虾17 天前
华为 Obs 的使用
文件系统·华为obs
做人不要太理性20 天前
【Linux系统】ext2文件系统
大数据·linux·操作系统·文件系统
奔跑吧邓邓子24 天前
【C语言实战(72)】C语言文件系统实战:解锁目录与磁盘IO的奥秘
c语言·文件系统·目录·开发实战·磁盘io