我正在做一个操作系统实验。到目前为止,我所有的代码都使用实模式BIOS中断来操作硬盘和软盘。但是一旦我的代码启用了保护模式,所有的实模式BIOS中断服务程序将不可用。

我觉得我现在需要做一些硬件驱动程序。我对吗?这就是为什么OS如此难以开发的原因吗?

我知道硬件是通过读取和写入某些控制或数据寄存器来控制的。例如,我知道硬盘的“命令块寄存器”范围从0x1F00x1F7。我想知道这么多不同硬件设备的寄存器地址在不同平台上是否一致?还是我必须在使用它们之前检测到它?我该怎么做?

由于我不确定如何在保护模式下读写软盘或硬盘,因此在进入保护模式之前,必须使用BIOS中断从软盘加载所有必要的内核文件。如果我的内核文件超过了实模式1M空间限制,该怎么办?

CPU处于保护模式时如何读写硬盘?

最佳答案



严格来讲; (并且取决于您的要求)“需求”可能太强了-从理论上讲,您可以切换回实模式以使用BIOS功能,或者使用virtual8086监视器,或者编写解释器来解释固件的指令,而不是直接执行它们。

但是,BIOS太糟糕了(针对“一次只能发生一件事情”的环境而设计,这完全不适合现代系统,因为现代系统期望所有设备都能够同时执行有用的工作),并且BIOS不推荐使用(由UEFI取代),并且在无法控制硬件的情况下很难调用OS(因为固件仍然可以控制硬件)。

请注意,如果您确实继续使用BIOS功能,请执行以下操作:各种硬件(中断 Controller ,各种设备的PCI配置空间,任何PCI桥接器,计时器等)的状态必须符合BIOS的期望。这意味着您将被迫接受巨大的限制(例如,永远无法正确使用IO APIC等),因为它将破坏其他现有代码使用的BIOS功能,或者您将被迫执行以下操作:使BIOS开心的大量工作(模拟各种硬件,因此BIOS认为硬件仍处于预期的状态,即使不是这样)。

换句话说;如果您想要一个好的操作系统,那么您确实需要编写驱动程序;但是如果您只想要一个在现代计算机(UEFI)上无法运行,存在严重性能问题(“一次只能发生一件事情”),很难改进,不支持BIOS不支持(例如,声卡),并且不支持任何类型的“热插拔”(例如,插入USB设备),则无需编写驱动程序。



不好的操作系统很容易开发。例如,可能会在1个月内将与MS-DOS一样可怕(但与MS-DOS不兼容)的东西拍打在一起。

使OS难以开发的原因在于使它变得更好。诸如关心安全性,试图获得可接受的性能,支持多CPU,提供容错性,试图使其更具 future 适应性/可扩展性,提供良好的GUI,创建经过深思熟虑的标准(用于API等)之类的事情,和电源管理-这些都是使OS变得困难的原因。

设备驱动程序增加了难度。在编写驱动程序之前,您需要支持驱动程序所依赖的东西(内存管理,IRQ处理等-可能包括调度程序和某种通信);然后进行一些操作以自动检测设备(例如扫描PCI配置空间)并尝试启动驱动程序以检测到任何内容(可能/希望从文件系统或初始RAM磁盘启动,能够添加/卸载/替换驱动程序而无需重新启动) ;以及管理设备树的内容-例如这样一来,当您将“父设备”置于 sleep 状态(或“父设备”发生硬件故障,驱动程序崩溃或拔出设备)时,您将了解会影响哪些“子设备”。当然,那您就需要编写设备驱动程序,其中难度取决于设备本身(例如,用于NVidia GPU的设备驱动程序可能比用于RS232串行端口 Controller 的设备驱动程序更难编写)。

对于存储设备本身(假设为“80x86 PC”),大约有8个重要的标准(ATA/ATAPI,AHCI和NVMe;然后是USB Controller 的OHCI,UHCI,eHCI和xHCI,然后是USB大容量存储设备规范)。但是,还有各种RAID Controller 和/或SCSI Controller ,其中没有标准(每个 Controller 都需要自己的驱动程序)和一些过时的东西(软盘 Controller ,插入软盘 Controller 或并行端口的磁带机,三张专有CD) -内置在声卡中的ROM接口(interface))。

请理解,支持所有这些并不是目标。目标应该是提供设备驱动程序所依赖的东西(如上所述),然后提供描述设备驱动程序接口(interface)的规范(可能/希望包括IO优先级和同步之类的东西,以及有关设备/媒体删除,错误处理等的通知)这样其他人就可以为您编写设备驱动程序。完成此操作后,您可以自己实现一些特定的设备驱动程序(例如,最初可能只是AHCI-其他所有内容都可以保留到很久以后,或者由其他人编写)。

关于windows - CPU处于保护模式时如何读写硬盘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2994804/

10-12 20:50