网卡驱动的流程分析
2015-10-08 22:33
267 查看
数据包的发送:
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所占用的内存。将接受到的数据加入一个队列,触发一个软中断标志位,
返回式基本就意味着接受数据包的中断处理函数任务已经完成。
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所占用的内存。将接受到的数据加入一个队列,触发一个软中断标志位,
返回式基本就意味着接受数据包的中断处理函数任务已经完成。
相关文章推荐
- iOS 循环引用问题
- usaco Big Barn
- CentOS 7 网络配置
- HDU 1251 统计难题 (字典树)
- 表单和 HTML 辅助方法– ASP.NET MVC 4 系列
- 双向链表
- 排序算法
- 排序算法
- 一种异步作业处理请求任务的简单实现(以短信发送为例)
- ROS(10):mac 下树莓派Raspberry Pi 烧录 img
- 个人记录
- 浏览器常用的功能
- hdu5289 RMQ+二分
- Maven2的配置文件settings.xml
- 文本框和图片在一行,图片高一头的解决办法
- 《机器学习实战》学习笔记:利用Adaboost元算法提高分类性能
- SQL增删改查语句格式参考二
- Java gui设计
- 二叉树
- [242]Valid Anagram