【操作系统】BIOS+GRUB从通电到开机完成的全过程

引言
操作系统的启动过程是可以分为三个主要部分:BIOS初始化、引导加载、内核初始化。
BIOS初始化
这一阶段的作用是完成硬件自检、确定引导设备并加载MBR到内存。
具体过程:
1.计算机通电后,CS寄存器的值就被设置为0xF0000,IP寄存器的值被设置为0xFFFF0,这个地址被映射到BIOS中。BIOS开始运行,进行POST通电自检,检查CPU、内存、硬盘等硬件是否正常。
2.根据预设的启动顺序搜索可引导设备,按照启动顺序比较各自放置在MBR的位置的结尾两位是否为0xAA55,通过这种方式判断从哪个引导设备进行引导。
3.确定引导设备后,将该引导设备的MBR内容读入到0x7C00的位置,MBR是磁盘的0柱面,0磁道,1扇区(扇区从1开始计数),即引导设备的第一个扇区。
引导加载
这一阶段的主要作用是完成硬件初始化、开启保护模式、选择启动哪个内核并加载到内存中。
GRUB的具体过程:
Stage 1:存储在MBR中,其作用是将stage1.5的代码加载到内存中。
MBR由三部分组成:前446字节是是一段引导程序即GRUB方式中的stage1代码、64个字节的分区表信息、2个字节的签名信息0x55AA。首先检查当前MBR的末尾是否是0x55AA,以确认是有效的引导程序。接着通过安装GRUB时预编译在stage1中的硬编码信息确定stage1.5代码的所在扇区(通常位于MBR与第一个分区之间的空闲扇区),并通过BIOS提供的int 0x13中断读取stage1.5的代码到内存。
Stage 1.5:存储在MBR与第一个分区之间的“空隙”,其作用是通过文件系统将stage2的代码加载到内存中。
stage1.5的二进制文件中预编译了特定文件系统的驱动代码,还预存了stage2代码的路径信息。因此内存中的这部分代码具备对特定文件系统的支持能力。不过虽然通过加载的文件系统驱动可以定位stage2,但因为此时系统尚未进入保护模式,没有可用的操作系统文件系统接口,因此还需要通过BIOS中断int 0x13按扇区地址读取stage2的代码到内存。
Stage 2:存储在/boot/grub,其作用是开启保护模式、选择并加载系统镜像及初始内存盘。
stage2会初始化运行环境与硬件适配,完善内存管理并扩展硬件支持,初始化IDT和GDT开启保护模式。接着通过stage1.5中的文件系统读取配置文件,并展示所有可用启动项。接着根据选择的启动项加载内核镜像及初始化内存盘,并将初始化内存盘的内存地址和大小写入内核启动参数,确保内核启动后能找到并挂载它,最后通过跳转到内核入口(如Linux内核的start_kernel())。
内核初始化
这一阶段的作用是构建内核的核心功能模块,挂载根文件系统并启动init进程,最终为用户空间提供稳定的运行环境。
具体过程:
1.start_kernel() 会依次调用各个子系统的初始化函数,构建内核的核心功能模块。在构建核心框架后,开始识别并初始化硬件设备,确保系统能与外设交互。
2.挂载初始化内存盘作为临时根文件系统,执行其中的/init脚本:加载额外驱动(如LVM、加密分区驱动)、激活逻辑卷、解密根分区,最终找到并准备好实际的根文件系统设备(如/dev/sda2),定位根设备后调用mount_root()挂载实际的根文件系统,切换根目录并释放临时根文件系统。
3.启动init进程,挂载关键文件系统,如/proc、/sys、/dev等文件系统,为设备管理和进程信息提供接口。接着启动系统各项功能服务,然后系统会进入登录界面。用户验证通过后系统会先加载全局的Shell配置文件,然后加载用户的个性化Shell配置,Shell进入交互模式,等待用户输入命令解析执行,并将执行结果返回到终端。

参考一:https://bbs.kanxue.com/thread-284330.htm
参考二:https://www.zhihu.com/column/c_1788144192742117376

posted @ 2025-08-04 19:22  hzx1011  阅读(34)  评论(0)    收藏  举报