linux0.11,启动流程

在linux0.11版本的boot目录下有三个汇编代码文件:bootsect.s,setup.s和head.s。

    这三个文件虽然都是汇编文件,但是他们语法和所使用的编译器是不一样的,bootsect.s和setup.s是实模式运行的16位代码程序,采用的是intel的汇编语法并且使用的是intel 8086汇编编译器as86和连接器ld86,而head.s是保护模式。采用的是GNU的汇编格式以及GNU的as编译器和连接器。

     linus当时使用两种会编编译器的主要原因是在于intelX86处理器系列GNU汇编编译器仅能支持i386及以后出的CPU代码指令,一直到内核版本2.4.X起,bootsect.s和setup.s才完全使用统一的as编译器来编译。߉

   

    启动流程:

    1.PC上电后,80X86结构的CPU将自动进入实模式,并从物理地址0xFFFF0开始自动执行程序代码,这个地址是ROM-BIOS中的地址。在这里,PC会进行系统检测,并且会在物理地址0地址开始初始化中断向量。然后将1启动设备的第一个扇区将代码bootsect.s读入到内存地址0x7c00处,并且跳转到这里执行。

    2.当执行bootsect.s时,它会把自己移动到内存地址0x90000处,并把启动设备的后2KB字节代码(setup.s)读入到0x90200处,而内核的其他部分代码(head.s和其他的内核代码)将被读入到内存地址0x10000(64K)处。

    3.执行setup.s时,它会把head等内核的代码从0x10000地址处移动到内存的0地址。

    4.从head.s开始,系统就是在保护模式下运行了,所有的32位运行方式的设置启动被完成,分段机制和分页机制都被初始化完成,最后就开始调用main函数进行内核初始化。    


    bootsect.s之所以不直接将内核代码放到0地址处,是因为在BIOS初始化的时候会在物理地址开始的地方存放一个中断向量表,在后面的setup.s会利用ROM BIOS中的中断调用来获取机器的一些参数(显卡模式,硬盘参数等)。

猜你喜欢

转载自blog.csdn.net/qq_32693119/article/details/81055144