程序如何控制硬件?
Posted
技术标签:
【中文标题】程序如何控制硬件?【英文标题】:How does a program control hardware? 【发布时间】:2013-12-29 09:47:46 【问题描述】:为了被 cpu 执行,必须将程序加载到 RAM 中。程序只是处理器可以理解的一系列机器指令(如 x86 指令集)(因为它通过逻辑门物理实现了它们的语义)。
我可以或多或少地理解本地指令(在 cpu 芯片组内执行的指令)如“ADD R1、R2、R3”的工作原理。甚至 cpu 如何使用数据总线和地址总线通过北桥芯片组与 ram 接口对我来说已经足够清楚了。
我正在努力解决的是大局。
例如,如何将文件保存到硬盘中? 假设主板使用 SATA 接口与 HDD 通信。 这是否意味着这个SATA接口有一个指令集,可以通过编写正确格式的SATA指令供cpu使用?
PCI接口、AGP接口等也一样吗?
所有硬件通信基本上是通过为某些任务确定标准接口并使用任何其他硬件组件都可以查询的指令集(由制造硬件芯片组的公司)实现它来完成的吗?
我对硬件和软件交互的高级理解是否正确?
【问题讨论】:
我认为您的理解通常是正确的,但我认为它并不总是像处理器直接与每个设备通信那样简单。例如,处理器可以与 UART 设备或其他一些设备进行通信,这些设备又与内存或网络或监视器等进行通信。例如,请参阅en.wikipedia.org/wiki/16550_UART。更一般地说,现代计算硬件设置也涉及 DMA:en.wikipedia.org/wiki/Direct_memory_access。 【参考方案1】:几乎。它实际上比指令更笼统。
这些细节中有很多是特定于架构的,所以我将坚持对如何做到这一点进行高层次的总体概述。
CPU 可以毫无问题地读写 RAM 对吗?您可以发出读取和写入任何内存地址的指令。因此,与其尝试扩展 CPU 以了解所有可能的硬件接口,硬件制造商只需将地址空间的部分(通常是 RAM 所在的位置)映射到硬件。
例如,您想将文件保存到硬盘。这是可能发生的命令序列:
-
硬盘控制器的命令寄存器是地址 0xF00,这个地址在 RAM 之外但可供 CPU 访问
将指令写入指示我们要写入硬盘的命令寄存器。
可以想象,0xF01 处可能有一个地址寄存器,它告诉硬盘控制器将数据保存在哪里
告诉硬盘控制器我要写入的数据位于 RAM 中的某个地址,然后启动写入序列。
可以想象有无数其他方法可以做到这一点,但需要注意的重要一点是,它只是使用 CPU 已经拥有的用于使用 RAM 的指令。
所有这些都可以由 CPU 完成,无需 CPU 端的任何特殊指令,只需读取和写入一个地址即可。你可以想象这个被扩展了,在地址空间中有一个特殊的位置供 USB 控制器使用,它包含一个 USB 设备列表,还有一个特殊的位置是 PCI 设备列表,每个 PCI 设备都有几个可以读取的寄存器和书面指示他们做事。
本质上,设备驱动程序的作用是知道如何读写这些特殊寄存器,设备可以接受什么样的命令等。通常,就像许多显卡一样,这些寄存器的作用是没有向公众记录,因此我们依靠他们的驱动程序来正确运行这些卡。
【讨论】:
谢谢。您描述了内存映射 i/o(我知道),但是您添加了一些我缺少的细节。因此,这些设备驱动程序知道要发布给物理设备的正确格式(因为硬件供应商对它们进行了编程)。当操作系统加载驱动程序时,它只需分配一些内存区域用于映射到 ram(我猜这是动态完成的)并通知设备控制器(在设备芯片组中)它应该检查的内存区域。它可以做到这一点,因为 ram 地址总线是共享的。我猜对了吗?以上是关于程序如何控制硬件?的主要内容,如果未能解决你的问题,请参考以下文章