在网络上搜索到一片Linux-千兆网卡驱动实现机制浅析,自己大概浏览了一下,觉得写得很好,可是自己没有看明白的时候还是白扯。想起来一句话,文档时写给已经懂了的人的。这句话在我做一个小东西的时候领悟的特别深刻。

所以还是老老实实的从代码开始吧,似乎有人说过代码面前没有秘密,可是linux开源了,未必所有搞计算机的都敢去读一读,至少我还没有。好吧,言归正传。开始e1000

同样也是2.6.28内核的e1000网卡驱动的源代码。从e1000_main.c开始,在开始之前大概浏览了一下所有的文件,四个c文件,三个h文件,数量上不多,但是我估计内容够我吃挺长时间的。

e1000_init_module中最主要的就是pci_register_driver,以及pci_register_driver的参数e1000_driver。先不去管它,继续读下去。e1000_exit_module与 e1000_init_module是对应的。功能大概就是向内核注册和删除一个模块。而这个模块实现的是注册一个驱动,即pci_register_driver和pci_unregister_driver实现的功能。希望我这些琐碎的话能为开始的人带来一点继续下去的动力。

按照顺序,e1000_request_irq从字面意义来理解,就是请求irq。我们知道网卡是离不开这个irq的,至于怎么离不开,为什么离不开,我也不是特别清楚,我只是知道连硬件都知道这个irq,足见它的重要。pci_enable_msi的功能是configure device's MSI capability structure(MSI function:Message Signaled Interrupts allow the device to write a small amount of data to a special address in memory space. The chipset will deliver the corresponding interrupt to a CPU.)可见msi功能的检测是硬件相关的,如果读intel 82571的文档应该知道如何检测,可是内核已经提供了函数,那么我们就不管了。如果有msi功能,那么handler就会被赋值为e1000_intr_msi,而不是原来的e1000_intr。突然想到irq是与中断相关的,全称为interrupt request。所以在中断处理函数handler这里会随着是否具有msi功能而不同,刚想到的不好意思。下面准备工作做好,就是request_irq来申请irq。还想起来一点东西,就是这个函数需要重新安排irq,即便硬件安排好,其实操作系统是可以改变的。只要操作系统想这么做。

e1000_free_irq用来释放irq,同样释放后如果具有msi功能,当然要关闭msi.pci_disable_msi。

e1000_irq_disable从名称来看,应该是禁止中断的。里面代码很少,只有那么四五行。将IMC寄存器写为全1,表示屏蔽所有的中断,所以中断发生也不会被提交到总线。E1000_WRITE_FLUSH这个宏其实就是读一下,读是为了更新寄存器的数据。如果看intel 82571的文档,你会发现很多奇怪的寄存器,读更新,读清零等等。synchronize_irq这个函数从名字来看,是用来同步irq的,wait for pending IRQ handlers (on other CPUs)。

e1000_irq_enable,仔细看会发现禁止irq用IMC寄存器,而使能irq用IMS寄存器。硬件的问题补要问太多为什么,文档就是神,还是去看intel 82571的文档吧,如果只是从软件的角度,那么你应该知道这个函数调用之后,irq终于好用了。可是都好用了么,也未必,看看IMS_ENABLE_MASK就知道,只是一部分可以用了。但是我们用的其实就是这一部分。

e1000_update_mng_vlan名字中的mng是什么意思,我不清楚,查询intel 82571文档发现,mng就是Manageability。就是管理子系统,而且存在属于管理子系统的寄存器。从一个网站得到的注释,不知道是否正确 Enable h/w to recognize an 802.1Q VLAN Ethernet packet。个人理解,hw->mng_cookie.vlan_id中保存了一个vid,这个vid应该是初始化的或者其他途径得到的,似乎就是想更新adapter->mng_vlan_id这个变量,然后做了检测,如果检测到新的,需要修改而且硬件支持这种修改,那么就要调用e1000_vlan_rx_add_vid来增加一个vid,随后当然要删除old_vid.从而实现更新vlan。那么我搜索一下hw->mng_cookie.vlan_id到底是如何得到的。搜索的结果是居然没有进行赋值,那么初始化就是0么?我是这么想的,初始化就是0.继续看吧,不能停在这一个地方。

e1000_release_hw_control这个函数看起来很有意思,根据不同的网卡设置不同的寄存器。来实现释放硬件控制的目的。e1000_get_hw_control与e1000_release_hw_control相同,就是对同样的寄存器进行设置操作。看来还是硬件强大,只需要一个比特就决定了一个功能是否开启。

e1000_init_manageability被adapter->en_mng_pt决定了,那么我们去看看这个adapter->en_mng_pt到底是在哪里赋值的。整个驱动对adapter->en_mng_pt赋值的一句代码就是这个:adapter->en_mng_pt = e1000_enable_mng_pass_thru(hw);那么我们有理由相信adapter->en_mng_pt决定了硬件是否具有管理功能。如果不具有那么就不存在释放的问题,如果具有管理功能,那么通知硬件释放控制。查看MANC寄存器的相关位功能,发现这个函数对MANC的一些位进行操作,实现数据包的某种程度的过滤。

e1000_release_manageability与e1000_init_manageability一样,首先判断是否具有管理功能,如果具有那么也是通过设置寄存器的位来进行释放,释放管理的意思就是通过对管理数据报的过滤来实现的。本质相同,只是表现的功能不一样而已。

e1000_configure代码不多,但是都是调用的其他函数,里面实现的功能很多,最主要的是涉及我关心的那些收发操作。

发现已经十点多了,快关门了,回去了。

未完待续。

e1000网卡驱动初感受相关推荐

  1. 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析

    本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...

  2. linux网卡e1000下载,Linux E1000网卡驱动分析

    本分析主要针对e1000网卡,驱动源码为7.3.20-k2.本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制. Linux-千兆网卡驱动实现机制浅析 作者: Minit, 出处 ...

  3. e1000网卡驱动小结

    1.网卡的初始化 e1000网卡的初始化调用函数e1000_probe(),网卡作为一种PCI设备就要初始化PCI设备的一些属性,设置DMA,初始化驱动的操作函数(收包函数.发包函数).设置循环队列缓 ...

  4. mandrake安装INTEL e1000网卡驱动

    使用U盘 #mkdir /usb #mount /dev/sda1 /usb 或 #mount /dev/scsi/host1/bus0/target0/lun0/disc /usb 如果你的电脑上还 ...

  5. Centos6.5更新e1000网卡驱动

    在工作过程中经常遇到linux的操作系统网络不正常的情况,以前没有注意到,今天查看系统日志发现原来是网络驱动的问题.索性直接更新系统,更新网卡 问题:linux系统经常出现断网的情况,重启之后系统恢复 ...

  6. e1000网卡驱动第二天

    上次写到e1000_configure,不去详细关注内部的实现.只是先按照函数的顺序来理解,e1000_set_rx_mode应该是设置接收相关的控制寄存器,设置接收的模式.e1000_restore ...

  7. e1000网卡驱动第二天_3

    e1000_open首先检查设备的状态,然后申请发送描述符和接收描述符,启动,初始化adapter->mng_vlan_id,获得硬件控制,e1000_configure,申请irq,开启设备, ...

  8. 网络数据包收发流程(三):e1000网卡和DMA

    早就想整理网络数据包收发流程了,一直太懒没动笔.今天下决心写了 一.硬件环境 intel82546:PHY与MAC集成在一起的PCI网卡芯片,很强大 bcm5461:   PHY芯片,与之对应的MAC ...

  9. e1000网卡和DMA

    1 硬件布局 每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546. 上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协 ...

最新文章

  1. ceph存储 PG的状态机 源码分析
  2. 程序员能成为设计师吗
  3. reportviewer控件mysql_如何将数据表绑定到ReportViewer运行时
  4. mac brew 安装php扩展报错:parent directory is world writable but not sticky
  5. 第三次学JAVA再学不好就吃翔(part54)--StringBuffer类的添加功能
  6. ksu7对讲机调频软件_数字对讲机的群呼功能原理是什么?你了解多少?
  7. (ECC)椭圆曲线加密算法原理和C++实现源码
  8. python selenium 用法 和 Chrome headless
  9. 学生信息管理---C#文件写入及读取
  10. 今年考了N3也不知道能不能过
  11. CCIE学习(40)—— OSPF设计与LSA类型(三)
  12. 让《强化学习(第2版)》架起一座通往强化学习经典知识宝库的桥梁
  13. 彻底解决navicat连接mysql报错:1251Client does not support authentication protocol requested by server......
  14. exe4j生成的exe反编译
  15. Unity 5.6正式版发布,Unity 2017即将来临
  16. OA系统资产管理借力工作流,覆盖从采购申请-报废的全过程
  17. pcie读写ddr_5.3 存储器、I/O和配置读写请求TLP
  18. Java实现 LeetCode 278 第一个错误的版本
  19. 【联邦学习】联邦学习
  20. 题海拾贝No.8|C语言笔试小题目集锦

热门文章

  1. win10如何修改锁屏(欢迎界面)的用户名
  2. css3实现border渐变色
  3. IC 产品的质量与可靠性测试
  4. python基础教学习题_python基础|数据类型练习题
  5. 不务正业系列7:老照片去除斑点手法
  6. jadx 反编译apk
  7. 什么是NAT模式、路由模式
  8. 关于String的intern的一个题目
  9. bugzilla 删除bug
  10. STM32中堆栈的理解