linux网卡驱动开发一之网卡子系统模型

  自己感觉前段时间的学习,一直是东一榔头,西一棒子,所以决定听“赵磊”大哥的话:这个世界太浮躁,需要静下心来做点儿学问。于是,哥们鼓起勇气开始分析linux内核中的DM9000驱动程序


1.网络相关的程序在linux代码中的层次机构

         从哥们第一天进公司起,就让哥们开始整理**代码,我以为,整理代码应该是从一个较高的层次去整理,只有对整个代码的架构,设计流程了解了,才能算的上是去整理。

所以,什么东西都是经历过后,才能明白其中的奥秘,不是有句叫做:一览众山小嘛,所以,我将先从从一个高的层次,或者说一个抽象的层次,来阐述一下网络相关的东西(重点讨论驱动程序)在linux内核中的层次结构

        

                                                                                                      111

                                                                                                                                         图一

      好的,你看到了,我们的设备驱动程序是处于实际硬件设备层之上的一层,所以,也算起到了承上启下的作用,它是在内核空间的,真个linux内核代码有相当大的一部分就是设备驱动程序。

2.实际的网络的传递过程

       下面,我们说一下实际的网络包究竟经过怎样一个流程从用户空间发送到驱动,再到实际的硬件设备的,或者怎样由实际的设备接收之后,经由设备驱动层传递到用户空间的。上图。。。

                                                                          111

                                                                                                                                 图二

          好了,这下你清楚了吧?嗯?看不明白?好吧,怎么说哥们既然决定讲了,就将它个翻天覆地,透透彻彻。。。

          (1)接收过程,如上如,网络上的数据包到达网卡后,网卡产生中断,然后设备驱动层收到中断后,开始进行网络包的接收,接收完之后调用一个netif_rx函数交给网络协议层(层次结构上图一),然后就是一层一层的网上传到用户空间了

          (2)发送过程,从用户空间过来的数据包,经过层层穿越之后,到达网络协议层,然后调用一个dev_queue_xmit()函数之后就不管了,剩下的交给驱动层经过处理后,使用函数hard_start_xmit()函数发送,然后硬件上网卡开始发送数据包了

           这就是整个过程,如果你还是不明白,额。。。那么我只能建议你看看《计算机网络》谢老爷子写的那本,第四版或者第五版都行,如果你对中断这块儿的机制不了解,额。。。可以看看单片机相关的东西,其实,通俗的讲,中断就是一种机制,什么机制呢,举个例子就是,假如你正在上课,忽然同学打电话给你,此时,你呢,上课的状态就先断了,而要先接听电话,这就是一种中断,当然,实际的各种硬件设备的中断要比这个复杂,比如保存现场了等等,基本上是这个意思,中断是一种机制,这种机制有利于提高工作效率,还拿刚才的上课举例子,你总不能上课时一直在看有没有电话打来吧,你需要设置铃声,等电话来了通知你。。。好了。。如果说你还是不太明白。。哥啊。。咱问“百哥”或是“谷姐”吧。。

3:DM9000网卡驱动在linux中的实际设计思想.39.1”,没有为什么选择这个版本,哥们随便找了个新的就看了,但是,还是有一个原因,好像都有“喜新厌旧”的习惯吧。。。哈哈哈。。虽然是linux3.0也已经出来了,但哥们既然选择了2.6.39这条路一定要坚持下去,什么?你问我建议你下载哪个版本啊?额。。还是最新吧。。最新的体现了最新的思想,不要总是活在过去哦。。呵呵。。

          好了,扯淡到此为止,分析马上开始。。。。开始上图。。。

          111图三

       看见这两个文件了吗?看了哈。。嗯。。。这就是我们分析的重点连个文件。。。嗯?在哪?额。。。\linux-2.6.39.1\drivers\net 目录下。。。不要告诉哥们你不会用Source Insight昂,嗯?你真不会,好吧。。哥们只能勉为其难的告诉你这是一个查看代码的好工具。。剩下怎么用。。你可以去问“百哥”了。。

       好了,我们打开dm9000.c 一共2056行。。嗯。。不多。。在我们的征服范围之内。。。嗯?什么?你嫌多?唉。。其实我也嫌多啊。。我恨不得就一行。。。不过,像咱 这农二代,这点苦还是要吃的的。。好歹说哥们参加工作的第一个项目也写了2000多行代码呢。。

      好了。。还是上图吧。。不然你会说我啰嗦了。。虽然本来就是有点儿啰嗦。。哈哈。。

  1111

     嗯。。相信你自己。。你没看错。。是从最后一行往上走的。。为什么?铁道部发言说了。。“我只能说这是一个奇迹”,难怪linux都是一个奇迹。。。大家都知道对于应用程序,我们一般习惯于找main函数,然后开始分析,不过对于驱动,哥们只能拿告诉你,没有main函数,那我们开始从哪分析呢。。。答案是:module_init,模块初始化函数,这才是驱动程序的入口,当然还有一个它的清理函数module_exit

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值