cpu如何与外围设备通信?

时间:2011-07-27 23:12:00

标签: hardware communication cpu

我假设cpu可以直接访问主板的BIOS和RAM。(如果我错了,请纠正我)

但是cpu如何与硬盘,扩展卡,外围设备,其他BIOS等其他硬件进行通信?

我了解操作系统及其驱动程序,但它们是软件 - 它们位于RAM中。 cpu如何在硬件级别与所有这些硬件进行通信? 它不仅限于主板的BIOS和RAM吗?

4 个答案:

答案 0 :(得分:39)

在较旧的体系结构中,外围设备通过单独的机制访问,使用特殊的I / O指令进行内存访问。在x86上,有(并且仍然是!)“in”和“out”指令用于在CPU和外设之间传输字节。为外围设备提供地址,例如键盘为0x80。简化很多,做“在0x80”会从键盘控制器读取一个字节到CPU寄存器“AL”。

在现代架构中,外设以与内存类似的方式访问:通过总线上的映射内存地址。您不应该将总线视为访问内存的方式。这是解决各个外设的一种方法,其中内存(RAM / DDR)只是一种类型。例如,您可能在地址0x00000000..0x7fffffff处有2GB的RAM。之后,您可能拥有0x80000000..0x80001fff的图形卡。总线控制器(PCIe或其他)知道哪个地址范围到哪个外设。

内存通常是特殊的,因为它可以被缓存,因此对内存的单独读/写往往不会直接转换为对RAM芯片的单独读/写。外设被标记为特殊 - CPU访问应该完全按照程序中的说明发送到外设。

与外围设备通信的语言非常特殊,具体取决于设备。一般主题是外围设备被映射到内存中的某个位置(例如,如上所述为几KB的0x80000000),其中各个状态位和操作由不同的字(通常为32或64位)控制。串行端口为0x80000000的神话示例:

  • 将32位字'A'写入0x80000000,在其输出FIFO中排队字符'A'。
  • 将32位字0x1写入0x80000004,告诉串口发送其队列。

同样,完全是为了举例而已,但真正的串口(uart)并没有那么不同。

问题是,由于虚拟内存,您实际上不会在现代操作系统中看到上述任何内存布局。上面的地址将被称为“物理存储器地址”(或总线地址) - 发送到总线的实际地址。而CPU则会看到虚拟内存地址。各个外围设备需要映射到虚拟地址空间。这有点难以解释,可能在另一个问题中最好,但关键是你不太可能通过现代操作系统中的实际物理地址访问外围设备。

答案 1 :(得分:2)

当然,接受的答案是准确的,但是也许DrStrangeLove打算解决别的问题,或者至少问题是另一个问题。事实上,当有人询问"外围设备如何在硬件级别与CPU通信?",我认为答案应该提到I / O模块的作用(比如每个I / O适配器)知道)。这一点很重要,因为与I / O设备通信所需的部分逻辑嵌入在I / O模块中,从而减少了执行I / O操作时对CPU的关注。这在问题的上下文中听起来与我相关,因为它询问I / O操作的硬件方面,而适配器是抽象I / O设备的内在性的硬件部分,隐藏了它们与CPU的复杂性(和来自操作系统)。例如,磁盘适配器隐藏磁盘'几何方面,使CPU免于运行旋转磁盘所需的逻辑。找到一个圆柱体,等待正确的扇区在读/写磁头下通过。类似的推理也适用于其他设备,如视频适配器,网卡等。简而言之,如果没有I / O模块,I / O任务将会压倒CPU。引用Stallings:

  

I / O模块的功能是允许处理器查看各种各样的   设备以简单的方式。有一系列功能   可能会提供。 I / O模块可能隐藏计时的细节,   格式,以及外部设备的机电设备   处理器可以在简单的读写命令方面起作用   可能打开和关闭文件命令。最简单的形式是I / O.   模块可能仍然离开控制设备的大部分工作(例如,   倒带磁带)处理器可见。一个接管的I / O模块   大部分详细的处理负担,呈现出高层次   处理器的接口通常称为I / O通道   或I / O处理器。一个非常原始且需要的I / O模块   详细控制通常称为I / O控制器或设备   控制器。 I / O控制器常见于微型计算机上,   而I / O通道则用在大型机上。

此外,正如John Ripley所说,有一个I / O空间以与RAM相同的方式映射。实际上,外设可以直接映射到内存地址空间(称为 MMIO ,内存映射I / O)或分隔的地址空间中 PMIO ,端口映射I / O,也称为#34;隔离I / O"因为,与MMIO不同,I / O地址完全与计算机内存的那些。这就是为什么你必须使用 in out 指令与使用PMIO的设备进行通信的原因。

通过上述内容,MMIO和PMIO都将I / O设备视为内存位置 - 这是硬件如何处理I / O操作的本质,但是为了获得丰富的概念,这里有一些进一步的细节值得一提。 I / O中涉及的负载。由于每个适配器的地址范围都有限,我们必须明白这些内存位置是数据缓冲区,这意味着您只需要几个字节("数据块")一次与设备通信。出于这个原因,CPU通常不直接使用从这些存储器位置读取的数据:首先,通过相应的地址从I / O设备读取数据,然后将此数据存储到RAM中然后CPU可以使用它。为了实现这一点,请考虑CPU必须执行的大型二进制文件:磁盘适配器具有受其I / O寻址空间限制的有限缓冲区(注意我不是指适配器的内部缓冲区,而是指其CPU看到的地址空间),因此适配器从磁盘读取一些数据,并在缓冲区通过中断填充时警告CPU;接下来,CPU中断它正在做的任何事情,读取缓冲区,将缓冲区的内容复制到RAM中,并通知适配器它可以继续从磁盘带来更多数据。如果二进制文件完全加载到RAM中,则该循环重复进行。从那时起,声明读取操作完成,最终可以执行文件。

此循环称为中断驱动的I / O ,完全出现在硬件中(有一些OS支持来处理中断),但请注意,还有另外两个选项可用于执行I / O操作。也可以采用所谓的PIO(可编程I / O),而不是使用中断机制,CPU通过循环连续池控制器,直到所有需要的信息被逐块收集(当最后一个块时)检索,循环结束)。中断驱动的I / O和PIO都浪费了CPU时间(特别是后者),并且很久以前被直接内存访问(DMA)取代,它允许I / O设备直接将其数据写入(或读取)到(或者来自CPU指示的RAM。由于其汇集性质,我相信PIO完全用软件实现,但我现在可能错了。我必须指出,虽然DMA使PIO和中断驱动的I / O过时,但我不确定它们是否都被禁止使用现代建筑。

答案 2 :(得分:0)

这取决于“直接访问”的含义。 CPU内核通过bus与主内存(RAM)通信。 (核心可以更直接地访问相对少量的内存(缓存或寄存器),但这是一个不同的问题。)CPU还通过总线与外围设备通信。您可能听说过的某些类型的总线是通用串行总线(USB;通常用于外部设备),PCI,前端总线(一种连接CPU内核和主内存的总线)或Serial-ATA(SATA;经常使用)对于像硬盘这样的设备。

ETA:我在下面的评论中提到设备驱动程序处理CPU和外设之间的硬件级通信。通信的实际机制可能涉及使用地址空间的特定部分来传输数据(memory-mapped I/O),因此物理读取或写入设备看起来像访问普通存储器。设备驱动程序还处理CPU如何从设备响应interrupts

答案 3 :(得分:0)

如果我错了,请纠正我。 基本上,外围设备使用 PCI (外围组件互连)与处理器进行通信,它是一种总线,可以将设备直接连接到处理器。 当通过外围设备发出命令时(例如按下键盘上的任何按钮),该命令将转换为二进制代码并以高速缓存的形式存储在内存中,然后由处理器完成该特定功能所需的执行。