在ubuntu10.04 linux内核中如果我insmod一个运行
的模块while(1);
在init_module
部分,整个系统停止。
但是,如果我在Windows 7中加载sys文件
在while(1);
部分运行DriverEntry
,
系统变慢但仍然有效。
有人可以解释为什么两个系统不同 内核中发生了什么?...
我认为在第一种情况下(init_module
中的无限循环),
系统没有理由停止。因为
即使我在while(1);
中init_module
,它也在运行
在insmod
用户应用程序的上下文中。
所以流量无限循环必须由硬件中断信号调度。
这只是我的意见,如果我错了,我想知道细节......
答案 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,它不能使系统线程或其他大部分线程饿死正在运行的代码。但是,它可以使用户模式线程饿死。效果可以是从减速到感知悬挂系统的任何事情。