zoukankan      html  css  js  c++  java
  • 《精通linux设备驱动程序开发》 第15章网络接口卡 学习笔记

    主要内容:

    • 驱动程序数据结构
    • 与协议层会话
    • 缓冲区管理和并发控制

    1.驱动程序数据结构

    在为一个NIC写设备驱动程序时,必须操作3个关键数据结构

    (1)形成网络协议栈构造块的数据结构。套接字缓冲区,即定义在include/linux/sk_buff.h文件的结构体sk_buff,是内核TCP/IP栈使用的关键结构体。

    (2)定义在NIC驱动程序和协议栈接口的数据结构,定义在include/linux/netdevice.h文件中的结构体net_device是构成该接口的核心结构体。

    (3)I/O总线相关的结构体。

    1.1 套接字缓冲区

    Sk_buffLinux网络层提供了高效的缓冲区处理和流量控制机制。sk_buff拥有描述对应内存缓冲区的控制信息,sk_buff5个主要的域将它自身与数据包缓冲区联系起来:
    head,用于指向数据包的开始;

    data,用于指向数据包载荷的开始

    tail,用于指向数据包载荷的结束;

    end,用于指向数据包的结束;

    len,数据包包含的数据量;

    1.2 网络设备接口

    NIC驱动程序使用标准接口与TCP/IP协议栈互操作。net_device结构体定义了这个通信接口,下面通过NIC驱动程序初始化步骤,来了解下net_device结构体内部准备:

    ①驱动程序用alloc_netdev()分配一个net_device结构体,

    ②驱动程序在分配的net_device中填充多个成员,并用register_netdev(net_dev)向网络层注册net_device

    ③驱动程序从EEPROM读取NICMAC地址

    2.与协议层会话

    2.1接收数据

    (1)在中断模式下,中断处理程序通过调度NET_RX_SOFTIRQ向协议层投递收到的数据包,然后屏蔽NIC中断,接着通过向轮询列表增加设备来切换到轮询模式;

    (2)驱动程序通过它的net_device结构体提供一个poll()方法;

    (3)在轮询模式下,驱动程序的poll()方法处理接收队列中的数据包,当队列变空时,驱动程序重新启用中断,并通过调用netif_rx_complete()切回到中断模式;

    2.2发送数据

    协议栈以sk_buff作为输出参数调用驱动程序的hart_start_xmit()方法,驱动程序用DMA方式将数据包数据去除送给NIC

    驱动程序在完成预定数量数据包的传输后,设置NIC向处理器发出中断请求,只有当表示传输操作完成的传输完成中断出现时,驱动程序才能收回或释放资源。

    3.缓冲区管理和并发控制

    NIC驱动程序维护一个发送和接收DMA描述符的链表,并未缓冲管理执行释放和占用缓冲池。在设备打开期间预分配环形DMA描述和相关的sk_buff;当可用缓冲区低于预定水平线时重组空闲缓冲池;当NIC发送完成时回收用过的缓冲区到空闲池,并接收中断。

    stay hungry, stay foolish
  • 相关阅读:
    分页存储过程
    C#,单元测试
    telerik reporting报表
    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
    .NET提供了三种后台输出js的方式:
    转换人民币大小金额
    ASP.Net Post方式获取数据流的一种简单写法
    js数组中两个有相同删除一个
    我的个人博客
    It is the courage
  • 原文地址:https://www.cnblogs.com/zygote/p/14002863.html
Copyright © 2011-2022 走看看