网卡驱动流程分析

本文详细分析了Linux网络子系统,包括System call interface、Protocol agnostic interface、Network protocols和Device drivers。重点讨论了DM9000网卡驱动的初始化、发送和接收过程,以及中断处理。介绍了net_device结构和sk_buff数据结构在网络驱动中的作用,并给出了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.网卡驱动架构分析
1.1linux网络子系统
1.2.重要数据结构
1.3.网卡驱动架构分析

1.1linux网络子系统

linux网络子系统可以分为System call interface(系统调用接口),Protocol agnostic interface(协议无关接口),Network protocols(网络协议栈),Device agnostic interface(设备无关接口),(Device drivers)设备驱动程序
系统调用接口层
为应用程序提供访问网络子系统的统一方法。
协议无关层
提供通用的方法来使用传输层协议。
协议栈的实现
实现具体的网络协议
设备无关层
协议与设备驱动之前通信的通用接口
设备驱动程序

1.2.重要数据结构.

在Linux内核中,每个网卡都由一个net_device结构来描述,其中的一些重要成员有:
char name[IFNAMSIZ]
设备名,如:eth%d
unsigned long base_addr
I/O 基地址
const struct net_device_ops *netdev_ops;
net_device_ops结构记录了网卡所支持的操作。
static const struct net_device_ops dm9000_netdev_ops =
{
.ndo_open = dm9000_open,
.ndo_stop = dm9000_stop,
.ndo_start_xmit = dm9000_start_xmit,
.ndo_do_ioctl = dm9000_ioctl,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr,
};
Linux内核中的每个网络数据包都由一个套接字缓冲区结构struct sk_buff 描述,即一个
sk_buff结构就是一个网络包,指向sk_buff的指针通常被称做skb。其中包含4个成员,head,data,tail,end,其中data和tail指向数据的头和尾,head和end指向数据包的头和尾。

1.3.网卡驱动架构分析

1.3.1初始化
1.3.1.1分配net_device结构-alloc_etherdev
1.3.1.2初始化net_device结构(设备号,基地址,MAC地址,netdev_ops)
1.3.1.3初始化硬件
1.3.1.4注册网卡驱动—register_netdev
1.3.2数据发送
1.3.2.1通知上层协议,暂停向网卡发送数据-netif_stop_queue
1.3.2.2将SKb的数据写入网卡寄存器,发送走

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值