为啥我们需要进出组装说明? [关闭]

Posted

技术标签:

【中文标题】为啥我们需要进出组装说明? [关闭]【英文标题】:why do we need assembly instructions in and out? [closed]为什么我们需要进出组装说明? [关闭] 【发布时间】:2019-07-07 23:49:48 【问题描述】:

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

网络io图片

【问题讨论】:

INOUT 用于映射设备的硬件级 IO。 在汇编语言中访问设备时,硬件设备与 CPU 的连接方式主要有两种:直接 I/O 或内存映射(设备寄存器通过特定的内存地址访问,以及所以看起来像是对 CPU 的内存访问)。 INOUT 是访问直接 I/O 的指令。 【参考方案1】:

你似乎不明白 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 指令访问的方式连接。

【讨论】:

许多现代硬件在物理内存地址空间中都有 IO 寄存器,而不是在输入/输出访问的单独 I/O 空间中。输入/输出至少部分序列化,因此性能低于 MMIO。 如果使用术语“DMA”来指代经典 PC 的 DMA 接口,例如Intel 8237,它使用设备端的端口(输入/输出)接口,同时读取或从 ram 写入。在总线主控设备的情况下,设备端接口将是供应商唯一的。 @rcgldr,“DMA”一般用来指任何访问主存的设备,而不仅仅是所谓的“DMA引擎”。因此,网卡、存储设备、图形设备、USB 控制器等都使用 DMA 进行操作。

以上是关于为啥我们需要进出组装说明? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要使用存储过程? [关闭]

为啥我们的项目需要接口层/抽象类? [关闭]

为啥我们需要 RPC 编程? [关闭]

我们为啥需要,使用猫鼬有啥优势[关闭]

为啥我们需要 JDBC 的连接池? [关闭]

Facebook IOS应用程序进出[关闭]