为什么我们需要进出组装说明?

时间:2019-02-14 01:58:26

标签: assembly networking x86 operating-system cpu

对于网络I / O,为什么我们需要输入和输出汇编指令才能直接从nic寄存器获取数据?似乎在中断代码中使用了in和out。

网络io图片

enter image description here

1 个答案:

答案 0 :(得分:2)

您似乎还不了解CPU和总线的工作方式:

  

您知道网络I / O是基于nic中断的。

中断是一种机制,只要硬件(例如网卡)请求CPU这样做,它就会启动短的程序

一个中断只会启动这个简短的程序。它什么也没做。它还不会传输任何类型的数据。

图像上显示的另一种机制是 DMA 。使用DMA,硬件组件(例如网卡)可以直接从RAM读取数据或将数据写入RAM。显然,网卡使用此机制将网络数据复制到RAM并发送存储在RAM中的数据。

但是,如果要向网络发送数据,首先必须告诉网卡,在网卡可以使用DMA访问RAM之前,根本有数据要发送。当我们要初始化网卡时,也是如此。

因此,仅使用DMA,我们无法告诉网卡有要发送的数据。启动计算机时也无法初始化网卡。中断也不会帮助我们,因为中断是由网卡而不是软件启动的。我们需要第三种机制来访问网卡。

  

那么为什么我们需要输入和输出汇编指令才能直接从nic寄存器获取数据?

使用x86 CPU时,inout指令用于直接向某些硬件组件读取和写入数据。

可以按照访问RAM的相同方式将独立的硬件连接到CPU:例如,使用mov指令。可以通过这种方式访问​​图形卡的内存。还有一些CPU(如手机中常见的ARM CPU)以与访问RAM相同的方式访问所有硬件。 (这类CPU没有inout指令。)

但是,在与PC兼容的计算机中,通常必须使用inout指令来访问硬件。