我正在研究x86系统引导的过程
这是启动流程:

BIOS将引导程序从磁盘MBR加载到0x7c00内存地址
布尔复制自身到0x90000的内存地址并跳转到0x90000.
从磁盘到0x90200内存地址的布尔加载设置.
获取一些系统外围设备参数(视频,根磁盘,键盘等),然后跳转到0x90200.
将系统切换到保护模式,将内核从0x10000(64K)移至0x0000
跳转到0x0000并执行head.s进行内核引导

我的问题是,为什么我们需要首先将bootsect自身移动到0x90000?

为什么我们不能只移动设置和系统?

谢谢.


解决方法:

我认为,将引导扇区移开主要是为了方便起见-没有严格的技术理由无法通过其他方式完成引导扇区.

就是说,从内存开始,0x7c00小于32KiB.对于内核的设置阶段而言,32KiB通常是不够的,更不用说内核本身了. 0x90000恰好位于PC BIOS保留的区域之内,同时还为内核保留了足够的空间.

无论如何,Linux内核已经有好几年没有使用您所指的过程了.您提到的地址由v2.02之前的Linux Boot Protocol版本使用,该地址最初与linux-2.4.0一起使用.我认为内核本身不再可以直接用linux-2.6.0引导.当有人尝试直接引导内核时,该版本的arch / i386 / boot / bootsect.S文件将输出一条消息,表示该信息.

如今,内核通常是由单独的引导程序加载的,只要符合引导协议,就可以随意使用所需的任何方法.引导加载程序可能有多个阶段,甚至可能执行内核级的操作,例如切换到protected mode本身.

标签: linux, x86, linux-kernel

相关文章推荐

添加新评论,含*的栏目为必填