x86 linux系统内核引导流程梳理

本文探讨了x86 Linux系统从上电到内核启动的流程,包括BIOS自检、bootloader执行、kernel加载等关键步骤。在实模式下,CPU会自动跳转到BIOS,然后通过bootloader将kernel复制到内存中并启动。bootloader(如bootsect.S、setup.s、head.s)逐步开启32位保护模式,设置全局描述符表、中断描述符表,以及A20地址线。最后,内核通过main.c开始执行,进入用户空间。文章详细解释了内存布局和地址映射,以及在不同阶段涉及的硬件和软件交互。
摘要由CSDN通过智能技术生成

引言:在上节提到双系统关键技术之一关于系统启动问题,即在执行内核代码前做了些什么?是怎样从汇编代码过渡到c代码执行?arm芯片和x86芯片启动有什么不同?

结合这些问题去研究,这里推荐赵炯的《Linux内核完全注释》v3.0,内核版本0.11,内核版本虽然比较低,但理解起来较为容易,更重要的是该书对引导程序的注解非常到位。有些结论就直接引用该书,他山之石可以攻玉。
计算机系统的粗略启动流程:
上电 –> BIOS自检 –> bootloader –> kernel
对Linux x86启动有几个问题值得关注:

  1. 上电后PC指针如何跳转到BIOS程序处?
  2. bootloader的代码放在何处?如何执行bootloader的代码?
  3. bootloader具体做了什么操作?

问题1,书中给出实模式即cpu访问的是实际内存地址,上电和复位后,cpu自动设置了CS和IP的值,此时IP指向0xfffffff0,此处是系统ROM BIOS存放的位置。
对于这样的回答应该不算满意,比如cpu自动设置能修改吗?BIOS代码在何处?此处0xfffffff0如何映射到BIOS的位置?
继续探索得知,BIOS代码存放在ROM(flash)中,而这块ROM的BIOS地址通常放在CPU能寻址的内在最高端,长度256K~2M。这样的确可以解释BIOS程序的执行,那么这个映射是如何完成的?
这里必须提一下32位cpu最大可寻到的物理址4G,这部分地址主要给RAM用(低端地址)ÿ

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值