smw*_*dia 10 x86 assembly operating-system protected-mode x86-16
我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?
我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从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)传输.
归档时间: |
|
查看次数: |
4312 次 |
最近记录: |