linux/windows内核模块中的无限循环



在ubuntu10.04 linux内核中,如果我insmod是一个运行的模块

while(1);

init_module部分,整个系统停止。

但是,如果我在Windows7中加载sys文件在CCD_ 3部分运行CCD_,系统运行缓慢,但仍能正常工作。

有人能解释一下为什么两种系统不同吗内核内部发生了什么?。。。

我认为在第一种情况下(init_module中的无限循环),系统没有停止的原因。因为即使我在init_module中制作while(1);,它也在运行在CCD_ 7用户应用程序的上下文中。因此流量无限循环必须通过硬件中断信号来调度。

这只是我的观点,如果我错了,我想知道细节。。。

init_module()是一个系统调用,它在内核空间而不是用户空间中运行。

根据您所观察到的,看起来NT内核并行执行模块初始化,而Linux内核则按顺序执行。这可能与它们各自的体系结构有关,NT是混合内核,Linux是单片的。

补充Frédéric的答案:在Windows上,DriverEntry函数在IRQL PASSIVE_LEVEL上运行(与几乎所有用户模式代码相同,如果我们排除APC的话)。这意味着它可以在任何时候被运行在更高IRQL的任何代码中断。因此,您可能在这里遇到的是,进入无限循环的线程仍在调度中(因此消耗CPU时间),但由于其(低)IRQL,它无法耗尽系统线程或运行的大部分其他代码。然而,它将能够饿死用户模式线程。这种影响可以是从经济放缓到被感知到的悬置系统。

最新更新