程序如何控制硬件



为了由cpu执行,必须将程序加载到RAM中。程序只是处理器能够理解的一系列机器指令(如x86指令集)(因为它通过逻辑门物理地实现了它们的语义)。

我或多或少能理解诸如"ADD R1、R2、R3"之类的本地指令(在cpu芯片组内部执行的指令)是如何工作的。即使是cpu如何通过北桥芯片组使用数据总线和地址总线与ram接口,我也很清楚

我正在为大局而挣扎。

例如,如何将文件保存到硬盘中?假设主板使用SATA接口与HDD进行通信。这是否意味着这个SATA接口有一个指令集,cpu可以通过准备以正确格式编写的SATA指令来使用它?

PCI接口、AGP接口等等也适用吗?

所有的硬件通信基本上都是通过为某些任务确定标准接口并使用任何其他硬件组件都可以查询的指令集来实现的吗?

我对硬件和软件交互的高级理解是否正确?

差不多。它实际上比指令更一般。

所有这些细节都是特定于体系结构的,所以我将坚持对如何做到这一点进行高级别的总体概述。

CPU可以在没有问题的情况下读取和写入RAM,对吗?您可以向任何内存地址发出读写指令。因此,硬件制造商并没有试图扩展CPU来理解每一个可能的硬件接口,而是简单地将地址空间的部分(RAM通常所在的位置)映射到硬件。

例如,您想将文件保存到硬盘驱动器。这是一个可能出现的命令序列:

  1. 硬盘驱动器控制器的命令寄存器为地址0xF00,该地址位于RAM之外,但可由CPU访问
  2. 将指示写入硬盘驱动器的指令写入命令寄存器
  3. 可以想象,在0xF01处有一个地址寄存器,它告诉硬盘控制器将数据保存在何处
  4. 告诉硬盘控制器我要写入的数据在RAM中的某个地址,并启动写入序列

可以想象,还有无数其他方法可以做到这一点,但需要注意的是,它只是使用CPU已经拥有的使用RAM的指令。

所有这些都可以由CPU完成,而无需CPU端的任何特殊指令,只需读取和写入地址即可。你可以想象这是扩展的,USB控制器的地址空间中有一个特殊的位置,其中包含USB设备的列表,PCI设备列表有一个特定的位置,每个PCI设备都有几个寄存器,可以读写这些寄存器来指示它们做事情。

从本质上讲,设备驱动程序的作用是知道如何读取和写入这些特殊寄存器,设备可以接受什么样的命令,等等。通常,就像许多图形卡的情况一样,这些寄存器的作用没有向公众记录,因此我们依赖它们的驱动程序来正确运行这些卡。

最新更新