自己动手写操作系统 第四章总结

本文总结了操作系统第四章的内容,重点在于建立引导扇区和Loader。引导扇区负责加载Loader到内存并传递控制权。Loader则负责加载内核并进入保护模式。介绍了软盘的FAT12格式,详细阐述了从启动到内核执行的流程,包括BIOS如何加载引导扇区到内存。同时,详细讲解了如何遍历根目录找到loader.bin,读取并加载到内存,最终跳转到Loader执行的步骤。
摘要由CSDN通过智能技术生成

自己动手写操作系统 第四章总结

本章主要内容是建立一个功能比较完善的引导扇区也称为 boot sector

首先回顾一下一个操作系统从开机到运行的过程

1.引导
2.加载内核入内存
3.跳入保护模式
4.开始执行内核

可见在内核开始执行前还有很多工作要做,如果全部交给boot sector,512字节很可能不够用,所以我们需要将这个
功能分担出来,这个模块就是loader

现在,boot sector 的功能就是负责把loader加载到内存中,并且把控制权交给它,到此,boot sector就完成任务了
而加载内核的功能就交给了loader
现在再来看看运行过程
1.boot sector引导加载loader程序,并将控制权交给loader
2.loader把内核加载到内存中,并负责进入保护模式(要实现分页等功能),然后将控制权交给内核
3.内核进行接下来的操作


在第四章中我们主要的任务是写一个boot sector,让他来加载loader
同时学习软盘的fat12格式

先大体对程序流程有一个认识
1.首先我们需要一个写一个DOS可以识别的引导盘,注意引导扇区需要有BPB等头信息才能被微软DOS识别,所以加上它
然后通过jmp short LABEL_START:让我们开始执行引导扇区,这里有一个问题需要注意,为什么我们的引导扇区是写在floppy上的,而我们的计算机是怎么能运行它呢?这程序肯定是在内存中的,那么它是什么时候被加载到内存中的呢?
解答,在计算机加电后BIOS回查看软盘的第一个扇区的最后两个字节是不是0xaa55,如果是的话,就认为这个扇区是可引导的,然后将这512字节的内容加载到内存中的07c00h中,然后开始运行,所以我们的boot sector是不需要我们手动进行加载到内存中的,但是我们的loader.bin和kernel却不行,他们只能以文件形式存在软盘的数据区然后我们需要在boot sector中加载loader.bin到内存中,然后将控制权交给它,接着通过loader.bin将kernel加载到内存中,然后将控制权交给内核
2.将loader加载到内存中,这里我们需要用到BIOS的int 13h中断来读取软盘,也就是将软盘数据区的内容加载到内存中来,这个内存是预先设定好的,并要记住这个内存位置,因为当我们将loader从软盘数据区加载到内存中后我们需要jmp到这个位置以便将控制权交给它

这里我们将读取软盘的工作交给一个叫readsector的函数,它接受两个参数,扇区逻辑号,和要读取的扇区数目,要注意的问题是我们里给出的是扇区的逻辑号,但是用int 13h中断需要确切的物理位置,所以在函数中我们要进行这个转换才行
需要注意的地方就是如何将逻辑扇区号转换成可供int 13h调用的物理软盘位置,以及int 13h的调用方法,以及loader将要存储的内存位置

3.当然,要读取loader的内容到内存中,首先最重要的就是在软盘中找到loader的位置才行,否则从哪里将数据转移到内存中,这里需要注意的地方有以下几点
1.如何着手寻找?首先需要了解软盘的结构,包括,boot sector , fat1 表,fat2表,根目录,数据区
2.那么如何下手呢?首先,我们要知道所有数据区的文件的文件名都是在根目录的条目中,这个32位的条目中存放了关于这个文件的各种信息,详见p128,其中现在最重要的就是文件名(条目中的前11个字节,8字节的文件名,3字节的扩展名),以及接下来连续读取的时候需要用到的32字节中偏移0x1Ah处存放的两字节的这个文件的其实簇号(这个簇号与扇区类似,但是又不是一样的,而是有一一对应的映射关系),现在在寻找loader的步骤中我们需要的就是文件名,我们要遍历软盘的根目录区中的每一个条目中的前11字节,看看是不是和我们预先设定号的loader的文件名完全一致(比如loader.bin)
如果一致,那么记住这个根目录中的条目,因为接下来我们要用到这个条目中的之前说的偏移0x1Ah处的文件第一个簇号(通过这个簇号我们可以找到第一个扇区,因为他们是一一对应的),在这个遍历中我们需要三个嵌套循环,第一个是根目录占用的扇区总数,这里是19,所以要遍历19次,它的作用是每次循环将一个扇区取出来存到一个暂时存放扇区的地方,然后下面的循环对这个扇区进行遍历操作,这个循环中嵌套一个循环,这个第二级循环的作用是遍历一个扇区中的每一个条目(512/32次),接下来这个循环又嵌套一个循环,这个第三级循环的作用是遍历这一个条目的前11个字符,判断是不是和我们要找的文件名完全一致,若一致,则跳出循环进行下一个操作,否则将一直遍历(最多19 * (512 / 32) * 11次),若没找到则提示找不到loader
3.若我们在第二步中找到了loader,我们就要对这个根目录条目进行操作了(32位),我们首先确定这个目录的起始位置,然后找到这个目录的偏移1Ah处,这里有最重要的簇号,通过它我们就能找到所有的loader占用的扇区,并将他们加载到一个连续的内存区域,加载完成后就jmp到这个内存地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值