theme: channing-cyan
两种启动方式
传统启动方式(LEGACY+MBR)
指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作
UEFI+GPT方式
是新式的启动方式,逐步取代传统启动方式
相对于Legacy+mbr, 优点在启动更快(不要开机自检),最多可支持128个磁盘分区最大可支持18EB硬盘支持图形操作
整体过程
- 打开计算机电源,计算机首先从BIOS开始启动
- BIOS对硬件进行检测,CPU从起始地址为0xFFF0处开始执行程序。BIOS自检的内容主要包括CPU、内存、硬盘等设备和即插即用设备。
- 按BIOS中的设置将硬盘的主引导扇区(第一个扇区)加载到0x7C00,接着启动硬盘上安装的引导程序LILO或GRUB来引导Linux。
- Linux首先进行内核的引导,主要完成磁盘引导、机器状态数据读取、从实模式到保护模式的切换、数据段寄存器加载及中断描述符表设置等。
- 进行系统初始化,执行init程序。init程序调用rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务后返回init。
- 启动mingetty,打开终端供用户登录系统。
这样就完成了从开机到登录的整个启动过程。
详细过程
BIOS
展示
主板上的BIOS芯片
作用
BIOS,Basic Input/Output System,基本输入输出系统。早期的 BIOS 存储在内存的 ROM 中,不会断电消失;现在大多存储在内存的闪存(Flash Memory)中。
-
CPU 加电后会首先执行 BIOS 程序,其中 POST(Power-On Self-Test)加电自检程序是执行的第一个例行程序,主要是对 CPU、内存等硬件设备进行检测和初始化。
-
BIOS 中断调用即 BIOS 中断服务程序,是计算机系统软、硬件之间的一个可编程接口。开机时,BIOS 会通知 CPU 各种硬件设备的中断号,并提供中断服务程序。软件可以通过调用 BIOS 中断对软盘驱动器、键盘及显示器等外围设备进行管理。
-
BIOS 会根据在 CMOS 中保存的配置信息来判断使用哪种设备启动操作系统,并将 CPU 移交给操作系统使用。
流程
-
在CPU加电之后,会把CPU所有寄存器的值设为默认值,除了CS寄存器的值改为0xFFFF,其他寄存器的值都为0,这样,根据CS 和 IP的值就可以找到指令的物理地址0xFFFF:0x0000,也就是0xFFFF0。
-
这时CPU就开始执行在这个位置开始执行,这里存放的一条无条件跳转指令JMP,跳转到BIOS的真正启动代码处。
-
BIOS首先先进行POST(Power-On Self Test,加电后自检)POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
-
BIOS 程序在执 行一些必要的开机自检和初始化后,会将自己复制到从 0xA0000 开始的物理内存中并继续执行
-
然后,BIOS 开始搜寻可引导的存储设备(即根据用户指定的引导顺序从软盘、硬盘或是可移动设备)。如果找到,则将存储设备中的引导扇区读入物理内存 0x7C00 处,并跳转到 0x7C00 继续执行,从而将 CPU 交给引导扇区中的 Boot 程序
引导(Boot)程序
引导顺序
可以在BIOS配置引导设备,接下来以最常见的硬盘启动为例进行说明。
主引导扇区
硬盘被格式化之后被划分为固定容量(一般是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,这是判别引导扇区是否合法的标志
流程
-
BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。
-
MBR代码从磁盘分区表找到活动分区,通过BIOS将活动分区的启动扇区读入内存,并跳转到启动扇区的起始位置。
-
硬盘的MBR装载分区引导扇区,分区引导扇区也称DBR,DBR是程序。
-
DBR装入内存后,即开始执行该引导程序段。
Boot loader
比较流行的引导加载程序(Boot loader)是LILO和Grub,Grub比LILO更好,所以只聊Grub。
GRUB(Grand Unified Boot Loader)拥有强大的交互式命令界面,支持网络引导。GRUB负责装入内核并引导Linux系统。此外,还可以引导其他操作系统,如FreeBSD、DOS和Windows系列。
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
内核初始化的最后一步就是启动 pid
为 1
的 init
进程,这个进程是系统的第一个进程,它负责产生其他所有用户进程。
-
init
以守护进程方式存在,是所有其他进程的祖先。init
进程非常独特,能够完成其他进程无法完成的任务。 -
init
系统能够定义、管理和控制init
进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为init
系统),从而让计算机系统进入某种用户预订的运行模式。 -
仅仅将内核运行起来是毫无实际用途的,必须由
init
系统将系统代入可操作状态。比如启动外壳shell
后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。
总结
最终,Linux启动过程如下图所示:
资料
- bios
- 【博客419】cpu实模式与保护模式
- 操作系统启动过程
- 操作系统启动过程
- 【操作系统】操作系统的启动都干了些什么
- BIOS加电自检的过程是怎样的
- 浅谈操作系统-启动过程
- 关于硬盘主引导扇区的结构及功能全面释疑
- 怎样设置BIOS电脑启动顺序?
- 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
- LINUX 启动过程
- 深入LINUX启动过程
- LINUX启动过程详解
- 解读LINUX启动过程
- LINUX启动过程
最后
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾:
- 设计模式
- 招聘
- 思考
- 存储
- 算法系列
- 读书笔记
- 小工具
- 架构
- 网络
- Go语言