Linux启动过程

72 阅读8分钟

两种启动方式

传统启动方式(LEGACY+MBR)

指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作

UEFI+GPT方式

是新式的启动方式,逐步取代传统启动方式

相对于Legacy+mbr, 优点在启动更快(不要开机自检),最多可支持128个磁盘分区最大可支持18EB硬盘支持图形操作

整体过程

screenshot-20230209-132105.png

  1. 打开计算机电源,计算机首先从BIOS开始启动
  2. BIOS对硬件进行检测,CPU从起始地址为0xFFF0处开始执行程序。BIOS自检的内容主要包括CPU、内存、硬盘等设备和即插即用设备。
  3. 按BIOS中的设置将硬盘的主引导扇区(第一个扇区)加载到0x7C00,接着启动硬盘上安装的引导程序LILO或GRUB来引导Linux。
  4. Linux首先进行内核的引导,主要完成磁盘引导、机器状态数据读取、从实模式到保护模式的切换、数据段寄存器加载及中断描述符表设置等。
  5. 进行系统初始化,执行init程序。init程序调用rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务后返回init。
  6. 启动mingetty,打开终端供用户登录系统。

这样就完成了从开机到登录的整个启动过程。

详细过程

BIOS

展示

主板上的BIOS芯片

bba1cd11728b4710a7bf531ecdcec3fdfd03234b.jpeg

bios.webp

作用

BIOS,Basic Input/Output System,基本输入输出系统。早期的 BIOS 存储在内存的 ROM 中,不会断电消失;现在大多存储在内存的闪存(Flash Memory)中。

  1. CPU 加电后会首先执行 BIOS 程序,其中 POST(Power-On Self-Test)加电自检程序是执行的第一个例行程序,主要是对 CPU、内存等硬件设备进行检测和初始化。

  2. BIOS 中断调用即 BIOS 中断服务程序,是计算机系统软、硬件之间的一个可编程接口。开机时,BIOS 会通知 CPU 各种硬件设备的中断号,并提供中断服务程序。软件可以通过调用 BIOS 中断对软盘驱动器、键盘及显示器等外围设备进行管理。

  3. BIOS 会根据在 CMOS 中保存的配置信息来判断使用哪种设备启动操作系统,并将 CPU 移交给操作系统使用。

流程

BIOS.png

  1. 在CPU加电之后,会把CPU所有寄存器的值设为默认值,除了CS寄存器的值改为0xFFFF,其他寄存器的值都为0,这样,根据CS 和 IP的值就可以找到指令的物理地址0xFFFF:0x0000,也就是0xFFFF0。

  2. 这时CPU就开始执行在这个位置开始执行,这里存放的一条无条件跳转指令JMP,跳转到BIOS的真正启动代码处。

  3. BIOS首先先进行POST(Power-On Self Test,加电后自检)POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。

  4. BIOS 程序在执 行一些必要的开机自检和初始化后,会将自己复制到从 0xA0000 开始的物理内存中并继续执行

  5. 然后,BIOS 开始搜寻可引导的存储设备(即根据用户指定的引导顺序从软盘、硬盘或是可移动设备)。如果找到,则将存储设备中的引导扇区读入物理内存 0x7C00 处,并跳转到 0x7C00 继续执行,从而将 CPU 交给引导扇区中的 Boot 程序

引导(Boot)程序

引导顺序

可以在BIOS配置引导设备,接下来以最常见的硬盘启动为例进行说明。

c83d70cf3bc79f3daea78e49b6a1cd11728b2900.webp

主引导扇区

硬盘被格式化之后被划分为固定容量(一般是512B)的数据块,每个数据块被称为一个扇区(sector)。

硬盘的第一个扇区被称为主引导扇区(0磁头0磁道1扇区,bootsector),它在所有的系统分区之前不属于任何系统分区。主引导扇区由主引导记录(Master Boot Record,MBR)、磁盘分区表(Disk Partition Table,DPT)和引导记录标识(Boot Record ID)3个部分组成:

  • MBR占用主引导扇区的前446个字节(bootloader),存放系统主引导程序,负责从活动分区中装载并运行系统引导程序
  • DPT占用64个字节,记录磁盘的基本分区信息。磁盘分区表分为4个分区项,每项16字节,分别记录每个主分区的信息,因此最多可以有4个主分区。其中只有一个活动分区(Active Partition)
  • Boot Record ID占用2个字节。对于合法的引导扇区,它等于0xAA55,这是判别引导扇区是否合法的标志

微信图片_20230221200203.jpg

f2f3f639900acc36dc374b87cf60b13f.png

流程

截图-2023-02-23-154519.png

  1. BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。

  2. MBR代码从磁盘分区表找到活动分区,通过BIOS将活动分区的启动扇区读入内存,并跳转到启动扇区的起始位置。

  3. 硬盘的MBR装载分区引导扇区,分区引导扇区也称DBR,DBR是程序。

  4. DBR装入内存后,即开始执行该引导程序段。

Boot loader

比较流行的引导加载程序(Boot loader)是LILO和Grub,Grub比LILO更好,所以只聊Grub。

GRUB(Grand Unified Boot Loader)拥有强大的交互式命令界面,支持网络引导。GRUB负责装入内核并引导Linux系统。此外,还可以引导其他操作系统,如FreeBSD、DOS和Windows系列。

LL4-4.png

GRUB包含两个阶段:Stage 1和Stage2。Stage1被安装到磁盘的MBR,它直接加载Stage2并执行跳转。Stage2主要功能是为了加载其他操作系统。Stage2首先把系统切换到保护模式,设置好C语言运行环境。系统执行时首先查找配置文件(如grub.conf和menu.lst)。如果没有,则执行一个Shell,并等待用户输入命令。当用户输入boot命令时,将控制权转移给操作系统。

加载内核(Kernel)

当Stage 2 bootloader已经被加载到内存中,文件系统被识别到,并且默认的内核镜像和initrd镜像被加载到内存中。

内核镜像已经准备好,并且控制权从Stage 2 bootloader传递过来,启动过程的Kernel阶段就可以开始了。内核镜像并非直接可以运行,而是一个被压缩过的,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。

init

内核初始化的最后一步就是启动 pid1init 进程,这个进程是系统的第一个进程,它负责产生其他所有用户进程。

  1. init 以守护进程方式存在,是所有其他进程的祖先。init 进程非常独特,能够完成其他进程无法完成的任务。

  2. init系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预订的运行模式。

  3. 仅仅将内核运行起来是毫无实际用途的,必须由 init 系统将系统代入可操作状态。比如启动外壳 shell 后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。

总结

最终,Linux启动过程如下图所示:

Linux启动过程.png

资料

  1. bios
  2. 【博客419】cpu实模式与保护模式
  3. 操作系统启动过程
  4. 操作系统启动过程
  5. 【操作系统】操作系统的启动都干了些什么
  6. BIOS加电自检的过程是怎样的
  7. 浅谈操作系统-启动过程
  8. 关于硬盘主引导扇区的结构及功能全面释疑
  9. 怎样设置BIOS电脑启动顺序?
  10. 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
  11. LINUX 启动过程
  12. 深入LINUX启动过程
  13. LINUX启动过程详解
  14. 解读LINUX启动过程
  15. LINUX启动过程