assembly - 为什么我们需要进出组装说明?
解决方案
您似乎没有理解 CPU 和总线是如何工作的:
如您所知,网络 i/o 是基于 nic 中断的。
中断是一种机制,只要硬件(例如网卡)请求 CPU 这样做,它就会启动一个短程序。
一个中断只启动这个短程序;它什么也不做。它也不传输任何类型的数据。
图像上显示的另一种机制是DMA。使用 DMA 硬件组件(例如网卡)可以直接从 RAM 读取数据或将数据写入 RAM。网卡显然使用这种机制将网络数据复制到 RAM 并发送存储在 RAM 中的数据。
但是,如果我们要向网络发送数据,我们首先要告诉网卡有数据要发送,然后网卡才能使用 DMA 访问 RAM。当我们要初始化网卡时也是如此。
所以只使用DMA,我们无法告诉网卡有数据要发送。计算机启动时初始化网卡也是不可能的。中断也对我们没有帮助,因为中断是由网卡而不是由软件发起的。我们需要第三种机制来访问网卡。
那么为什么我们需要进出汇编指令才能直接从 nic 寄存器中获取数据呢?
在使用 x86 CPU 时,in
和out
指令用于直接读取和写入数据到某些硬件组件。
实际上,硬件可以以与访问 RAM 相同的方式访问 CPU 的方式连接到 CPU:例如使用mov
指令。显卡的内存就是这样访问的。还有一些 CPU(如手机中常见的 ARM CPU)以访问 RAM 的相同方式访问所有硬件。in
(这样的CPU 没有out
指令。)
然而,在与 PC 兼容的计算机中,硬件通常以必须使用in
和out
指令访问的方式连接。
推荐阅读
- python - 我在列表推导中使用 for 循环的脚本比正常的 for 循环慢
- javascript - 如何将 html 代码插入 prism 代码标签?
- dart - 对 routerProviders 或 routerProvidersHash 使用 InjectorFactory 可以自动化吗?
- angular - 底部纸张未在外部单击角度 6 时关闭
- python - 使用捕获的 .msg 文件内容创建新的 pdf
- delphi - 在编译之前验证文件的版本是否正确
- r - 如何删除具有相同名称的所有列(tidyverse 或 base R)?
- javascript - TypeScript 中方法参数的隐式类型转换
- css - Flag-icon-css 在 Angular 2+ (8) 中仅显示方形标志
- vba - 有没有办法排除同一单元格中的部分数据?