linux网络设备驱动之实质篇

在讲解linux内核自身携带的网络设备驱动程序之前,先讲解一下网络设备模型,知道要做些什么。


对于网络设备驱动,主要目的就是接受数据和发送数据。而人们把网络设备的体系结构就分为上面四层,就是为了更好的实现上面两个功能。怎么更好,后面会说到。先来个总介,后面在展开细讲。

网络协议接口层提供两个函数,dev_queue_xmit发送函数和netif_rx接收函数,而网络设备接口层其实姐是一个数据结构模型,net_device数据结构。而设备驱动功能层就是对net_device数据结构函数成员指针的具体实现,最后万股咯设备媒介层就是网卡等网络设备。现在开始讲解。

第一个问题,网卡的主要任务是什么,如何实现这些任务?

对于linux而言,几乎所有驱动都是定义结构体,填充结构体,最后注册结构体,网卡驱动也一样。这说明什么?网卡主要是发送数据和接收数据 ,这两个功能的实现就是把网卡的功能体现到数据结构,然后操作数据结构。在linux内核已经定义了一个结构体net_device,每一个net_device对应一块网络设备。并且net_device是靠dev_base这个链表组织起来的,所以当系统上电时候,就会去扫描该网络设备,然后会去遍历dev_base找到对应的结构体net_device。


第二个问题就是我们需要做些什么?

首先,说一下,上面那个图。其实那个图也不难理解,类比一下,字符设备驱动是如何实现访问设备的。用户层调用read,就会调用数据结构file_operations模型的read函数指针,进而调用驱动程序中的read函数指针指向的具体函数实现。其实上面那个图也一样,用户层调用协议层的dev_queue_xmit发送函数,那么就会调用网络设备结构层的数据结构net_device模型中的成员hard_start_xmit,进而调用设备驱动功能层的对hard_start_xmit函数指针指向的具体函数实现,最后通过该函数访问设备。所以网络设备接口层其实姐是一个数据结构模型,net_device数据结构。而设备驱动功能层就是对net_device数据结构函数成员指针的具体实现。而对于网络设备接收就有点特别。当数据到来的时候,网卡会产生中断信号,并且数据存放于网卡的RAM里。中断信号产生能后就会调用驱动层的中断程序,在程序里接收网卡数据,并且发送给协议层,协议层通过

netif_rx接收函数接收到数据。

所以对于我们要做什么?最核心的就是接收函数,和中断函数。当然驱动层接收数据和发送数据都和网卡挂钩,也就是必须得网卡接收数据之后,驱动层才能从网卡拿到数据,发送也一样。所以具需要对网卡进行侦测以及寄存器进行操作,在初始化函数进行侦测,在打开时候对网卡进行寄存器初始化配置。其实在接收和中断也需要,这不用多说的。


最后一个问题就是怎么做?

这体现在初始化函数、打开函数、关闭函数、接收函数、中断函数、接收函数(在中断中调用)。

1.初始化函数:

当系统一加载该网络驱动,那么初始化函数就会自动被调用,并且在初始化函数中调用了prove侦测函数,该函数实现的任务:

检测网络设备是否存在,申请硬件资源,初始化net_device结构体,还有初始化设备的私有数据,最后注册该设备,也就是net_device结构体。其实对于以太网,在初始化该结构体时候,对共有的且对任何设备都可用的信息都抽象为一个函数ether_setup()。


2.打开函数

其实在应用层,打开网络驱动,不能通过打开文件形式来操作。那如何进行?就是通过网络接口,如eth0等。所以当你在终端执行ifconfig,如ifconfig  eth0 up时候,就会执行驱动层的打开函数。

实现的任务:配置网络设备寄存器、使能设备使用到的硬件资源、开启数据传输队列


3关闭函数

和上面一样,通过执行 ifconfig ***  down来调用的。实现的任务:清空网络设备寄存器、释放使用到的硬件资源、中止数据传输队列


4.发送函数

当协议层调用dev_queue_xmit发送函数时使用。

实现的任务:

从上层协议传递的sk_buff数据包中将有效数据和有效长度获取出来、设置玩卡寄存器主要判断位网卡是否可发送以及将数据写到网卡缓存中,最后一个就是释放驱动层申请的套接字缓存。、


5.接收函数

这个函数是在中断中被调用的。

实现的任务:判断网卡接受的数据是否正确、申请sk_buff套接字缓存区,将网卡缓存的数据读到该套接字缓存区、将数据在发送给协议层。


6.中断函数

在网卡接收到数据产生中断信号时候被调用。

实现的任务:

从中断状态寄存器ISQ内容判断出发中断事件类型。若为接收时间,就调用上面的接收函数。若为发送时间或则缓存时间,就判断异常时间并记录相关错误信息。若为数据包发生碰撞,那么就对数据碰撞次数进行记录。若为数据包丢失时间,就对丢失次数进行记录。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值