最近调试KGDBoE的过程中,终于搞明白了两个概念:NAPI和netpoll。
NAPI用于在禁止中断时以轮询模式操作接口。主要用于网络带宽很高的情况下。对于传统的driver,当接口收到一个包的情况下,就会产生一个中断。但是,当宽带接口每秒钟收到上千个包时,使用中断方式会使系统性能全面下降。所以,为了提高Linux在宽带系统上的性能,使用了一种基于轮询方式的接口。该接口在kernel中的定义:int (*poll)(struct net_device *dev, int *quota)。
netpoll的目的是让内核在网络和I/O子系统尚不能完整可用时,依然能发送和接收数据包。主要用于网络控制台(net console)和远程内核调试(KGDBoE)中。实现netpoll功能,主要是要实现kernel中的poll_controller函数,该函数定义:void (*poll_controller)(struct net_device *dev)。该函数的作用是在缺少设备中断的情况下,还能对控制器做出响应。几乎所有的poll_controller函数都定义成如下形式:
void my_poll_controller(struct net_device *dev) {
disable_device_interrupt(dev);
call_interrupt_handler(dev->irq, dev);
enable_device_interrupt(dev);
}
所以,poll_controller只是模拟了来自指定设备的中断。
阅读(704) | 评论(0) | 转发(0) |