![操作系统如何与其他硬件组件通信?](https://linux22.com/image/1233323/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%A6%82%E4%BD%95%E4%B8%8E%E5%85%B6%E4%BB%96%E7%A1%AC%E4%BB%B6%E7%BB%84%E4%BB%B6%E9%80%9A%E4%BF%A1%EF%BC%9F.png)
在 CPU 上运行的程序(主要是操作系统)如何访问其他 PC 硬件?例如显卡、硬盘等等?
据我所知,在 DOS 中,这是使用 BIOS 调用(特别是 INT 指令)完成的。但是,INT 指令应该只跳转到 RAM 中的特定空间。那么当 CPU 只能访问 RAM 并接收中断时,存储在 RAM 中的某些程序如何访问其他计算机硬件?
Windows 是否也使用 INT 指令,或者是否有新的方式与硬件通信?
答案1
[H]CPU 上运行的程序(主要是操作系统)如何访问其他 PC 硬件?例如显卡、硬盘等等?
这个问题的完整答案很复杂,一般很难回答。所以我将尝试一般性地回答这个问题,并希望为您提供一些指示,以便找到进一步学习的其他信息。我希望这很有用。
对于 MS Windows 95 及更新版本或 x86(IA-32)处理器上的 Linux 使用的 32/64 位保护模式,软件中断(例如 x86 的 INT 操作码)转到适当的中断向量表(或调度表)可以指示 CPU 进程应该跳转到操作系统的哪个位置中断处理程序(或中断服务程序,ISR)来处理请求。
在 x86 中實模式,如 MS-DOS,这些可能由BIOS为特定系统/芯片组/主板提供低级特定的实现细节。
[H]当 CPU 只能访问 RAM 并接收中断时,存储在 RAM 中的某些程序如何访问其他计算机硬件?
所以你不想像往常一样手挥动答案?我会尽力回答这个问题,但我不是计算机工程师或计算机架构专家。
有多种机制,包括
(来源:CS 473-IO,新墨西哥州立大学,pfeiffer,2006 年)
最简单的是内存映射 I/O,其中内存地址可能映射到硬件设备的寄存器(例如串行通用异步收发器)和 CPU 并写入和/或读取某些内存地址以直接访问硬件。这既快速又简单,但会减少可用作 RAM 的内存地址范围。
其他是更先进的技术,旨在允许现代 CPU 和更先进的操作系统以受控的方式访问硬件。
在操作系统本身中,这些通常被称为设备驱动程序,因为它们包含有关它们支持的硬件设备的具体详细信息。
而且,Windows 是否也使用 int 指令,或者是否有任何新的方式与 HW 通信?
是的,是的,但是我想我已经解释过了。
答案2
个人电脑 CPU 上运行的软件可以通过多种方式与其余硬件进行通信。
最容易理解的是 I/O 端口。软件使用 OUT 指令一次将 8、16 或 32 位写入 I/O 端口。同样,软件使用 IN 指令从 I/O 端口读取。I/O 端口位于单独的 16 位地址空间中,与主内存使用的地址空间无关。使用 I/O 端口的每个硬件都有一系列 I/O 地址;写入和读取每个地址都会产生不同的效果(通常读取和写入同一地址也会产生不同的效果)。
另一种方式是内存映射 I/O,其中部分内存地址空间被映射到硬件。对该内存区域的读写操作不是进入主内存,而是进入相应的硬件。它们的含义取决于硬件和区域(同一硬件中存在多个内存映射 I/O 区域的情况并不罕见);对它的读写可能会产生特殊效果(就像 I/O 端口一样),或者它可以直接对硬件上的内存进行读写(例如,视频卡的帧缓冲区)。
在另一个方向(其余硬件与 CPU 上运行的软件对话),也有几种方法。最简单的方法是等待软件询问(通过 I/O 端口或内存映射 I/O);单独使用时,这种方法效率很低。
另一种方法是硬件直接写入主内存。这对于传输大量数据非常有效,也可以用于其他方向(从主内存读取)。但是,软件仍然必须知道传输何时完成。
最后一种方式是中断。CPU 接收中断请求以及中断号。CPU 中断(因此得名)它正在执行的操作,并切换到代码的另一部分(该部分取决于中断号)。通常每个硬件对应一个中断号,但中断号通常由多个中断源共享。还有一些特殊类型的中断没有编号;例如 NMI。
举个实际的例子,我们以一个简单的网络接口卡为例。该网卡有一组寄存器,可以通过 I/O 端口或内存映射 I/O 访问。它还可以读取和写入主内存,并有一个中断引脚。
要将数据包发送到网络,网卡驱动程序首先将完整的数据包写入内存,地址与 4 字节的倍数对齐。然后,它将内存地址、数据包大小和其他一些信息写入网络接口卡上的几个寄存器。然后,网卡从内存中读取数据包,将其发送到网络,并发出中断信号。中断控制器(一个独立的硬件)将中断请求发送到 CPU,并告知其中断号。在中断处理程序中,驱动程序从卡中读取一个寄存器,该寄存器告知它中断与正在发送的数据包有关,然后读取另一个寄存器以找出已发送的数据包,并知道它现在可以重用写入数据包的内存。
为了从网络接收数据包,网卡驱动程序会分配一个内存块来存储数据包,并在卡上写入几个寄存器,告知它内存块的内存地址、大小和其他一些信息。当从网络接收到数据包时,网卡会将其连同数据包的大小和其他一些信息一起写入该内存块。它会更新一些寄存器,这些寄存器会告知它和驱动程序该内存块中有多少可用空间、可用空间从哪里开始以及已用空间从哪里开始(缓冲区是循环的,因此在到达末尾后会滚动到开头)。最后,它会发出中断信号。驱动程序将读取寄存器和内存以获取数据包,并更新寄存器以告知卡空间现在再次可用。
通过写入寄存器和发出中断信号,卡还可以告诉驱动程序其他信息;例如,网线已拔出、出现传输错误等。
答案3
答案4
这就是硬件驱动程序的用途。此外,Windows 现在使用 HAL(硬件抽象层)代替 DOS。