Linux内核的netpoll框架与netconsole


虽然和网络相关,但是它却不是网络协议栈的一部分,这就是netpoll。
1.中断的方式出口处理过程-数据排入发送队列,读取特定寄存器值,待网卡状态适合发送式,发送,等待发送后的中断通知,继续。
2.poll的方式出口处理过程-数据排入发送队列,读取特定寄存器值,待网卡状态适合发送式,发送,不等待发送后的中断通知,继续读取寄存器以及根据队列情况权衡是否适合发送。
a.中断方式

\


b.poll方式<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjxiciAvJmd0OzxwPjxiciAvJmd0OzwvcD48cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20150518/2015051809332093.jpg" alt="\" />


c.NAPI方式

\


理解了这个,剩下的就都理解了。至于为何会有NAPI,在本文中只能简单说一句:在高速高带宽网络中,数据包持续到来,每一个包中断一次CPU的话,CPU有点吃不消,反而耽误了CPU处理这些数据包,如果之前的数据包还没有处理完,最好的办法就是将数据包排入一个队列,然后沉默,不要打扰CPU,等CPU空下来的时候,自己去poll这些队列里面的数据包,这就是NAPI。
1.主动调用网卡的中断处理函数,获取当前该发送数据包还是接收到一个数据包;
Linux netpoll的总体图示如下:

?[-[-薜?矇^ォ鈙ZnW琲議炃^n?z?炇%y?傐?僕(炇%y粺}贶(曟膻vr夓趆朰薅?柷?濍i[-k?簴赊凳'矇^?欓砉楝逗'侴珴??欓韏亘燍薹
+?帼w璻夓哽逗'凎骐?gz趆朧…?http://www.Bkjia.com/os/linux/Linux内核中的一种在协议栈不可用或者中断机制异常的情况下与外界通讯的手段,当然它也是一种绕开协议栈的方法。这个位置足够底层,写出来的东西也肯定比基于Netfilter的更好玩。Netfilter是在协议栈的特殊点捕获数据包的,而netpoll却可以在网卡之上直接捕获数据包,它们甚至连协议栈的最底端都到不了。以后,如果想在内核态直接发包,再也不用PACKET套接字从用户态开始了,构造一个数据包,直接通过netpoll接口发出。问题是,它采用手工触发中断处理函数的方式,效率如何待测试。因此这种机制最好还是限制于调试和少量内核审计信息的发送吧。用它做VPN,我觉得悬...

相关内容