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

时间:2012-07-23 09:43:56

标签: windows linux kernel insmod

在ubuntu10.04 linux内核中如果我insmod一个运行

的模块
while(1);

init_module部分,整个系统停止。

但是,如果我在Windows 7中加载sys文件 在while(1);部分运行DriverEntry, 系统变慢但仍然有效。

有人可以解释为什么两个系统不同 内核中发生了什么?...

我认为在第一种情况下(init_module中的无限循环), 系统没有理由停止。因为 即使我在while(1);init_module,它也在运行 在insmod用户应用程序的上下文中。 所以流量无限循环必须由硬件中断信号调度。

这只是我的意见,如果我错了,我想知道细节......

2 个答案:

答案 0 :(得分:2)

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

根据您的观察,看起来NT内核并行执行模块初始化,而Linux内核按顺序执行。它可能与它们各自的体系结构有关,NT是hybrid kernel而Linux是monolithic

答案 1 :(得分:1)

添加到Frédéric的答案:在Windows上,DriverEntry函数在IRQL PASSIVE_LEVEL运行(与几乎所有用户模式代码相同,如果我们排除APC,则全部相同)。这意味着它可以被任何点上运行在更高IRQL的任何代码中断。所以你可能在这里遇到的是进入无限循环的线程仍然被调度(因此消耗CPU时间),但是由于它的(低)IRQL,它不能使系统线程或其他大部分线程饿死正在运行的代码。但是,它可以使用户模式线程饿死。效果可以是从减速到感知悬挂系统的任何事情。