网络设备驱动设计原理

谈到设备驱动程序,首先要做的就是得有一个数据结构来表示这个设备,网络设备驱动程序也一样。网络设备驱动程序使用struct net_device结构来描述一个网络设备,这个结构体中包含了操作网络设备的所有功能函数,下面介绍网络设备驱动程序的整个流程:
(1)申请注册网络设备结构体net_device,使用alloc_netdev()函数申请net_device结构体,然后使用ether_setup()函数初始化该结构,如果是开发以太网驱动程序,可以直接使用alloc_etherdev()函数将申请和初始化一次性完成。申请初始化结构体之后,接着就是要注册网络设备,我们使用register_netdev()函数来注册网络设备,注册完成后就可以操作设备了,在注册前我们的必须指定netdev->init函数,因为这个函数将在设备注册完成后被调用。
(2)我们在netdev->init(ax88180_probe)函数中完成物理网卡内存申请,I/O端口映射,注册netdev结构体中的必要函数,比方说open()函数,hard_start_xmit()函数等待。当使用ifconfig命令时将调用open()函数,在open()函数中完成物理网卡的所有初始化(主要设置网卡的寄存器等),然后使用net_start_queue()函数通知上层协议可以发送数据了。
(3)当上层协议准备好数据后,调用netdev中注册的hard_start_xmit()函数将数据发往物理网卡的发送缓冲区,由网卡通过网线发送出去。在hard_start_xmit()函数中首先得调用netif_stop_queue()函数通知上层暂停数据发送。当网卡发送完后,产生中断,通知系统数据发生完成,然后由中断处理程序使用netif_wake_queue()函数通知上层协议继续发送数据。
(4)接收数据,当有数据要接收时,网卡芯片产生中断,根据中断类型(这里为接收中断),在中断函数中调用接收数据处理函数,此函数首先分配sk_buff结构体,然后将网卡接收缓冲区中的数据读到sk_buff缓冲区中,然后调用netif_rx(skb)函数通知上层协议接受数据。
 
(5)socket缓冲区sk_buff是数据由网卡当应用程序的通道,它指明了这个缓冲区是属于哪个网卡设备的,因为它包含了struct net_device结构。
 
(6)linux内核网络分层如下:
用户层--->协议无关层(socket层,该层将用户层和协议层分开,它提供了一组通用的函数来支持不同的协议,该层使用struct sock,sock包含了指向socket缓冲区sk_buff链表的头指针)--->网络协议层(正对各种协议,使用sk_buff传送数据)--->设备无关层--->设备驱动程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值