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仿真系统里做个试验!!