揭秘linux系统启动流程,面试官问起来再也不怕了

简介: 揭秘linux系统启动流程,面试官问起来再也不怕了

image.png一台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已经设置好了启动顺序表,如图


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAvMDIvMjUvMkUwNjhCQUE0RjRCNDU2MzhBRkRBNUVBMTkzMTRCNkMuanBn.png


按照这个顺序,扫描是否有这些设备插入(比如硬盘、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显示启动菜单。


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAvMDIvMjUvNTE3Q0I0MTE3OEYyNEY5NzlGMEUxRDg1QjgxQzlEREUuanBn.png


所以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就是硬盘。

相关文章
|
3天前
|
监控 Linux 数据处理
lslocks:Linux系统中的锁信息查看利器
`lslocks`是Linux工具,用于查看系统上的文件锁信息,帮助诊断进程同步问题。它显示持有锁的进程、锁类型(如POSIX、flock)和状态。通过简洁的输出,用户能识别死锁和资源争用,优化性能。结合其他命令如`grep`和`awk`可增强分析能力。需适当权限运行,定期监控以预防并发访问问题,处理死锁时要谨慎。
|
3天前
|
监控 Linux 数据处理
探索Linux中的`lsmem`命令:深入了解系统内存布局
`lsmem`是Linux命令,用于显示系统内存布局和大小,帮助管理员和开发者理解内存使用情况。它提供详细输出,包括内存块的大小、范围、类型和关联,支持多种格式展示,如树状图。命令参数如`-h`显示帮助,`-t`以树形展示,`--human-readable`使大小更易读。需root权限运行,常与`free`、`vmstat`等工具结合使用,用于监控和优化内存。注意不同发行版可能存在兼容性差异。
|
4天前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
|
4天前
|
存储 安全 Linux
一行代码使Linux系统崩溃?
一行代码使Linux系统崩溃?
13 1
|
5天前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第一篇(存储引擎与Linux系统上安装MySQL数据库)
MySQL数据库进阶第一篇(存储引擎与Linux系统上安装MySQL数据库)
|
2天前
|
关系型数据库 MySQL Linux
Linux系统中Mysql5.7建立远程连接
Linux系统中Mysql5.7建立远程连接
4 0
|
4天前
|
网络协议 Linux Shell
【权限提升】Linux系统&Docker挂载&Rsync未授权&Sudo-CVE&Polkit-CVE
【权限提升】Linux系统&Docker挂载&Rsync未授权&Sudo-CVE&Polkit-CVE
|
1月前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
571 0
|
9月前
|
缓存 Ubuntu Linux
Vim编辑器入门指南:安装、基本操作和高级技巧详解 | 适用于Linux系统
Vim编辑器入门指南:安装、基本操作和高级技巧详解 | 适用于Linux系统
397 0
|
1月前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
45 0