在ubuntu10.04 linux内核中如果我insmod一个运行的模块
while(1);
在init_module
部分,整个系统停止。
但是,如果我加载一个sys文件在Windows 7中运行while(1);
在DriverEntry
部分,系统变慢,但仍然有效。
有人可以解释为什么两个系统不同,内核发生了什么?…
我认为在第一种情况下( init_module
无限循环),没有理由系统停止。 因为即使我while(1);
在init_module
,它在insmod
用户应用程序的上下文中运行。 所以stream程无限循环必须由硬件中断信号来调度。
这只是我的意见,我想知道细节,如果我错了…
添加到Frédéric的答案:在Windows上, DriverEntry
函数在IRQL PASSIVE_LEVEL
运行(几乎与所有用户模式代码相同,如果我们排除了APC,则全部相同)。 这意味着任何代码都可以在任何时候以更高的IRQL运行。 所以你可能遇到的情况是进入无限循环的线程仍然被调度(因此消耗CPU时间),但是由于它的IRQL(低),它不能使系统线程或其他许多线程正在运行的代码。 但是,它将能够使用户模式线程挨饿。 效果可以是任何事情,从放缓到感知的挂起系统。
init_module()是一个系统调用,它运行在内核空间而不是用户空间。
从你所观察到的情况看,NT内核看起来像并行执行模块初始化,而Linux内核依次执行模块初始化。 这可能与他们各自的体系结构有关,NT是混合内核,而Linux是单一的 。