《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中
- 将数据包向上丢给协议栈处理