Linux PC启动原理

启动步骤包括:

  1. 开机加电
  2. BIOS开机自检
  3. 加载GRUB引导
  4. GRUB引导加载操作系统内核程序
  5. 操作系统取得控制权

BIOS自检

在主板上有一个ROM(Read Only Memory,只读存储器),上面固化了一些程序,也就是我们所说的BIOS(Basic Input and Output System,基本输入输出系统),负责检查内存、硬盘、主板、建立中断响亮表并填写中断历程等,如果有问题则启动失败。 
电脑刚加电时,CPU工作模式为实模式,能寻址使用的内存只有1M,空间有限。X86系统将这1M空间的0xF0000—0xFFFFF的内存段用于存放BIOS程序,当电脑刚加电时,会做一些初始化工作,将CS寄存器(即段选择子)设置为0xFFFF,将IP寄存器(偏移地址)设置为0x0000,所以CPU执行的第一条指令就是0xFFFF0(cs << 4 + IP),这就是BIOS程序执行的第一条指令(也许不用知道为啥是这个地址)。然后CPU的控制权就交给了BIOS(就是一个跳转指令,让CPU跳转到这里去执行BIOS的代码)。BIOS程序的最后会去加载启动区里面的引导程序。

加载GRUB引导

操作系统一盘都会安装在硬盘上,硬盘的每个扇区可以存放512个字节的数据,如果是启动盘的话会有一个特点:它的第一个扇区的结尾两个字节分别是0xaa、0x55。这是个约定,当满足这个条件的话,就说明这个硬盘是一个启动盘。这512字节里面会存放代码,BIOS最后就执行就是会把这段代码
当我们在安装Liunx操作系统的时候,会安装GRUB2,GRUB2会把boot.img安装到启动盘的第一个扇区,这个扇区通常称为MBR(Master Boot Record, 主引导记录),boot.img由boot.S编译而来。BIOS完成任务后,会将boot.img从硬盘加载到内存的0x7c00位置(约定好的),并且设置寄存器的值,让CPU后面跳转过来执行boot.img的指令。
由于512个字节有限,boot.img做的事情有限,它又会去加载GRUB2写好的另外的镜像——core.img,它由diskboot.img、lzma_decompress.img、kernel.img、modules&others组成。
boot.img 将控制权交给 diskboot.img 后,diskboot.img 的任务就是将 core.img 的其他部分加载进来,先是解压缩程序 lzma_decompress.img,再往下是 kernel.img,最后是各个模块 module 对应的映像。这里需要注意,它不是 Linux 的内核,而是 grub 的内核。

加载操作系统内核程序

由于前面CPU都处于实模式下,可操作的内存太小,无法装下上G的操作系统,因此lzma_decompress.img在真正解压缩操作系统镜像前,会调用real_to_prot将CPU的工作模式切换到保护模式,这样可以在更大的寻址空间里面,加载更多的东西。切换保护模式需要启用内存分段、内存分页,打开Gate A20。至此,CPU可访问的内存就大了。lzmadecompress.img执行完解压缩之后,会跳转到kernel.img执行,此刻,就会按照grub2的配置文件真正地去加载我们的操作系统了。

操作系统取得控制权

加载完操作系统后,我们后续所有的动作都是由操作系统给我们提供计算机服务了。
操作系统加载总结一句话:BIOS负责自检和加载启动区(GRUB2引导程序),启动区负责加载Linxu操作系统。

参考

https://time.geekbang.org/column/article/89739
https://www.cnblogs.com/flashsun/p/13942138.html
文中如有问题请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值