2 应用和硬件无关?
在使用 C 语言等高级语言进行 Windows 应用开发时,程序员很少会直接编写控制硬件的指令。这是因为对硬件的直接控制权,实际上由 Windows 操作系统全权管理。
然而,这并不意味着应用完全无法与硬件打交道。Windows 提供了间接控制硬件的方法,那就是利用操作系统提供的 系统调用 功能。应用通过调用特定的 API,向操作系统发出请求,最终由操作系统代表应用去完成实际的硬件操作。

3 支撑硬件输入输出的 IN 指令和 OUT 指令
Windows 在底层控制硬件时,依赖的是特定的输入输出指令。其中最具代表性的两个指令就是 IN 和 OUT,它们同时也是汇编语言中的助记符。
IN指令:用于从指定端口号的端口读取数据,并将数据存入 CPU 内部的寄存器中。
OUT指令:用于将 CPU 寄存器中存储的数据,写入到指定端口号的端口。

计算机主板上提供了各种连接显示器、键盘等外围设备的接口。在这些接口的内部,连接着负责转换计算机与外围设备之间电流特性的集成电路(IC),这些 IC 统称为 I/O 控制器(I/O 是 Input/Output 的缩写)。
显示器、键盘等每个外围设备都有其专用的 I/O 控制器。每个 I/O 控制器内部都有一小块用于临时保存输入输出数据的内存,这块内存就是所谓的“端口”(Port)。
一个实现 I/O 控制器功能的 IC 芯片上往往有多个端口。由于一台计算机连接着众多外围设备,因此也就存在多个 I/O 控制器和更多的端口。一个 I/O 控制器可以只控制一个设备,也可以管理多个设备。为了区分数量庞大的端口,系统为每个端口分配了唯一的 端口号,也称为 I/O 地址。

4 外围设备的中断请求
IRQ(中断请求)是一种用于暂停当前正在运行的程序,并转而执行其他程序的机制。这个过程被称为 中断处理。想象一下,你正在专心处理文档(主程序),此时电话响了(中断请求),你便暂停手头工作去接电话(中断处理程序),接完后再回来继续处理文档。

为了区分不同外围设备发出的中断,系统为每个中断请求分配了一个独立的编号,即 中断编号(或中断向量)。
如果多个外围设备同时发出中断请求,CPU 该如何应对?为了解决这个问题,通常在 I/O 控制器和 CPU 之间会加入一个名为 中断控制器 的 IC 芯片作为缓冲。中断控制器负责接收和管理所有外围设备的中断请求,并按照既定优先级顺序依次通知 CPU。

当中断发生时,CPU 会暂停当前的主程序,转而执行对应的中断处理程序。该程序通常需要先备份当前 CPU 寄存器的状态,然后执行控制外围设备的操作,完成后再恢复寄存器的状态,最终返回到主程序继续执行。

5 DMA 可以实现短时间内传送大量数据
在了解 I/O 和中断处理的同时,还有一个至关重要的机制需要掌握,那就是 DMA(直接内存访问)。
DMA 是指在不经过 CPU 参与的情况下,由外围设备直接与主内存进行数据交换的机制。 磁盘、高速网卡等设备广泛利用了这一机制。通过 DMA,海量数据得以在极短时间内完成传输,极大地解放了 CPU,提升了系统整体效率。相比之下,如果不使用 DMA,所有数据都需要 CPU 作为“中间人”来搬运,速度会慢得多。

6 文字及图片的显示机制
你是否想过,显示器上瞬息万变的图像信息存储在什么地方?答案是:显示器上显示的内容始终存储在某一块特定的内存中,这块内存被称为 VRAM(视频随机存取存储器)。
在现代计算机中,显卡等专用硬件内部通常配备有独立于主内存的 VRAM 和 GPU(图形处理器)。而在早期的 MS-DOS 时代,VRAM 是位于计算机主机主板上的。这种架构演变反映了显示技术复杂度的提升和专业化的发展。

理解从 I/O 端口、中断到 DMA 的整个硬件交互链条,是深入 计算机体系结构 底层原理的关键一步。这些机制共同确保了应用程序能够高效、有序地与复杂的物理硬件世界进行沟通。
如果你想持续探索此类底层原理与系统知识,欢迎访问 云栈社区 的相应板块,与更多开发者一起交流学习。