我正在做一些操作系统实验。到目前为止,我的所有代码都利用实模式 BIOS 中断来操作硬盘和软盘。但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用。如何读写硬盘和软盘?我现在需要做一些硬件驱动程序吗?我该如何开始呢?这是操作系统开发如此困难的原因之一吗?
我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的。例如,我知道硬盘的命令块寄存器范围是从0x1F0到0x1F7。但我想知道这么多不同硬件的寄存器地址在PC平台上是否相同?或者我必须在使用它们之前检测到这一点吗?如何检测它们?
由于我不确定如何在保护模式下读/写软盘或硬盘,因此我现在必须使用 BIOS 中断将所有必需的内核文件从软盘加载到内存中。但如果我的内核文件超出了实模式 1M 空间限制,我该怎么办?
对于任何回复,我表示深深的谢意。
Update
我依稀记得有一个方法可以先切换保护模式,然后再切换回实模式。然后我们就可以在保护模式下使用 BIOS 例程了。也许我记错了。有人记得对吗?
虽然它是possible在保护模式和实模式之间切换,几乎可以肯定not你想做什么。这就是 286 上的工作方式(相当笨拙,因为它根本不支持从保护模式切换回实模式)。然而,从 386 开始,他们添加了 V86 模式,可以在保护模式下作为任务运行。
如果您想在保护模式下使用 BIOS,这几乎肯定是可行的方法。您基本上可以创建一个 V86 任务,切换到它以使用 BIOS,然后切换回另一个任务以执行保护模式代码。
如果你想玩这个,你可能想看看DJGPP http://www.delorie.com/djgpp/zip-picker.html,这是一个 DOS 扩展程序(基本上,就像我刚才描述的那样,用于根据处理磁盘 I/O 等的需要处理 V86 任务的切换)以及相当旧版本的 gcc 的端口,因此您可以可以编写在其上运行的代码。
DOS 扩展器的商业市场现在基本上已经死亡,因此至少有一种以前的商业 DOS 扩展器(HX http://www.japheth.de/HX.html)现已作为开源提供。如果你打算使用它,你可能会想将它与开放沃特康 http://www.openwatcom.org/index.php/Main_Page编译器。
编辑:至于如何读取超过 1 MB 的文件(例如),它很简单但很笨拙:以块的形式读取数据,当您完成读取时,您要么重新映射内存,要么复制内容,将您所读的内容带到您真正想要的地方,然后再读另一块。
就与硬件交谈而言:很大程度上取决于您是否只想要在某种程度上起作用的东西,或者您是否想充分利用现有的硬件。只需使用基本的 IDE 端口即可与几乎所有非 IDE 端口进行通信really古老的——但是要充分利用硬件需要做很多工作。 IDE/ATAPI 驱动器使用了大约六种不同的 DMA 模式,每种模式的设置都略有不同。其中相当一部分已经足够老了,您可能不关心它们,因此您可能只想直接支持几个最新的,而对于其他任何内容,则退回到基本(非 DMA)传输。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)