免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: VIP_fuck

请教个网卡驱动的问题 [复制链接]

论坛徽章:
0
发表于 2010-03-03 10:03 |显示全部楼层
没有网卡驱动,这个设备就不能服务

论坛徽章:
0
发表于 2010-03-03 10:04 |显示全部楼层
回复 53# Solaris12


    兄台,我觉得前面有一个地方我怕我搞错了。想请你帮我澄清一下。

    你说eth 只需要操作rx ring就行了。是不是说根本就需要软件去‘显示’地操作eth的DMA engine,这里已经有一个‘隐藏’的engine可以‘自动’地帮你受数据了?

    可能前面这段话不是很清楚,我就以发送为例。要发送包,两种方式,哪种是对的?
    1. eth有一个tx ring,只要把包写入ring, eth只要发现ring中有新data过来,就自动去取,然后处理/发送。整个过程中,软件只要很简单的将上层的data push到ring中就行了(除非ring塞满了,所以总可以写)。整个过程中不需要中断辅助。
    2. eth没有ring,只有DMA engine,为了简单化,只有一个challen,当软件上层produce的data之后,软件首先将data送入DMA engine,接着,如果上层又有data produce了,而此时上一次的data还没被eth处理完,所以软件就不能将data送入DMA(为了简单化,假如一个challen),所以,整个过程需要DMA中断来辅助软件决定什么时候将后面produce的data送入DMA。显然比上一种复杂。


我的理解是不是eth都是第一种工作方式,对么?

论坛徽章:
0
发表于 2010-03-03 11:25 |显示全部楼层
回复  Solaris12


    兄台,我觉得前面有一个地方我怕我搞错了。想请你帮我澄清一下。

    你说et ...
snail_314 发表于 2010-03-03 10:04


就是方式1。
补充一点就是, 驱动操作tx_ring把发送数据准备好,然后通过操作网卡寄存器通知网卡可以发送,网卡的DMA引擎就开始工作了。

论坛徽章:
0
发表于 2010-03-03 12:47 |显示全部楼层
回复 63# Solaris12


    那现在软件还看得到eth的DMA不?还暴露么?
    现在的graphics也是和eth一样,只不过graphics同时也会暴露dma出来

论坛徽章:
0
发表于 2010-03-03 13:27 |显示全部楼层
回复  Solaris12


    那现在软件还看得到eth的DMA不?还暴露么?
    现在的graphics也是和eth一样,只 ...
snail_314 发表于 2010-03-03 12:47


基本不暴露。

不过写驱动的人要对DMA引擎的能力有所了解,例如有些DMA引擎是32位的,分配DMA内存时要避免分到物理地址高于4G以上的物理内存。

有的DMA引擎还要求地址按一定字节数对齐。

论坛徽章:
0
发表于 2010-03-03 15:54 |显示全部楼层
学习学习。

论坛徽章:
0
发表于 2010-03-04 02:01 |显示全部楼层
刚好最近在看发送这块,对 62楼的下面这段叙述再补充下:

原文:
1. eth有一个tx ring,只要把包写入ring, eth只要发现ring中有新data过来,就自动去取,然后处理/发送。整个过程中,软件只要很简单的将上层的data push到ring中就行了(除非ring塞满了,所以总可以写)。整个过程中不需要中断辅助。

补充:
这里有几个不是很准确的地方。上面说的那种情况,基本上适用于RTL8139网卡。驱动要把数据复制到一个固定的内存里。另外,网卡不会不停的查看是否有新数据过来的。一般是驱动向网卡上某个寄存器写个数,告诉网卡当前的TX DESC NO. 网卡这时才会去看是否有新的数据。

在INTEL E1000中,网卡功能更强了一些。驱动只要提供一个放置着 TX DESC 的RING 就可以。每个TX DESC 又指向真正的数据包,这个数据包的地址不必是固定的(当然必须是物理地址)。所以驱动只要准备好TX DESC, 把要发送的包的地址写到TX DESC里。网卡会自动读取TX DESC, 找到发送包的地址,再去到那个地址上把数据DMA到网卡上,然后发送出去。

最后,在发送时中断一般是网卡告诉驱动某个或某些数据包发送完了的。因为TX DESC 个数有限(RTL8139 是 4个,E1000可以很多,好像16K?)。所以驱动需要知道某个TX DESC是否还需要被网卡使用。如果网卡不用了,那么驱动就可以回收那个TX DESC,用来指向新的数据包。

RTL8139发送时,好像只有TX INTERRUPT 方式。在E1000中,又提供了一个状态位,而不是用中断。这样的话,在发送大量数据时,驱动可以直接轮询TX DESC, 而减少中断的次数。因为太多中断也是性能降低的一个重要因素。

论坛徽章:
12
2015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之同曦
日期:2017-03-17 19:13:162016科比退役纪念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16赛季CBA联赛之福建
日期:2016-01-14 12:49:22程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:00程序设计版块每日发帖之星
日期:2015-06-08 22:20:002015年亚洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役纪念章
日期:2018-04-10 16:20:18
发表于 2010-03-04 10:49 |显示全部楼层
这个帖子我自己收藏了,得好好看看。

论坛徽章:
0
发表于 2010-03-04 10:53 |显示全部楼层
这么多的好意见

论坛徽章:
0
发表于 2010-03-04 12:42 |显示全部楼层
刚好最近在看发送这块,对 62楼的下面这段叙述再补充下:

在INTEL E1000中,网卡功能更强了一些。驱动只要提供一个放置着 TX DESC 的RING 就可以。每个TX DESC 又指向真正的数据包,这个数据包的地址不必是固定的(当然必须是物理地址)。所以驱动只要准备好TX DESC, 把要发送的包的地址写到TX DESC里。网卡会自动读取TX DESC, 找到发送包的地址,再去到那个地址上把数据DMA到网卡上,然后发送出去。

accessory 发表于 2010-03-04 02:01


E1000网卡要写TDH寄存器才会触发DMA,所以不是自动的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP