Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86501
  • 博文数量: 25
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-12 22:35
文章分类
文章存档

2017年(7)

2016年(1)

2015年(17)

我的朋友

分类: 嵌入式

2015-12-31 12:08:27

       这几天回顾了一下linux接收数据包的流程,留下一点笔记,开始养成好习惯。
      2.6的linux内核接收数据包时,大部分的网络设备都具备2种方式,一种是传统的中断方式,另外一种是中断加轮询的方式(即NAPI)。
      传统中断的方式这里就不多说了,已经有很多资料都详细介绍了,唯一的缺点就是在处理高流量时会大量占用cpu资源(过多处理中断请求),影响系统性能,导致数据包无法很好的上报到内核协议栈。
      NAPI解决了传统中断方式的缺点,其核心工作流程本人理解的是:网络设备收到数据帧时,向cpu发送中断请求(关闭接收数据帧的中断,发送和其他事件的中断不关闭),中断处理程序接收数据帧,在内核处理完前面接收到的数据帧前,如果设备又收到新的数据帧,这时设备不需要产生新的中断(设备中断为关闭状态),内核继续读入设备缓冲区中的数据帧(poll函数完成),直到设备输入缓冲区为空,再重新打开设备中断。poll函数(poll函数在代表网络设备的net_device数据结构实例的poll数据域初始化),以下是poll函数的实现框架:
poll函数不会在多个cpu上同时被调用,这样就避免了并发访问控制的复杂性。
    如果设备驱动程序要实现NAPI的工作方式,则网络设备必须能存放多个数据包(硬件上或者接收队列中),在连续的接口数据包时,接口应能关闭自己设备的接收中断,而打开发送和其他事件的中断。
     这是本人第一次记录笔记,不对的地方请大神指出!

阅读(1396) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~