第三天, 一共写了4份代码:
ipl10.asm,引导区代码asmhead.asm 进入32位模式bootpack.c 操作系统naskfunc, bootpack.c需要调用的汇编函数这四部分代码最后编译成了系统盘,也就是操作系统映像。
这个操作系统映像被我们放在了软盘里。
电脑开机后,BIOS程序读区软盘的512字节内容到内存的0x7c00处去执行。
这512四节就是映像文件的第一部分代码ipl10.ams的机器码,引导区的代码,
这个代码主要是把软盘上的系统映像除了启动区程序的其他部分复制到内存的0x8200处。 复制完成后,asmhead.asm的机器电脑码所在内存地址为0xc200。
所以,ipl10.asm最后,跳转到了0xc200处,去执行了asmhead.asm,也就是系统映像的第二部分。
asmhead.asm的机器码所在的内存地址为0xc200处,所以asmhead.asm中有一句:org 0xc200
asmhead.asm 同样还是先复制。把映像的第三部分bootpack.c以及第四部分naskfunc复制到了内存的0x00280000处。然后跳转到了0x0028 0000+ 0x0000001b处,去执行bootpack.c.这就是说跳转到了c代码中去执行。到这里,我们就可以在这个c代码中电脑,去实现操作系统的功能了。
也就是说,用c来完成操作系统的功能。
当然,asmhead.asm还完成了cpu工作模式切换为32位,开启地址线A20,内存使用全局段内存管理表 GDT来管理的方式,这些设置,都是为了能够使用C语言来编写代码所做的准备。
总结:
操作系统映像一共四部分组成:引导区代码,32位模式切换代码,操作系统代码,依赖的汇编函数库。
引导区程序首先被 BIOS程序复制到内存0x7c00处运行。
引导区程序又把32位模式切换代码asmhead,操作系统代码bootpack.c,依赖的汇编函数库 naskfunc复制到内存0x8200处,复制完成后,asmhead执行代码的地址为0xc200,所以,引导区程序的最后,为了去执行asmhead,就跳转到了0xc200处去执行asmhead.
asmhead执行完本来就顺序执行bookrack.c就可以了,但是因为我们要用C 来完成的操作系统的功能,所以需要做一些设置,比如将cpu切换到32位模式,使用全局段内存记录表的形式来管理内存管理。在全局段内存管理表GDT中设置了代码段的地址为0x00280000,所以,就需要将电脑bootpack.c复制到0x00280000处了,这种内存管理的方式,要求把操作系统bootpack.c代码一定要放在GDT规定的内存地址0x00280000处才安全。
设置完,按规定地址复制完,就跳转到了 0x00280000+ 0x0000001b处去执行bootpack.c了。
其实代码中的2*8:0x0000 001b 值的就是0x00280000+ 0x0000001b。
电脑