2012-07-23 1 views
1

В ubuntu10.04 ядре Linux, если я insmod модуля, который работаетбесконечный цикл в модуле Linux/Windows ядра

while(1); 

в init_module частях, вся система останавливается.

Однако, если загрузить файл SYS в Windows 7 которая проходит while(1); в DriverEntry части, система работает медленно, но все еще работает.

может кто-нибудь объяснить мне, почему две системы отличается и то, что происходит внутри ядра? ...

Я думаю, что в первом случае (бесконечный цикл в init_module), нет причин система останавливается. потому что , даже если я делаю while(1); в init_module, он работает в контексте insmod пользовательской прикладной программы. , поэтому поток бесконечного цикла должен быть запланирован аппаратным сигналом прерывания.

Это только мое мнение, я хочу знать подробности, если я ошибаюсь ...

ответ

1

Добавление к ответу Фредерика: на Windows, функция DriverEntry работает на IRQLPASSIVE_LEVEL (так же, как практически весь код пользовательского режима, все, если мы исключаем БТРы). Это означает, что он может быть прерван любым кодом, работающим на более высоком IRQL в любой точке. Так что вы, вероятно, сталкиваетесь здесь, так это то, что поток, который входит в бесконечный цикл, все еще запланирован (таким образом, потребляет процессорное время), но из-за его (низкого) IRQL он не может голодать потоки системы или большую часть другой который работает. Тем не менее, он сможет голодать потоки режима пользователя. Эффект может быть чем угодно: от замедления до воспринимаемой подвесной системы.

+0

спасибо, это было полезно! – daehee

2

init_module() это системный вызов, она работает в пространстве ядра, а не в пространстве пользователя.

Из того, что вы наблюдали, похоже, что ядро ​​NT выполняет параллельную инициализацию модуля, тогда как ядро ​​Linux делает это последовательно. Возможно, это связано с их соответствующими архитектурами, NT - hybrid kernel, а Linux - monolithic.

+0

Я думаю, что, в частности, тот факт, что из вашего первого предложения нужно выделить, из-за неправильного представления, которое, по-видимому, придерживается здесь. – 0xC0000022L