1

ubuntu10.04 Linuxカーネルで、実行するモジュールをinsmodすると

while(1);

一部、init_moduleシステム全体が停止します。

while(1);ただし、部分的に実行される Windows 7 で sys ファイルをロードするとDriverEntry、システムは遅くなりますが、それでも動作します。

2 つのシステムが異なる理由と、カーネル内で何が起こっているのか、誰か説明してもらえますか? ...

init_module最初のケース(の無限ループ)では、システムが停止する理由はないと思います。で作成while(1);しても、ユーザーアプリケーションプログラムinit_moduleのコンテキストで実行されているためです。insmodしたがって、フローの無限ループは、ハードウェア割り込み信号によってスケジュールする必要があります。

あくまでも個人的な意見ですので、間違っていたら詳しく教えていただきたいです...

4

2 に答える 2

2

init_module()はシステム コールであり、ユーザー空間ではなくカーネル空間で実行されます。

あなたが観察したことから、NT カーネルはモジュールの初期化を並行して実行するのに対し、Linux カーネルは順次に実行するように見えます。それぞれのアーキテクチャに関係している可能性があります。NT はハイブリッド カーネルであり、Linux はモノリシックです。

于 2012-07-23T09:52:07.860 に答える
1

Frédéric の回答に追加: Windows では、DriverEntry関数はIRQL PASSIVE_LEVELで実行されます (APC を除外すれば、事実上すべてのユーザー モード コードと同じです)。つまり、任意の時点でより高い IRQL で実行されているコードによって中断される可能性があります。したがって、おそらくここで遭遇するのは、無限ループに入るスレッドがまだスケジュールされている (したがって CPU 時間を消費している) ということですが、その (低い) IRQL のために、システム スレッドや他の多くのスレッドを枯渇させることはできません。実行中のコード。ただし、ユーザー モード スレッドを枯渇させる可能性があります。その影響は、速度の低下からシステムがぶら下がっていると認識されるものまで、さまざまです。

于 2012-07-23T13:07:10.863 に答える