【ARM&Linux】Linux子系统之网络子系统-网卡驱动分析

《Linux子系统之网络子系统-网卡驱动分析》

这里写图片描述

【重要数据结构】

  1. struct net_device :描述网卡驱动的结构
  2. struct net_device_ops:设备操作统一接口操作集
  3. struct sk_buff :网络数据包描述结构,一般命名为skb

网卡驱动架构分析

《cs89x0.c》网卡驱动分析,早期使用的网卡芯片

1. 初始化分析

模块初始化入口:int __init init_module(void)函数

    //---------------------- 1. 分配net_device结构 -------------------//
    struct net_device *dev = alloc_etherdev(sizeof(struct net_local));


    //--------------------------- 2. 初始化部分成员 -------------------//
    dev->irq = irq;// 2.1 初始化中断号
    dev->base_addr = io;// 2.2 初始化基地址





//----------------------------- 更进一步初始化 -----------------------------------//
    ret = cs89x0_probe1(dev, io, 1);

//  进入`cs89x0_probe1` 函数,查看更进一步的初始化:
/**
 * 1. 初始化MAC
 * 2. 初始化netdev_ops  dev->netdev_ops    = &net_ops;
 * 3. 硬件初始化
 * 4. 注册网卡驱动:retval = register_netdev(dev);
 * 
2.数据发送分析

函数:net_send_packet分析

  1. netif_stop_queue(dev); //通知上层协议,暂停向网卡传送数据
  2. 对寄存器操作,将skb中的数据写入寄存器,让网卡发走
  3. 释放skb结构空间,dev_kfree_skb (skb);
  4. 发送完之后,会产生中断(在中断函数中(net_interrupt)的netif_wake_queue),以此通知上层协议可以再次向网卡传送数据了。

3.数据接收分析

中断处理函数:net_interrupt->net_rx函数

  1. 读取接收状态
  2. 读取接收到的数据长度
    这里写图片描述
  3. 分配skb结构:
    这里写图片描述
  4. 读取寄存器中的数据放到skb中
    这里写图片描述
  5. 将数据包向上丢给协议栈处理
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq153471503/article/details/79347923