1

如果我在 ubuntu10.04 linux 内核中安装一个运行的模块

while(1);

部分地init_module,整个系统停止。

while(1);但是,如果我在部分运行的 Windows 7 中加载一个 sys 文件DriverEntry,系统会变慢但仍然可以工作。

有人可以解释一下为什么两个系统不同以及内核内部发生了什么吗?...

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

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

4

2 回答 2

2

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

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

于 2012-07-23T09:52:07.860 回答
1

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

于 2012-07-23T13:07:10.863 回答