免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-02-27 12:54 |显示全部楼层
回复 29# davycu
Google一下先

论坛徽章:
0
发表于 2010-02-27 13:24 |显示全部楼层
网卡驱动主要就是对接收到的数据包进行处理,比如说是否需要抛给上层处理等等。
没有对应驱动的情况下,大多数的硬件在上电后,数据包的接收是接收,只是硬件没有相应的处理方式,比如是丢弃抑或进行回应。
所以一般在开发网卡驱动的时候需要先对网卡的收包进行处理,收包处理正确后再进行发包部分的开发
个人愚见
各位大牛海涵

论坛徽章:
0
发表于 2010-02-27 13:28 |显示全部楼层
建议学习网卡驱动可以先看看内核中的驱动部分
各种skb...
netcore等等
其实明白了网络子系统部分
所有的东西都会豁然开朗

论坛徽章:
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-02-28 10:40 |显示全部楼层
看来还要了解一下网卡的硬件知识才行。

论坛徽章:
0
发表于 2010-02-28 10:41 |显示全部楼层
你的数据包过来后通过网卡驱动产生一个中断,通过中断来把数据放到一个sk结构体中,然后再包送到对应的包接受列表中(驱动的功能);再通过一个软中断把刚才的包发送给协议处理堆栈(处理数据包netfilter的功能)

论坛徽章:
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-02-28 11:02 |显示全部楼层
回复 35# yongyett


    这些我知道。


    不过还是谢谢你的热心回复。

论坛徽章:
0
发表于 2010-02-28 18:08 |显示全部楼层
本帖最后由 Solaris12 于 2010-03-01 13:30 编辑
回复  VIP_fuck
识别不到确实是因为没有驱动的原因,驱动在找到网卡后要向linux注册网络设备,至于能不能收到就看网卡硬件复位后的初始状态下的phy是打开还是关闭的了,这个一般是硬件决定的
shank941 发表于 2010-02-26 17:01


丰富了一下内容,发表在博客上了:

网卡工作在osi的最后两层,物理层和数据链路层。


物理层的芯片称之为PHY。物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。


以太网卡中数据链路层的芯片称之为MAC控制器, 数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。


MAC和PHY之间的关系是PCI总线接MAC总线,MAC接PHY,PHY接网线(当然也不是直接接上的,还有一个变压装置),很多网卡的这两个部分是做到一起的。

PHY和MAC之间互连的界面是IEEE定义的标准:MII/GigaMII(Media Independed Interfade,介质独立界面)。MII界面传递了网络的所有数据和数据的控制。


写文章的这天有人在网上问, 如果操作系统没有加载网卡驱动,网卡虽然在系统设备树上,但网卡接口创建不了,那网卡实际能不能接收到数据? 下面是我在网上讨论的整理:

这里面有很多细节, 我根据Intel网卡的Spec大概写了写, 想尽量写的通俗一些,所以没有刻意用Spec里的术语,另外本文虽然讲的是MAC/PHY,但光口卡的(SERDES)也是类似的。

1. PCI设备做reset以后进入D0uninitialized(非初始化的D0状态, 参考PCI电源管理规范),此时网卡的MAC和DMA都不工作,PHY是工作在一个特殊的低电源状态的。

2. 操作系统创建设备树时,初始化这个设备,PCI命令寄存器的 Memory Access Enable or the I/O Access Enable bit会被enable, 这就是D0active。此时PHY/MAC就使能了。

3. PHY被使能应该就可以接收物理链路上的数据了,否则不能收到FLP/NLP, PHY就不能建立物理连接。但这类包一般是流量间歇发送的.

4. 驱动程序一般要通过寄存器来控制PHY, 比如自动协商speed/duplex, 查询物理链路的状态Link up/down。

5. MAC被使能后, 如果没有驱动设置控制寄存器的一个位(CTRL.SLU )的话, MAC和PHY是不能通讯的, 就是说MAC不知道PHY的link已经ready, 所以收不到任何数据的。这位设置以后, PHY完成自协商, 网卡才会有个Link change的中断,知道物理连接已经Link UP了。

6. 即使Link已经UP, MAC还需要enable接收器的一个位(RCTL.RXEN ),包才可以被接收进来,如果网卡被reset,这位是0,意味着所有的包都会被直接drop掉,不会存入网卡的 FIFO。老网卡在驱动退出前利用这位关掉接收。Intel的最新千兆网卡发送接收队列的动态配置就是依靠这个位的,重新配置的过程一定要关掉流量。

7. 无论驱动加载与否, 发生reset后,网卡EEPOM里的mac地址会写入网卡的MAC地址过滤寄存器,驱动可以去修改这个寄存器,现代网卡通常支持很多MAC地址,也就是说,MAC地址是可以被软件设置的。例如,Intel的千兆网卡就支持16个单播 MAC地址,但只有1个是存在EEPROM里的,其它是软件声称和设置的。

8. 但如果驱动没有加载,网卡已经在设备树上,操作系统完成了步骤1-2的初始化,此时网卡的PHY应该是工作的,但因为没有人设置控制位(CTRL.SLU)来让MAC和PHY建立联系,所以MAC是不收包的。这个控制位在reset时会再设置成0。

9. PHY可以被软件设置加电和断电, 断电状态除了接收管理命令以外,不会接收数据。另外,PHY还能工作在Smart Power Down模式下,link down就进入省电状态。

10. 有些多口网卡,多个网口共享一个PHY, 所以BIOS里设置disbale了某个网口, 也未必会把PHY的电源关掉,反过来,也要小心地关掉PHY的电源。

11. 要详细了解PHY,最终还是要熟悉IEEE以太网的相关协议。

评分

参与人数 1可用积分 +24 收起 理由
Godbach + 24 多谢分享

查看全部评分

论坛徽章:
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-01 07:40 |显示全部楼层
感谢楼上

论坛徽章:
0
发表于 2010-03-01 17:43 |显示全部楼层
实际物理网卡内有以太网帧缓存,网卡只判断一个以太网物理帧是否收到并放入缓存(网卡内部)
收到一个物理帧后发中断给CPU或者驱动程序poll这个以太网帧。
如果没有驱动程序处理这个中断,或没有驱动程序poll这个以太网帧,后续收到的数据帧就会覆盖前面的帧。
网卡的物理功能还包括网卡上电(不上电的话物理帧都不收)、多播过滤等,都需要驱动程序配置网卡的寄存器。
网卡驱动负责初始化网卡(上电,多播过滤等),处理网卡中断以收发数据包及判断网卡的错误状态。
驱动程序收到物理帧之后就提交给协议栈,交给上层处理

论坛徽章:
0
发表于 2010-03-01 21:51 |显示全部楼层
实际物理网卡内有以太网帧缓存,网卡只判断一个以太网物理帧是否收到并放入缓存(网卡内部)
收到一个物理帧后发中断给CPU或者驱动程序poll这个以太网帧。
如果没有驱动程序处理这个中断,或没有驱动程序poll这个以太网帧,后续收到的数据帧就会覆盖前面的帧。
网卡的物理功能还包括网卡上电(不上电的话物理帧都不收)、多播过滤等,都需要驱动程序配置网卡的寄存器。
网卡驱动负责初始化网卡(上电,多播过滤等),处理网卡中断以收发数据包及判断网卡的错误状态。
驱动程序收到物理帧之后就提交给协议栈,交给上层处理


这里面有几个错误:

1. 如果你说的是支持DMA的网卡,那网卡内部的缓存不是驱动来poll的,应该是DMA来读到host memory上的。

2. 没有人处理FIFO,FIFO是会满的,后续的包会被drop掉,而不是覆盖。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP