前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux | 数据包到网卡在通过DMA到内存过程

linux | 数据包到网卡在通过DMA到内存过程

作者头像
heidsoft
发布2023-03-18 17:46:50
3.2K0
发布2023-03-18 17:46:50
举报
文章被收录于专栏:云计算与大数据

DMA 是一种硬件机制,它允许外围组件将其 I/O 数据直接传输到主内存或从主内存传输数据,而无需系统处理器参与传输。使用这种机制可以极大地增加进出设备的吞吐量,因为大量的计算开销被消除了。

要利用其硬件的 DMA 功能,设备驱动程序需要能够正确设置 DMA 传输并与硬件同步。不幸的是,由于其硬件性质,DMA 非常依赖于系统。每种体系结构都有自己的技术来管理 DMA 传输,并且每种体系结构的编程接口都不同。内核也不能提供统一的接口,因为驱动程序不能从底层硬件机制中抽象出太多。然而,在最近的内核中,已经朝着这个方向采取了一些步骤。

可以通过两种方式触发数据传输:软件请求数据(通过read等函数)或硬件将数据异步推送到系统。

对于第一种情况,所涉及的步骤可以概括如下:

  1. 当进程调用read时,驱动程序方法会分配一个 DMA 缓冲区并指示硬件传输其数据。进程进入休眠状态。
  2. 硬件将数据写入 DMA 缓冲区并在完成时引发中断。
  3. 中断处理程序获取输入数据、确认中断并唤醒进程,该进程现在能够读取数据。

第二种情况发生在异步使用 DMA 时。例如,即使没有人在读取数据,数据采集设备也会继续推送数据,就会发生这种情况。在这种情况下,驱动程序应该维护一个缓冲区,以便后续的读取调用将所有累积的数据返回到用户空间。这种转移涉及的步骤略有不同:

  1. 硬件发出中断以宣布新数据已到达。
  2. 中断处理程序分配一个缓冲区并告诉硬件将其数据传输到哪里。
  3. 外围设备将数据写入缓冲区并在完成时引发另一个中断。
  4. 处理程序调度新数据,唤醒任何相关进程,并负责内务处理。

异步方法的一种变体经常出现在网卡上。这些卡通常希望在与处理器共享的内存中建立一个循环缓冲区(通常称为DMA 环形缓冲区);每个传入的数据包都放在环中的下一个可用缓冲区中,并发出中断信号。然后驱动程序将网络数据包传递给内核的其余部分,并在环中放置一个新的 DMA 缓冲区。

所有这些情况下的处理步骤都强调有效的 DMA 处理依赖于中断报告。虽然可以使用轮询驱动程序实现 DMA,但这没有意义,因为轮询驱动程序会浪费 DMA 提供的性能优势,而不是更简单的处理器驱动 I/O。

这里介绍的另一个相关项目是 DMA 缓冲区。要利用直接内存访问,设备驱动程序必须能够分配一个或多个适合 DMA 的特殊缓冲区。请注意,许多驱动程序在初始化时分配它们的缓冲区并使用它们直到关闭 - 因此,前面列表中的分配一词意味着“获取先前分配的缓冲区”。

  • https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch13s04.html
  • https://en.wikipedia.org/wiki/Direct_memory_access
  • https://arthurchiao.art/blog/monitoring-network-stack/
  • https://blog.packagecloud.io/illustrated-guide-monitoring-tuning-linux-networking-stack-receiving-data/
  • https://blog.packagecloud.io/monitoring-tuning-linux-networking-stack-receiving-data/
  • https://www.linuxjournal.com/content/queueing-linux-network-stack
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云数智圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档