首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当CPU处于保护模式时如何读/写硬盘?

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

Stack Overflow用户
提问于 2010-06-08 12:46:22
回答 2查看 3.8K关注 0票数 7

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 11:53:13

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

严格地说,(取决于你的要求)“需求”可能太强了-理论上你可以切换回真实模式来使用基本输入输出系统功能,或者使用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图形处理器的设备驱动程序可能比用于RS232串行端口控制器的设备驱动程序更难编写)。

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

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

票数 8
EN

Stack Overflow用户

发布于 2010-06-08 19:47:31

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

Causeway DOS扩展器的源代码是公共领域的,你可以查看它作为参考。http://www.devoresoftware.com/freesource/cwsrc.htm

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2994804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档