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

时间:2010-06-08 04:46:22

标签: windows linux operating-system kernel

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

编程ATA-PIO模式http://wiki.osdev.org/ATA_PIO_Mode IDE设备:http://wiki.osdev.org/IDE

软盘驱动器:http://wiki.osdev.org/Floppy_Disk_Controller

我鼓励您在OSDEV论坛注册,社区非常有帮助和礼貌,即使对于新手。

答案 1 :(得分:2)

  

我觉得我现在需要做一些硬件驱动程序。我说的对吗?

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

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

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

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

  

这就是为什么操作系统如此难以开发的原因吗?

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

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

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

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

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

答案 2 :(得分:1)

您不一定要编写驱动程序。您可以退回到实模式以调用BIOS服务,然后在完成后跳回到保护模式。这实质上就是DPMI DOS扩展器(DOS4GW,Causeway等)的工作方式。

Causeway DOS扩展程序的源代码是公共域,您可以查看它以供参考。 http://www.devoresoftware.com/freesource/cwsrc.htm