组件 – 实模式BIOS程序和保护模式

我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式B IOS中断来操纵硬盘和软盘.但一旦我的代码启用了CPU的保护模式,所有的实模式BIOS中断服务程序将不可用.我如何读取硬盘和软盘?我现在需要做一些硬件驱动我怎么开始这是操作系统难以开发的原因之一吗?

我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器的范围从0x1F0到0x1F7.但我想知道在PC平台上,这么多不同硬件的注册地址是否相同?还是在使用它们之前必须先检测出来?如何检测?

由于我不知道如何在保护模式下读取R / W软盘或硬盘,所以我必须使用BIOS中断将所有必需的内核文件从软盘加载到内存中.但是如果我的内核文件超过了真正的1M空间限制,该怎么办?

对于任何回应,我深表感谢.

更新

我隐约地回想起来,有一种方法首先切换保护模式,然后切换回实模式.然后我们可以在保护模式下使用BIOS程序.也许我记得错了.有人记得对吗?

虽然可以在保护模式和实模式之间切换,但几乎肯定不是你想要做的.这是286的做法(相当笨拙,因为它没有故意支持从保护模式切换回实模式).然而,从386开始,他们添加了一种V86模式,可以在保护模式下作为任务运行.

如果要使用保护模式的BIOS,这几乎肯定是做事情的方式.您可以基本创建一个V86任务,切换到使用BIOS,然后切换回另一个任务来执行保护模式代码.

如果你想玩这个,你可能想看看DJGPP,它是一个DOS扩展器(基本上是一个程序,就像我刚刚描述的那样处理根据需要处理V86任务的处理磁盘I / O等)以及一个相当旧版本的gcc的端口,以便您可以编写运行在其上的代码.

DOS扩展器的商业市场现在基本上已经死了,所以至少有一个以前商用的DOS扩展器(HX)现在可以作为开源.如果你打算玩,那么你可能想用OpenWatcom编译器.

编辑:至于如何读取超过1 MB的文件(例如),它很简单但很笨拙:读取数据块,当您完成读取时,您可以重新映射内存,或复制内容,让你读到你想要的地方,再阅读另一个大块.

就硬件而言:很大程度上取决于你是否只想要某种程度的工作,或者想要充分利用现有的硬件.只要使用基本的IDE端口,就可以让几乎所有的硬盘都不是很古老的,但是从硬件中获取最多的功能还有更多的工作. IDE / ATAPI驱动器已经使用了大约六打不同的DMA模式,每个DMA模式必须略有不同.相当多的那些已经够老了,你可能不在乎他们,所以你可能只想直接支持一些最新的,任何东西都可以回到基本的(非DMA)传输.

相关文章
相关标签/搜索