Linux 系统开机加电后发生了什么?

💡 原文中文,约11000字,阅读约需27分钟。
📝

内容提要

本文介绍了Linux系统的启动流程,包括BIOS自检、引导操作系统、加载MBR、加载操作系统、加载内核等步骤。

🔎

延伸解读

从实模式到保护模式:内核启动的关键跨越

文章指出,内核映像被加载后,会先执行解压缩例程,将压缩的zImage或bzImage解压到高端内存,然后调用start_kernel。这一阶段的核心变化是CPU从实模式切换到保护模式,并建立中断描述符表、全局描述符表和内存分页机制。这意味着启动过程不仅是代码加载,更是运行环境的根本切换,为后续多任务和内存管理奠定基础。

GRUB的三阶段设计:为何能识别文件系统

与LILO使用裸扇区不同,GRUB通过三个阶段的引导加载程序,能够从ext2、ext3等文件系统中加载内核。第一阶段位于MBR,负责启动stage1.5;stage1.5包含文件系统驱动,用于理解内核镜像格式;之后才加载stage2,提供菜单和命令行控制。这种设计让GRUB可以灵活选择内核并修改启动参数,但也增加了引导过程的复杂性。

MBR的512字节限制与分区约束

文章详细拆解了MBR的512字节结构:446字节主引导程序、64字节分区表和2字节结束标志0xAA55。分区表仅能记录四个主分区,每个分区16字节,其中扇区总数字段为32位,因此单个分区最大不超过2TB。若需更大空间,只能提高扇区字节数或增加扇区总数。这解释了传统BIOS+MBR方案在超大硬盘上的局限性。

init进程与运行级别:用户层初始化的起点

内核完成初始化后,会启动第一个用户层进程/sbin/init,它读取/etc/inittab设定运行级别,例如级别5表示有网络和X-Window的多用户模式。随后init执行rc.sysinit脚本,完成设置PATH、启动swap、挂载/proc等基础工作,再根据运行级别运行相应脚本,最后执行rc.local供用户自定义。这一流程决定了系统启动后各服务的启动顺序和最终状态。

❓

Q&A

电脑加电后,CPU为什么不能直接运行硬盘上的操作系统?

因为CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统。操作系统必须先被加载到内存(RAM)中才能运行。

BIOS在启动过程中具体做了哪些关键工作?

BIOS首先进行POST上电自检,检查硬件设备;然后枚举本地设备并初始化;最关键的是在内存低端构建中断向量表和中断服务程序,为启动操作系统做准备;最后按照启动顺序搜索可引导设备,将控制权转交给MBR。

MBR位于硬盘的什么位置?它由哪几部分组成?

MBR(主引导记录)位于硬盘的第一个扇区(0磁头0磁道1扇区),共512字节。它由三部分组成:第1-446字节是主引导加载程序(含可执行代码和错误消息文本);第447-510字节是分区表(64字节,含四个分区记录,每个16字节);第511-512字节是结束标志0x55和0xAA。

GRUB相比LILO有什么优势?它是如何分阶段加载的?

GRUB包含了Linux文件系统的知识,能够从ext2或ext3等文件系统中加载Linux内核,而LILO使用裸扇区。GRUB将两阶段的boot loader转换成三个阶段:stage1在MBR中,启动stage1.5来理解文件系统格式(如reiserfs_stage1_5或e2fs_stage1_5),然后加载stage2,stage2可以显示可选内核清单并提供命令行控制。

Linux内核映像被加载后,内核做了哪些初始化工作?

内核首先进行硬件检测,然后解压缩自身并安装必要驱动,初始化与文件系统相关的虚拟设备(如LVM或RAID),装载根文件系统并挂载根目录,最后在进程空间中加载init程序。

Linux的运行级别有哪些?分别代表什么含义?

Linux的运行级别包括:0关机;1单用户模式;2无网络支持的多用户模式;3有网络支持的多用户模式;4保留未使用;5有网络支持有X-Window支持的多用户模式;6重新引导系统即重启。

init进程在系统启动后期主要执行哪些任务?

init进程是第一个用户层进程,它读取/etc/inittab文件设定运行级别,然后执行rc.sysinit脚本(设定PATH、网络配置、启动swap、设定/proc等),装载内核模块,执行对应运行级别的脚本程序(rc0.d到rc6.d),执行/etc/rc.d/rc.local,最后执行/bin/login程序进入登录状态。

🏷️

标签

➡️

继续阅读