免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanius
打印 上一主题 下一主题

有谁对网卡DMA有所了解 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-03-17 16:11 |只看该作者
pdf上也没提到多少设置dma地址的地方  重点是dma环的数据结构  这篇文章源自山大的一篇硕士毕业论文  但我在密歇根大学的一个ftp服务器上找到了一个73页的pdf  比山大的更全而且相似的地方一字不差。。。
多谢版主帮忙 山大论文有关dma环的地方已经发给版主了

[ 本帖最后由 duanius 于 2008-3-17 16:12 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2008-03-17 16:14 |只看该作者
原帖由 zx_wing 于 2008-3-17 15:12 发表

现在为啥这么麻烦了?
有人发病毒?


不知道啊,版主的权限允许上传大一些的附件,好象是2M

论坛徽章:
0
13 [报告]
发表于 2008-03-17 16:27 |只看该作者
版主已经搞定pdf了 感谢  and  如果一个pdf还不够的话  还有几篇国内外论文 欢迎索取
我现在只想知道他们能设dma到底是怎么回事  千兆网卡的私有区域有这么多文章可做么

论坛徽章:
0
14 [报告]
发表于 2008-03-17 17:28 |只看该作者
晕,pdf看了,我本以为是什么高档货呢,现在高速网卡都是这种设计。
它里面说的那两部分,说白了就是一个东西:环形链表。
每个链表元素分两部分,一个header,就是里面说的环状描述符,记录一些信息。header下面是个buffer,用于接收包。整个数据结构可以如下描述:

  1. struct ring
  2. {
  3.    struct
  4.    {
  5.       int length;
  6.       void *next;
  7.       ..........
  8.    }
  9.    char buffer[SIZE];

  10. }
复制代码


初始化的时候把这个链表的首地址告诉给硬件,硬件收到包根据header里面的信息,把包DMA到后面的buffer中去。
然后把这个链表map到用户态,让应用程序直接读,就是所谓的零拷贝了。

它这里的ring还是header和buffer连续存放的老式设计了,现在的网卡还可以做到散列的ring。
总之是个常见技术哈,不是什么新玩意。

[ 本帖最后由 zx_wing 于 2008-3-17 17:35 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-03-17 18:48 |只看该作者
这个确实不算新鲜的东西   不过我有些问题
1.为啥要搞个描述符指向缓存  直接操作缓存然后mmap到内核空间不行么
2. 8139网卡的dma区是开始设置一次位置长度以后全自动  那这种技术在81.39上面有无可能应用?

论坛徽章:
0
16 [报告]
发表于 2008-03-17 19:02 |只看该作者
原帖由 duanius 于 2008-3-17 18:48 发表
这个确实不算新鲜的东西   不过我有些问题
1.为啥要搞个描述符指向缓存  直接操作缓存然后mmap到内核空间不行么
2. 8139网卡的dma区是开始设置一次位置长度以后全自动  那这种技术在81.39上面有无可能应用?

1. 描述符,也就是我说的header,是告诉硬件一些关于缓存的信息。例如缓存的长度、下一个元素在链表中的位置。既然是缓存,当然得有一些数据结构来管理吧,malloc分配的内存还有都还有header在前面做管理,只是对应用程序隐藏了吧了。
2. 这种ring buffer也是全自动的啊,硬件初始化时把链表首地址告诉硬件了,以后就不变更了。只是每次包来了驱动要负责从buffer里面把包读出来而已。

8139的spec我没读过,但我看过一个模拟8139的设备模拟器,它的ring buffer结构和这个是类似的。可以实现。而且我认为它已经是这样实现的,你要做的就是把这个ring buffer映射到用户空间。

论坛徽章:
0
17 [报告]
发表于 2008-03-17 20:01 |只看该作者
感谢您的耐心  不过还是有些小细节我想更清楚一点   因为我觉得带描述符的这种数据结构好像在8139里面很难应用
首先就是8139的DMA机制好像比较傻瓜  我查了资料 有这样的描述“   8139网卡的有⼀个接收缓冲寄存器,用于存放接收缓存的首地址,网卡⼀边把网线上的发出的数据放到内部FIFO,⼀边从FIFO中把数据通过DMA传送到由接收寄存器指定的内存地址中,接收到的数据依次排放,当长度超过默认的缓冲区长度时,会回过头来放到开始的地方,所以接收缓冲区被称为环形缓冲区” 网卡就是一根筋的往指定的缓冲区里填数据 一边填一边往后走 到底了再从头开始   不存在太多的管理  而读数据这头由网卡驱动维护 由一个指针记录上次读到的地方  每次读完就更新  所以不太需要管理的head头(过会再仔细分析下驱动看下)
还有就是这种方式的可行性。 因为在8139中的接收缓存的分配是rtl8139_open函数 中 pci_alloc_consistent这个函数得到的一个dma_addr_t类型的值 然后在rtl8139_hw_start函数中
用RTL_W32_F (RxBuf, tp->rx_ring_dma)写入寄存器   我不确定如果我将一个描述符环首地址传给寄存器 网卡能否通过描述符上若干区域找到正确的区域再找到缓存  网卡恐怕只认dma_addr_t类型的缓存地址而不是其他类型而且含有多个管理信息的头的地址

论坛徽章:
0
18 [报告]
发表于 2008-03-17 20:32 |只看该作者
原帖由 duanius 于 2008-3-17 20:01 发表
感谢您的耐心  不过还是有些小细节我想更清楚一点   因为我觉得带描述符的这种数据结构好像在8139里面很难应用
首先就是8139的DMA机制好像比较傻瓜  我查了资料 有这样的描述“   8139网卡的有⼀个接收缓 ...

如果是这样的话也没关系啊,你把这段buffer映射到用户空间也是0拷贝了。
虽然管理这个buffer的方式变了,但本质不变。
ring的形式是硬件决定的,所以8139使用其它的方式也不奇怪

论坛徽章:
0
19 [报告]
发表于 2008-03-17 20:47 |只看该作者
哦 那样就好  因为实验室没买千兆网卡 在开发板没来的情况下我只能拿8139练练手  因为看到的一些机制和论文里看到的不一样  所以有些慌了  这样我就有点底了
谢谢zx_wing及版主的热心回复:)

论坛徽章:
0
20 [报告]
发表于 2008-03-18 11:29 |只看该作者
有人拿到过Intel 82598EB万兆卡么
看spec和驱动,这卡有64个RX ring和32个TX ring,并通过MSI-X为每个队列分配不同的中断号
卡内内置hash算法将包发到不同的queue,同时保证TCP不乱序.
在多核系统中应该有很大性能提升.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP