结论: 

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

 

posted on 2017-11-26 17:16  爱编程的小兵  阅读(490)  评论(0编辑  收藏  举报