Linux网络设备驱动的实现

结论: 

1、对一个设备驱动而言,主要从两个方面进行着手,一个是控制流,一个是数据流。

  控制流就是如何控制网络设备,数据流则说的是报文的收发流程。

2、网络设备可以是Linux服务器的网卡,也可以是嵌入式设备的cpu或者交换芯片。

3、控制流分为低端的串行总线,如SMI、UART、SPI、USB等,也可以是高速总线,如PCI、PCIE总线等。

4、数据流则包含接收报文、发送报文,关键的内核数据结构是skb.

 

 

一、网络设备注册与初始化

1、 网络设备的注册

 

 

2、内核怎么知道调用驱动哪个发送函数呢?

       解答:在向内核注册网络设备时,会把驱动的实际发送函数挂接在ndo_start_xmit这个函数指针。

 

二、网络设备收包

1、接收报文的流程如下:

 

 2、驱动收包任务的处理流程:

  

 

三、网络设备发包

1、驱动发包处理。

  发包时,不用任务,而是在内核调用驱动的发包函数中直接发送。

  实现思路是,将skb中的data字段和长度信息得到,然后挂在芯片的BD结构体上,然后启动发送,硬件就会发送出去。

 

四、网络设备性能提升方法

1、总体思路:

     软硬件结合疗效好,再结合指令cache,优化收发流程处理、多核并发收发包(转发核直接使用轮询而不用中断收发包)。

 

五、skb常用操作方法

1、增、删、改、查接口:

分配skb: struct sk_buff *dev_alloc_skb(unsigned int length)

释放skb: void dev_kfree_skb_any(struct sk_buff *skb)

修改skb: 尾部增加内容:skb_put

              尾部减少内容:skb_trim

              头部增加内容:skb_push

              头部减少内容:skb_pull

查找skb的头部空间:skb_headroom

查找skb的尾部空间:skb_tailroom

 

转载于:https://www.cnblogs.com/zhouhaibing/p/7898785.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值