Operating system 程序如何控制硬件?

Operating system 程序如何控制硬件?,operating-system,hardware,Operating System,Hardware,为了由cpu执行,必须将程序加载到RAM中。程序只是处理器可以理解的一系列机器指令(如x86指令集)(因为它通过逻辑门物理地实现了它们的语义) 我或多或少能理解本地指令(在cpu芯片组内执行的指令)如“添加R1、R2、R3”是如何工作的。即使cpu如何通过使用数据总线和地址总线的northbridge芯片组与ram进行接口,我也非常清楚 我正在努力解决的是大问题 例如,如何将文件保存到硬盘中? 假设主板使用SATA接口与HDD进行通信。 这是否意味着此SATA接口有一个指令集,cpu可以通过准备

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

我或多或少能理解本地指令(在cpu芯片组内执行的指令)如“添加R1、R2、R3”是如何工作的。即使cpu如何通过使用数据总线和地址总线的northbridge芯片组与ram进行接口,我也非常清楚

我正在努力解决的是大问题

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

这是否同样适用于PCI接口、AGP接口等

是否所有的硬件通信基本上都是通过为某些任务确定标准接口并(由创建硬件芯片组的公司)使用任何其他硬件组件都可以查询的指令集来实现的


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

几乎正确。它实际上比指令更一般

这些细节中有很多是特定于体系结构的,因此我将继续从较高的层次概述如何实现这一点

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

例如,假设您希望将文件保存到硬盘驱动器。这是可能发生的命令序列:

  • 硬盘驱动器控制器的命令寄存器为地址0xF00,该地址位于RAM之外,但可供CPU访问
  • 将指示要写入硬盘驱动器的指令写入命令寄存器
  • 可以想象,0xF01处可能有一个地址寄存器,告诉硬盘驱动器控制器在哪里保存数据
  • 告诉硬盘驱动器控制器我要写入的数据位于RAM中的某个地址,并启动写入序列
  • 有很多其他的方法可以做到这一点,但需要注意的是,它只是简单地使用CPU已有的使用RAM的指令

    所有这些都可以由CPU完成,而无需在CPU端执行任何特殊指令,只需对地址进行读写即可。您可以想象,如果扩展,USB控制器的地址空间中有一个特殊的位置,其中包含USB设备列表,PCI设备列表有一个特殊的位置,每个PCI设备都有几个寄存器,可以读取和写入这些寄存器,以指示它们执行操作


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

    我认为您的理解大体上是正确的,只是我认为它并不总是像处理器直接与每个设备通信那样简单。例如,处理器可以与UART设备或其他设备通信,而UART设备或其他设备又与内存、网络或监视器等通信。参见示例。更一般地说,现代计算硬件设置也涉及DMA:。谢谢。您描述了内存映射i/o(我知道),但添加了一些我缺少的细节。因此,这些设备驱动程序知道要发布给物理设备的正确格式(因为硬件供应商对其进行了编程)。当操作系统加载驱动程序时,它只需为映射到ram分配一些内存区域(我猜这是动态完成的),并通知设备控制器(在设备芯片组中)它应该检查的内存区域。它可以做到这一点,因为ram地址总线是共享的。我说得对吗?