首页 > 解决方案 > 为什么我们需要进出组装说明?

问题描述

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

网络io图片

在此处输入图像描述

标签: assemblynetworkingx86operating-systemcpu

解决方案


您似乎没有理解 CPU 和总线是如何工作的:

如您所知,网络 i/o 是基于 nic 中断的。

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

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

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

但是,如果我们要向网络发送数据,我们首先要告诉网卡有数据要发送,然后网卡才能使用 DMA 访问 RAM。当我们要初始化网卡时也是如此。

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

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

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

实际上,硬件可以以与访问 RAM 相同的方式访问 CPU 的方式连接到 CPU:例如使用mov指令。显卡的内存就是这样访问的。还有一些 CPU(如手机中常见的 ARM CPU)以访问 RAM 的相同方式访问所有硬件。in(这样的CPU 没有out指令。)

然而,在与 PC 兼容的计算机中,硬件通常以必须使用inout指令访问的方式连接。


推荐阅读