工控机网卡中断重入问题
hkroc 2003-08-09 11:42:24 我使用的是奔腾工控机, 网卡是RTL8139, 驱动是参考Linux的8139驱动程序使用标准C写的,在驱动之上实现了一个简易的IP协议栈.一般情况下运行都很正常.
我最近在做大数据量测试,使用一台计算机对着这块网卡猛发PING包(每包100字节以内),基本上每秒能发出达到20000个包,此时就很容易发生堆栈溢出,经多此查找原因,发现是8139的中断程序发生了重入导致的.
在此驱动程序中,我是一进来就关中断的(CLI或者disable), 直到要返回时才开中断的
(STI或者enable).经过观察堆栈,我发现堆栈中的返回地址全是在STI后的那些退栈的语句(我是反汇编看到的),这些语句反汇编的结果是:
mov esp, ebp
pop ebp
...
popad
iretd
也就是说一开中断,就有中断,最后把堆栈搞溢出了.
我想请教大家:
1.如何能减少网卡中断的次数?
2.是否可能让系统把开中断和中断返回(IRET)这些代码当作一个原子操作,这样就不会重入了