网卡驱动的流程分析

数据包的发送:
void *priv; /* pointer to private data 分配结构体的时候会多分配一块内存用来存放私人数据*/
int (*hard_start_xmit) (struct sk_buff *skb,struct net_device *dev);
struct sk_buff *skb是网络设备驱动程序中另一个重要的数据结构,通常叫做套接字缓冲区
skb->data指向发送数据包在内存中的位子,而skb->len则是以字节为单位的该数据的长度
第二个参数dev自然就是本次用来发送网络数据的设备对象了。
驱动程序通常使用DMA的方式将套接字缓冲区中的数据传输到网络设备的存储空间,然后由网络设备的硬件
逻辑负责把设备存储空间刚接受到的数据发送出去,在数据发送成功后,会产生一个硬件中断已通知驱动程序
进行相应的处理,比如释放上层传下来的套接字缓冲区,将要发送的数据封装在套接字缓冲器
skb中。需要注意的是,网络子系统高层传下来的额套接字缓冲区需要有设备驱动程序在完成一次
DMA传输后负责释放。


数据包的接受:
int netif_rx(struct sk_buff *skb)
如同网路数据包的发送一样,驱动程序中接收数据包的实现方法依然依赖于具体的硬件设备,但是这个
通常驱动程序需要分配一个套接字缓冲区skb来容纳收到的数据包,然后将skb传递到网络子系统的
上层代码中,后者负责释放skb所占用的内存。将接受到的数据加入一个队列,触发一个软中断标志位,
返回式基本就意味着接受数据包的中断处理函数任务已经完成。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值