Null Pointer Excepitonや0除算,不正なメモリアクセスやバッファオーバフローによるスタックの書き換えなどが存在すると思いますが,他にもあったら教えてください。
例えばデバイスドライバのエラーでカーネルがクラッシュしますが,その際デバドラのどういった類のエラーでもカーネルはクラッシュするのかなどについても知りたいです。
ある程度技術的考察が深く得られるものを希望しています。
あまり適当なURLはなかったですが。
linuxは、ノンプリエンプティブカーネルです。したがって、デバドラで無限ループに陥ると、他のプロセスに制御が移らず飛びます。”URLでは古いlinuxでは”とありますが、2.4が古く、2.6が新しいということです。
あとはOSによってはリソース関連がつきると飛ぶものがありますし、ロック関係の不整合で飛んでしまうものもありますね。スタック食いつぶし系は、回避できない場合が多いです。
URLはMSDN英語版ですが...
CPUには、割り込み要求レベル(IRQL)という設定があります。CPUは高レベルのIRQLで動作している間に、より低いレベルの割り込み要求を無視します。一般ユーザースレッドとカーネルルーチンはPASSIVE_LEVEL(=0)で、APCやページフォールト要求はAPC_LEVEL(=1)で、ディスパッチャやDPCはDISPATCH_LEVEL(=2)で実行されます。(もっと高いレベルもいくつあります。)
ドライバが時々高レベルに入る必要がありますが、そのときより低いレベルの要求が動かなくなるため、いくつの制限があります。たとえば、ページフォールトは普段あるハンドラが処理するが、DISPATCH_LEVELで動作しているときページフォールトの処理はできません(APC_LEVEL<DISPATCH_LEVELので要求が無視されます)。そのときドライバが不正なメモリアクセスをすると、カーネルがすぐIRQL_NOT_LESS_OR_EQUALというエラーでクラッシュします。
詳しいご説明ありがとうございます。
本当に為になりました。
※URLはGoogleキャッシュですが、他に日本語でいい情報が見つからなかったので。
RISC系のCPUでは、URLの説明のように、アラインメントをまたがるようなメモリ参照を行うと、BUS Errorが発生して、通常クラッシュします。。UNIXの場合SIGBUSというシグナルが発行されます。
ありがとうございます。
とても知りたい情報でした。
なるほど。2.4がノンプリエンプティブとは初めて知りました。勉強になりました。
OSはCPUのバスエラーとかでもクラッシュしますよね?その辺を説明したURLがあればどなたかお願いできればと思っています。