Linux引导初始化--代码搬移过程

本文深入解析Linux系统的启动过程,从BIOS加载引导扇区开始,详细介绍bootsect.s、setup.s和head.s三个关键汇编程序的作用及它们如何协同工作,完成从实模式到保护模式的过渡,最终引导Linux内核的加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                        Bootsect过程

应用程序通过int 0x80中断将CPU从用户态USER切换到核心态KERNEL。

Linux内核由内存管理模块、进程调度模块、文件系统模块、进程间通信模块和网络接口模块构成。

boot目录下三个汇编程序,其中bootsect.s和setup.s使用的是Intel格式的汇编语言编写,编译器需要使用as86,链接器使用ld86;

第三个汇编程序head.s使用的是AT&T格式的汇编语言编写,使用GNU的as编译。使用两种编译器的原因是GNU的as编译器仅支持i386及以后的CPU,不支持生成运行在实模式下的程序。

初始化过程概述:

上电后,CPU进入实地址模式,从地址0xFFFF0(1M-15)处开始执行,这个地址是ROM-BIOS的地址。BIOS会先执行系统自检,并在物理内存0处初始化中断向量。然后BIOS将可启动设备的磁盘引导扇区(512字节)读入绝对地址0x7C00(31K)内存处并跳转到这里开始执行代码。

磁盘引导扇区起始的512字节就是bootsect.s编译产生的可执行代码。这个初始化过程可以用下图来描述:

bootsect首先将自己搬移到0x90000(576K)内存处,然后跳转到这里继续执行。bootsect占512字节,因此setup在被从磁盘移动时,紧接其后从0x90200(576K+512字节)处开始放置。而System模块也被bootsect搬移到了0x10000(64K)。代码从bootsect跳转到setup执行,setup把system模块从0x10000(64K)处再被搬移到0x0地址,代码从setup跳转到0地址处的head继续执行。整个代码搬移和运行就是这样的。

注:bootsect可执行代码被BIOS从引导扇区copy了一次,然后又被自身copy到了0x90000处,为什么?

这个在网上有网友说:这是THE LINUX/I386 BOOT PROTOCOL规定的。暂且这么认为吧,因为毕竟不做第二次copy应该也没有什么问题,这个可以在Bochs仿真系统里做个试验!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值