您的位置:首页 > 理论基础 > 计算机网络

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

2018-02-22 16:07 423 查看

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



【重要数据结构】

struct net_device
:描述网卡驱动的结构

struct net_device_ops
:设备操作统一接口操作集

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
分析

netif_stop_queue(dev); //通知上层协议,暂停向网卡传送数据


对寄存器操作,将skb中的数据写入寄存器,让网卡发走

释放skb结构空间,
dev_kfree_skb (skb);


发送完之后,会产生中断(在中断函数中(
net_interrupt
)的
netif_wake_queue
),以此通知上层协议可以再次向网卡传送数据了。

3.数据接收分析

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

读取接收状态

读取接收到的数据长度



分配skb结构:



读取寄存器中的数据放到skb中



将数据包向上丢给协议栈处理

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: