详细透彻的分析DM9000网卡驱动程序(4)

           说实话,在这码半天代码,分析了半天,是了神马啊?是因为我们出来江湖混,迟早是要还的,现在我们分析的文件早已超出了dm9000.c,我们完全可以就使用内核提供的接口,而不过问它怎么实现的,但是作为一个有刨根问底精神的人,我们还是需要知道内幕的

       正像前几天一个媒体人说到:纳税人有权知道内幕!这句强有力的呐喊。就像人梁宏达,在刘翔事件出来之后第一时间就进行了内幕分析:刘翔跑不跑?问问局领导!刘翔行不行?问问孙海平!刘翔伤没伤?问问赞助商!伤势大不大?问问冬日娜!我了个去。。尼玛,这种刨根问底精神值得学习啊!

      继续贴代码:

       

      我了个去。。还没看到函数的尾部?诚实的告诉你,忍一忍快了,谁让咱是生活在这个世纪的劳苦大众,还要修行呢?唉。。继续吧

      5819行, dev->pcpu_refcnt这个东东是什么呢?由其字面意思,我们可以推断,这是每个cpu的数据中一个叫做引用技术的东东。percpu data 是内核为smp系统中不同CPU之间的数据保护方式,系统为每个CPU维护一段私有的空间,在这段空间中的数据只有这个CPU能访问。但是这种方式不提供 对异步函数访问的保护,因此在同一个CPU上还要另外的同步原语的协作。

   那么这个赋值函数alloc_percpu(int)呢?它是给系统中每个处理器分配一个指定类型的对象。

      5823行。dev_addr_init设备地址的初始化,我们暂且搁置,一会儿回过头来看。

      5826行,dev_mc_init(dev);初始化了一个多播mac地址链表

      5827行,dev_uc_init(dev);初始化了一个单播mac地址链表

      5829行,是一个与init_net网络空间结构相关的操作,在CONFIG_NET_NS配置的情况下才会得到执行。

      5831行,GSO_MAX_SIZE表示网络接口一次能够处理的最大的buffer的大小,一般该值为64KB。

    5833-5838 初始化"n-tuple"过滤器链表,初始化napi链表,链路监视链表等一些链表数据结构。

      5839调用传进来的setup初始化网络设备,setup函数也是稍事再看。先把这个函数讲完

      5841-5844设备发送队列的个数,调用分配接收队列函数,分配队列,分配队列函数也是一会儿一并来看

      终于,这个函数快结束了,我们赶紧继续,把下一段代码贴上:

      

     我们欣慰的看到,还剩为数不多的几行代码,5846-5851行和接收队列一样,这里是分配发送队列

      5853拷贝传进来的设备名字

      5854设置网络设备的组为0

      5855返回设置好的net_dev,我去。。终于结束了,嗯?什么还有呢?额。。下面的是出错处理函数,这个真不用讲吧?相信大家都可以自己看明白的,因为很easy啊。。呵呵。。

     回过头来想想,这个函数就是分配一个net_dev的空间,然后将其各个成员赋值,这其中有三个函数我们遗留下来了,没有分析,我们现在开始一并解决啊。

    1.5823行dev_addr_init     2.5839行setup(dev)    3.5843行的netif_alloc_netdev_queues和5849行的netif_alloc_rx_queues

    先看dev_addr_init  ,上代码,额。。肚子疼啊。。尼玛可能是着凉了,唉,这年头真应该自己对自己好点儿,不要乱吃东西啊。不管了,先贴上代码,再去如厕。

       

       讲到这儿,我不知道层次够不够深了,希望你的思路还能回来,如果你是个程序的初学者,额,没办法,多看两遍吧。否则别真出不去了,不想讲了半天连个主旨都没有啊。说到这儿了,再继续阐述这个函数之前,我提醒一下读者,这是在讲alloc_netdev_mqs里的一个函数,就是分配网络设备,并初始化发送和接收队列的那个函数,它的顶层封装使我们在 驱动的probe函数里看到的那个alloc_etherdev函数。好了我们又总结回来了,现在你的思路应该略微清晰了吧?咱们继续这个函数,再进一层的就先不深入了,否则这个dm9000将一个半月够呛讲完了,越讲越内核了,脱离了驱动的本质了。

       好的,先说下一个这个函数的作用,有个宏观的认识,这个函数主要是初始化设备的地址列表,并且创建第一个元素。

       251行 你可以进入函数内部看看,就是初始化一个链表结构,很简单。

       253行  实际的创建第一个设备地址元素

       好的,第二个未阐述的问题setup(dev),我们知道这个函数是函数入口参数传递过来的一个函数指针,我们退到上一层,可以看到,其实它就是ether_setup,也很简单,不过为了保持完整性,咱们还是贴一下代码:

         可以看到,全部是初始化net_device的成员函数,

          336填充硬件head的操作函数,贴一下header_ops简单看一下吧:

         

         它的赋值是一个全局函数,我们也大概看一下,先不仔细分析,这涉及到了网络协议层

          

          协议层的东西,咱们有时间再看,只不过咱们目前的关注重点不在此

          继续ether_setup 337行

          #define ARPHRD_ETHER1/* Ethernet 10Mbps*/

          初始化的时候默认当作一个10M的网卡

           338行   #define ETH_HLEN14/* Total octets in header.*/

           ether层的头长度为14

           339行 #define ETH_DATA_LEN1500/* Max. octets in payload*/

           负载内容的最大长度为1500

           340行 #define ETH_ALEN6/* Octets in one ethernet addr*/

           一个网卡地址的长度为6

           341 每个队列最大的帧数1000

           342 支持广播和多播

           344广播地址赋值0xff,长度为6

          好了,最后一个未阐述问题,其实也是两个:netif_alloc_netdev_queues和netif_alloc_rx_queues

           一个一个的来,先netif_alloc_netdev_queues,我去。。累啊。。尼玛不管了,上代码:

主要就是分配num_tx_queues个发送队列,然后调用netdev_init_one_queue初始化每一个发送队列,还是不太难理解的,至于这个发送队列还是属于协议层范畴,还是先掠过吧,以后时间咱们再慢慢的咀嚼。

          好,下一个netif_alloc_rx_queues,上代码:

           

           我了个去,这不是和发送队列的分配一样吗?嗯??额。。唔。。虽然不是在玩儿连连看,不过这少了点儿什么好像真能看出来吧?嗯。。对啊。。少了一个初始化函数啊。。不过你看看这个接收队列的结构体倒是没发送队列那么复杂,怪不得人家没那道工序,原来人家很简单嘛。。

           嘘,长出一口气。。总算是讲完了,虽然不是那么完美吧。。但是这个函数终究是告一段落了。。我们知道驱动里这个alloc_etherdev其实就是做了两件事儿,一:分配一个net_device 二:给它做了一个基本的初始化,人家叫做generic init,我了个去。。果然是专业啊 。。尼玛回国头来看看,alloc_etherdev也像当年的干露露一样露的那么彻底,原来,就是那么回事儿。唉!浮生啊,神马都是浮云。。云淡分清之后,回去吃点儿鸡翅补补。。

       

时间: 2024-09-20 00:53:34

详细透彻的分析DM9000网卡驱动程序(4)的相关文章

详细透彻的分析DM9000网卡驱动程序(1)

转载地址:http://blog.csdn.net/bingqingsuimeng/article/details/6940276          自己感觉前段时间的学习,一直是东一榔头,西一棒子,所以决定听"赵磊"大哥的话:这个世界太浮躁,需要静下心来做点儿学问.于是,哥们鼓起勇气开始分析linux内核中的DM9000驱动程序 1.网络相关的程序在linux代码中的层次机构          从哥们第一天进公司起,就让哥们开始整理**代码,我以为,整理代码应该是从一个较高的层次去整

]详细透彻的分析DM9000网卡驱动程序(2)

有人说,少壮不努力,老大做IT,其实,哥们也挺同意这句话的.因为哥们就是做IT的,可见哥们还需要努力啊..以弥补以前欠下的债...         挥手间,又是一年,浮浮沉沉的年华,浮现着摇曳在岁月中的每一个落脚点,蓝天下,朵朵白云飘,风拂过,人在听--<车站>--       上一节我们刚刚贴了一下dm9000的代码就匆匆结束了,只是哥们不想把第一节写的那么复杂,以至于吓跑一些读者,呵呵..那么咱们就从这一篇开始分析吧..放心..我会尽量通俗的讲...       首先,我们可以看到,DM9

详细透彻的分析DM9000网卡驱动程序(3)

        以前,听过有一首歌叫做<谁是谁的谁>,好像还不错,世界这么大,你我各自走着自己的精彩的人生,到底谁是谁的谁呢?就像启东事件,就像什锦事件,还是有好多人知道自己是谁的谁,抗议了那些不知道自己是谁的人.震撼,敬佩.          本节继续上次说到那几个结构体,那么他们的作用究竟是什么呢?直接上代码:                          最基本的解释在上面了,表层的解释,第一印象,这也是人们选美的第一个标准.就想前不久,重庆环球小姐大赛出炉,海南小姐选美大赛出炉之后

详细透彻的分析DM9000网卡驱动程序(5)

              上回书说到分配一个网络设备然后进行了初始化,接下来我们继续啊,上代码上代码:                           我了个去,代码啊代码,什么时候能少点?可惜了我们这个时代的青年要完成祖国赋予的历史使命,就要做出不懈努力,毕竟it业不想娱乐圈那样,像杨幂就击败了影后得到了"最后欢迎mtv女歌手"奖,哎,为什么能得这个奖?你懂我懂大家都懂,不就难理解为什么专业评委纷纷吐槽了.            1379行,SET_NETDEV_DEV(nde

Linux下DM9000网卡驱动实验

Linux下DM9000网卡驱动实验 1.1        硬件系统介绍 1.1.1          网络驱动程序的特点     网络驱动程序是介于硬件和内核之间传送数据包,不是面向流的设备,不能象/dev/tty1那样简单的映射到文件系统的节点上.Linux调用这些接口的方式是给他们分配一个独立的名字(如eth0).这样的名字在文件系统中并没有对应项.内核和网络设备驱动程序之间的通信与字符设备驱动程序和快设备驱动程序与内核间的通信是完全不同的.内核不再调用read/write,它调用与数据包

华硕网卡驱动程序导致IE9经常显示已停止工作

  首先请按一下[Windows + R]键,然后输入 msconfig 后在按一下 确定按钮. 请按一下[服务]标签页,然后找到[AtherosSvs]服务,并且取消勾选. 接下来,请再找到[ZAtherosBt&2Wlan Coex Agent],并且取消勾选,完成之后按一下[确定]. 最后请按一下[重新启动]. 重新启动您的电脑之后,您会发现再使用 Internet Explorer 浏览网页会有明显的改善,不过若要彻底解决此问题,建议您可以去华硕官网上找到相应的电脑型号,并更新网卡驱动程

win7网卡驱动程序的安装方法

win7网卡驱动程序的安装方法: 方法一: 1.右击计算机-->管理-->设备管理器: 2.右击网卡设备--属性--驱动程序, 3.点击更新驱动程序. 4.浏览计算机以查找驱动程序软件,浏览位置直接找到光盘网卡驱动. 方法二: 直接用主板驱动光盘安装.把主板光盘放到光驱,然后双击安装,选择网卡,下一步下一步,直到完成,最后重启电脑就OK了. 方法三: 用驱动精灵来安装. 首先下载并安装好驱动精灵,打开驱动精灵,然后会自动更新主板驱动,选择网卡驱动,点击更新,直到完成.

网卡驱动程序故障怎么办

  由于杀毒.非正常关机等原因,可能造成网卡驱动程序的损坏.如果网卡驱动程序损坏,网卡不能正常工作,网络也ping不通,但网卡指示灯发光.这时可通过"控制面板"中"系统"的"设备管理器器"选项,查看网卡驱动程序是否正常,如果"网络适配器"中所显示该网卡图标上标有一黄色"!",说明该网卡驱动程序不正常,用驱动人生重新安装网卡驱动程序,即可解决问题. 驱动人生是一款免费的驱动管理软件,实现智能检测硬件并自动查找

电脑网卡驱动程序不正常怎么办

  1.使用 Windows Update.您可能需要将 Windows Update 设置为自动下载并安装推荐的更新.安装任何重要.推荐和可选的更新即可更新系统功能和其他软件(可能对修复网络连接问题有帮助). 2.安装设备制造商提供的软件.例如,如果您的计算机或网络适配器带有光盘,则此光盘可能包含用于为网络适配器安装驱动程序的软件. 3.自己下载并安装对应版本的驱动程序.您可以在制造商网站上搜索驱动程序.如果 Windows Update 无法为您的网络适配器找到驱动程序,并且该适配器未附带用