揭秘linux系统启动流程

2020年2月19日 评论 233 views 3247字阅读10分49秒

一台linux系统的电脑,从按下开关到登录到系统上整个过程,经历了什么,这是我们这次要讨论的问题。

其实一共有四个阶段
1. BIOS启动引导阶段
2. GRUB启动引导阶段;
3. 内核阶段;
4. init初始化阶段。

1. BIOS启动引导阶段

在通电的瞬间,ROM只读芯片中的开机程序被触发,这个程序开始监测各个硬件的健康状态,监测通过才进行下一步。

这个只读开机程序就叫做"基本输入输出系統"(Basic Input/Output System),简称为BIOS。

健康检查的过程叫做"硬件自检"(Power-On Self-Test),缩写为POST。

上个世纪70年代初,"只读内存"(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。这块芯片里的程序就叫做"基本输入输出系統"(Basic Input/Output System),简称为BIOS。
BIOS主要干了些什么呢?

硬件自检

系统上电开机后,BIOS程序首先检查,计算机硬件(如:CPU、内存、显卡、I/O、键盘鼠标等)能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为POST。

寻找启动设备

当硬件检测通过后,BIOS把控制权转交给下一阶段的启动程序。

下一阶段的启动程序放在哪个设备上呢?

BIOS已经设置好了启动顺序表,如图

按照这个顺序,扫描是否有这些设备插入(比如硬盘、U盘等),如果有而且这些设备也是启动设备,那就把控制权交出去。

那么我们是怎么知道他是个启动设备?以及操作系统的位置在哪呢?

引导启动的两个阶段

MBR

BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。

这时,计算机读取该设备的0柱面0磁道1扇区,也就是读取最前面的512个字节。

如果这512个字节的最后两个字节是0x55和0xAA(主引导记录签名),表明这个设备就是启动设备。

如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。

这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)。

MBR里面存储了系统预启动信息、分区表和主引导记录签名。

MBR上有一个指针,存了下一个引导程序的位置,CPU到该指针所指向的地址读取Boot Loader(引导加载程序)。

Boot Loader(引导加载程序)

对应于Linux系统,就是GRUB,它本身可以看作一个小型操作系统,内置了简单的文件系统,可以读取分区。

所以 grub 启动之后首先用到/boot目录,读取/boot/grub/grub.conf显示启动菜单。

所以GRUB系统的具体作用是
A.提供一块硬盘上所有安装的系统的选择菜单;
B.载入操作linux系统内核,移交控制权给内核;
C.将控制权移交给其他系统的boot loader

也就是说在grub启动,在屏幕上呈现出操作系统的选择菜单,如果你并没有选择linux,而是选择了windows那么grub就会把控制权交给ntldr,进而启动windows操作系统。

内核阶段

在启动菜单选择了内核以后,GRUB会负责解压和装载内核镜像,并且将initrd装载到内存中,最后GRUB初始化内核启动代码,完成之后后续的引导权,被移交给内核。

简单介绍下initrd,initrd是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。

操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。核心文件一般会放在/boot/vmlinuz。

在系统启动的控制权移交给kernel后,Kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。

配置过程中进行设备驱动加载的时候,一部分设备的驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备;另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd中。

initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统时,会先访问initrd文件系统。

将initrd中的内容打开来看,会发现有bin、dev、etc、lib、proc、sys、sysroot、init等文件(包含目录)。

initrd中的内容释放到rootfs(根文件系统)中后,Kernel会执行其中的init文件。

这个时候内核的控制权移交给init文件处理。

驱动加载后,会创建一个根设备,然后将根文件系统以只读的方式挂载。

这步结束后释放未使用内存并执行switch root,转换到真正的根上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。

当这些完成时,用户空间的第一个程序(init)开始执行,这样就开始顶层系统初始化开始了。

Init初始化阶段

在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。

执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了;通过读取配置文件/etc/inittab确定启动后进入的运行级别,在选定运行级别后进入相应的“/etc/rc.d/rcX.d”目录中运行相应的服务内容,该目录下的内容全部都是以S或K开头的链接文件,这些链接文件都链接到“/etc/rc.d/init.d”目录下的各种shell脚本,通过执行这些shell脚本,完成了系统所有的启动任务,linux会启动终端或X-Window来等待用户登录。

QA

RAM与ROM都是半导体存储介质

RAM是随机存取存储器(random access memory),是计算机内部存储器中的一种,也是其中最重要的,计算机和手机中一般把其叫做(运行)内存,它的速度要比硬盘快得多,所以用运行程序在RAM中,而存放运行时不用的数据则在硬盘中,什么时候需要数据,便把数据从硬盘中拿到内存,但同时RAM断电会丢失数据,所以我们电脑如果断电了就会丢失原来正在运行的数据。所以,手机中的RAM和电脑中的RAM的概念是相同的,RAM即内存越大,能同时在内存中执行的程序就越多,性能一般是越好的。

ROM是只读存储器(Read-Only Memory),也是计算机内部存储器中的一种,而硬盘是外部存储器。早期的ROM因为技术不成熟所以无法擦写,出厂后就只能读数据,所以叫只读存储器,BIOS就是写在ROM中的。后来随着技术的发展,在ROM的基础上出现了新的半导体存储介质EPROM和EEPROM,这两种可擦写,这就不符合ROM的命名,但是由于是在ROM的技术上衍变出来的,所以延用了一部分原来的叫法,此时非易失的半导体存储介质开始得以广泛应用,被大量用于电脑主板的bios和嵌入式存储,而后来在这两种技术的发展上又发展出了NAND FLASH闪存。

硬盘分为两种,一种是机械硬盘(即磁盘HDD),一种是固态硬盘(SSD),磁盘和ROM没什么关系,但是固态硬盘就不一样了,固态硬盘用到的颗粒也是基于NAND FLASH技术,和u盘以及手机存储有点相似,所以说硬盘和ROM还是有关系的,固态硬盘是ROM技术发展的产物,但不能说ROM就是硬盘。

引用

CSDN xiebingsuccess 计算机是如何启动的?
https://blog.csdn.net/xiebingsuccess/article/details/91865664

CSDN 温其如玉 Linux操作系统的启动过程
https://blog.csdn.net/jiangsgyx/article/details/83883949

CSDN博主「zhongjin616」
https://blog.csdn.net/zhongjin616/article/details/17630357

weinxin
公众号
在号内与我交流,回复【资源】获取技术大礼包
Linux最后更新:2020-8-31
小熊