Question

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...

Was it helpful?

Solution

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.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top