zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何使用Log4j
    HDU 1114
    老鼠与毒药问题
    HDU 1065
    HDU 1301(MST)
    HDU 1078
    HDU 2159
    删除字符问题(贪心)
    正整数分解为几个连续自然数之和
    OpenJudge
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/7898785.html
Copyright © 2011-2022 走看看