سؤال

In ubuntu10.04 linux kernel if I insmod a module which runs

while(1);

in init_module part, entire system stops.

However, if I load a sys file in Windows 7 which runs while(1); in DriverEntry part, system gets slow but still works.

can someone explain me why two system differs and what is happening inside kernel?...

I think in first case(infinite loop in init_module), there is no reason the system stops. because even if I make while(1); in init_module, it is running in context of insmod user application program. so the flow infinite loop has to be scheduled by hardware interrupt signal.

This is just my opinion, I want to know the details if I am wrong...

هل كانت مفيدة؟

المحلول

Adding to Frédéric's answer: on Windows the DriverEntry function runs at IRQL PASSIVE_LEVEL (same as virtually all user mode code, all if we exclude APCs). Which means that it can be interrupted by any code running at a higher IRQL at any point. So what you probably encounter here is that the thread that goes into the infinite loop is still being scheduled (thus consuming CPU time), but due to its (low) IRQL it isn't able to starve the system threads or much of the other code that is running. It will, however, be able to starve user mode threads. The effect can be anything from a slowdown to a perceived hanging system.

نصائح أخرى

init_module() is a system call, it runs in kernel space and not in user space.

From what you have observed, it looks like the NT kernel performs module initialization in parallel, whereas the Linux kernel does it sequentially. It might have to do with their respective architectures, NT being a hybrid kernel and Linux being monolithic.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top