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

smw*_*dia 6 linux windows operating-system kernel

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

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

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

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

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

Bre*_*dan 8

我有一种感觉,我现在需要做一些硬件驱动程序。我对吗?

严格来讲; (取决于您的要求)“需要”可能太强了——理论上您可以切换回实模式以使用 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 磁盘,能够添加/卸载/替换驱动程序而无需重新启动) ; 以及管理设备树的东西 - 例如,当您将“父设备”置于睡眠状态(或“父设备”有硬件故障,或其驱动程序崩溃,或设备已拔下)。当然,那么你需要编写设备驱动程序,

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

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