终于从保护模式走出来了。太艰难了。
现在我们将正式从引导扇区开始,编写Loader和内核。
由于引导扇区只有512字节,不够完成初始化和载入内核的工作,所以我们要写一个Loader,从引导扇区跳到Loader,由loader完成一切准备工作,然后进入内核。
用bximage创建软盘,在freedos中使用format B格式化B盘,用ultraISO向软盘中加入文件。
在centos中安装bochs,很艰难,递归解决了将近一百个包依赖。x11等
一、FAT12格式
可是引导扇区怎么找到loader?说的轻巧,loader将是一个文件,这就涉及到在软盘中寻找目标文件的工作。
FAT12详解 这位前辈的文章写的清楚明了,值得一看。为了在软盘中找到对应文件,
FAT12文件系统使用情况: 引导扇区(1)->FAT1(9)->FAT2(9)->根目录区(any)->数据区(other)
根目录区的第一个字节地址是0x2600H = 19*512D,如图:
那么根目录区占了多少簇?
根目录中一个条目占32字节,最多0xE0个条目,所以根目录占0xE0*32个字节,除以512 = 14,所以根目录占14个簇。(在这里一个簇只包含一个扇区)
所以数据区开始于19+14=33号扇区,即第34个扇区(扇区号从0开始),即地址为33*512 = 0x4200H,为数据区的开始。
这张图可以证明。我们在软盘中成功找到了文件。
别忘了还有FAT1/2表,这两个表里面存储的是什么呢?在FAT表中,每12位称为一个FAT项,代表一个簇。
第0个和第1个FAT项从不使用,从第二个FAT项开始表示数据区的每一个簇。这也对应着数据区的第一个簇的簇号是2。
每一个FAT项的值代表文件下一个簇号;
如果文件在这个簇结束,则值>=0xFF8;
如果这个簇坏了,值==0xFF7。
二、如何在磁盘中找到LOADER
在回答这个问题之前,有一个问题更加重要:为什么需要Loader?
众所周知,操作系统是从引导扇区开始启动的,那我们直接在引导扇区中加载内核不就可以了吗?问题并不如此简单。事实上,引导扇区只是一个扇区,只有512字节大小;而内核装载之前要完成的任务有很多:例如初始化GDT/LDT,坚持硬件,跳