除了前面的回答:处理器可以直接和外设一起工作,唯一的问题是它是如何实现的。无论如何,如果是x86或ARM处理器,它有这样的IN和OUT指令,只是为了工作而设计的与外设。根据外设,有总线控制器,或其他一些控制器(例如北桥)处理来自 CPU 的命令。处理器接收 OUT 端口,例如 AL 指令,并设置端口端口总线上的地址,并在端口所在的地址区拉出某个负责外设的支路,总线控制器分别收到该信号后,将相应的外设连接到总线上。如果省略细节,那么对于 99% 的架构来说,过程完全相同。这就是隔离 I/O 的实现方式。
处理器不直接与外围设备一起工作。例如,根据 Intel Core i7 的规范(第 37-51 页),它与外界通信的唯一总线是三组引脚:两组用于 RAM(
DDR1_*、DDR2_*)和一组用于QPI(QPI_*) .也就是说,处理器有两个抽象——“RAM”(用引号括起来,因为实际上它只是一个可以与任何东西相关联的地址空间,而不仅仅是 RAM)和一个用于双向数据包传输的通道(它对程序员只为那些中断通过它而所谓的I / O端口通过它工作的人)。
所有三个总线都进入芯片组。然而:
对于前两个,芯片组的那部分(以前称为“北桥”)可以工作。它处理读取和写入“RAM”的处理器请求,根据分配的物理地址将它们重定向到 RAM 芯片或南桥。此外,此分配可以根据 BIOS 或南桥的请求动态更改。
“南桥”从第三个开始工作。是他与外设打交道,了解IDE/SATA/PS2等接口。好吧,或者知道相应的微控制器连接到芯片组的哪条腿。它的任务是将来自硬件总线的电信号转换为处理器 QPI 中断的语言,以及处理来自“北桥”的请求以使用保留的内存区域,将它们重定向到适当的设备。
特定设备的工作——它将在哪里使用中断,以及它将缓冲区映射到“RAM”的位置——由其制造商决定。这就是为什么需要驱动程序将特定设备与处理器通信的这种独特方式组合转换为其他程序可用的标准操作系统抽象(“硬盘”、“网卡”等)。
在一般情况下,外围设备被设计为一小块内存,将命令和参数写入特定地址,从特定地址读取有关您正在使用设备的状态的信息。碰巧有时候这块内存区域是在所谓的分配的。I/O 端口的话,读/写都是通过特殊的方式进行的。命令,但这不会改变一般逻辑。
对于与特定设备的交互,您需要阅读您感兴趣的控制器的描述,通常是某种微电路。
我以非常简单的方式描述了一切,为了研究这些东西,您必须首先阅读硬件中断及其处理以及直接访问所谓的内存。DMA。
相关链接: I/O 端口 总线 中断 DMA
除了前面的回答:处理器可以直接和外设一起工作,唯一的问题是它是如何实现的。无论如何,如果是x86或ARM处理器,它有这样的IN和OUT指令,只是为了工作而设计的与外设。根据外设,有总线控制器,或其他一些控制器(例如北桥)处理来自 CPU 的命令。处理器接收 OUT 端口,例如 AL 指令,并设置端口端口总线上的地址,并在端口所在的地址区拉出某个负责外设的支路,总线控制器分别收到该信号后,将相应的外设连接到总线上。如果省略细节,那么对于 99% 的架构来说,过程完全相同。这就是隔离 I/O 的实现方式。