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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CPU处于保护模式时如何读/写硬盘?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

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

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

另一答案

安排ATA-PIO适度CASE Deep:cassex

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

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

另一答案

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

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

然而,BIOS很糟糕(设计用于“一次只能发生一件事”的环境,完全不适合现代系统,它预期所有设备能够同时做有用的工作),而BIOS则是不推荐使用(由UEFI取代),当它无法控制硬件时(因为固件仍然可以控制硬件),很难将操作系统称为操作系统。

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

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

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

糟糕的操作系统很容易开发。例如,像MS-DOS一样可怕的东西(但与MS-DOS不兼容)可能会在1个月内被打成一片。

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

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

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

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

以上是关于CPU处于保护模式时如何读/写硬盘?的主要内容,如果未能解决你的问题,请参考以下文章

我是如何学习写一个操作系统:操作系统的启动之保护模式

Hypervisor.framework 16位实模式

内核保护模式之分段机制

MMU单元的内存保护

反向代理缓存

尝试使用片段保存夜间模式状态