您似乎没有理解CPU和总线是如何工作的:
如您所知,网络i / o基于nic中断。
中断是一种机制,只要硬件(例如网卡)请求CPU这样做,它就会启动一个短程序。
中断只启动这个短程序;它没有别的。它也不会传输任何类型的数据。
您图像上显示的另一种机制是DMA。使用DMA,硬件组件(例如网卡)可以直接从RAM读取数据或将数据写入RAM。网卡显然使用这种机制将网络数据复制到RAM并发送存储在RAM中的数据。
但是,如果我们想要将数据发送到网络,我们首先必须告诉网卡,在网卡可以使用DMA访问RAM之前,根本没有数据要发送。当我们想要初始化网卡时也是如此。
因此,仅使用DMA,我们无法告诉网卡有数据要发送。启动计算机时也无法初始化网卡。中断也无济于事,因为中断是由网卡而不是软件启动的。我们需要第三种机制来访问网卡。
那么为什么我们需要汇编指令进出才能直接从nic寄存器中获取数据呢?
使用x86 CPU时,in
和out
指令用于直接读取和写入某些硬件组件的数据。
实际上,硬件可以以与访问RAM相同的方式访问CPU:例如,使用mov
指令。以这种方式访问图形卡的内存。还有CPU(如手机中常见的ARM CPU)以访问RAM的方式访问所有硬件。 (此类CPU没有in
或out
指令。)
然而,在PC兼容的计算机中,硬件通常以必须使用in
和out
指令访问的方式连接。