2012-01-05 17 views
2

私は、カーネルモードとユーザーモードの両方の目的と、前者から後者への移行がどのように起こるかを理解しています。しかし、カーネルモードで発生したクラッシュはデバッグするのが難しく、Telnet(例:here is an example)を介して接続することでリモートで実行する必要があるとの多くの情報源があります。カーネルモードでのデバッグが難しいのはなぜですか?

なぜデバッグするのが難しいですか? カーネルスレッドのいずれかに(カーネル)デバッガを接続して通常の方法で使用できないのはなぜですか?

答えて

4

カーネルモードでクラッシュすると、デバッガ自体でさえメモリ内のデータ構造どこでもが破損する可能性があります。その弾丸を作ることは難しいです。

通常のデバッグでは、デバッガとデバッグしているものの2つのプロセスが完全に分離されています。彼らは平等に作られた "仲間"です。デバッグ中のプロセスは、デバッガが何をしていてもデバッガには触れません(おそらくそれが存在するかどうかはわかりません)。一方、デバッガはデバッグ中のプロセスと対話することができ、固定された予測可能な方法ですべての通常のユーザープロセスに常に適用されます。

例:ローカルデバッグの場合はどのようにキーボードインターフェイスをデバッグし、シリアルポートを経由する場合はRS232コードをデバッグしますか? NICドライバまたはネットワークスタック(ネットワーク経由の場合)それらのいずれかにブレークポイントを設定すると、デバッガを制御するデバイスにアクセスできなくなるため、回復不能になります。最悪のシナリオでは、どのようにカーネルデバッガをデバッグしますか? GDBでは、少なくとも理論的にはGDBインスタンスをGDBの別のインスタンスにアタッチすることができます。カーネル空間では、物を仲介する上にレイヤーがないので、それは不可能です。

+0

私はそれを理解していると思います。私が間違っていると私を修正してください:それは、カーネルモードで実行されているすべてのプロセスが同じアドレス空間を共有していることを意味しますか?それが本当なら、それには理由がありますか? – qdii

+0

はいカーネルアドレス空間はすべてのプロセスで共有されています。 Linuxカーネル用の汎用カーネルコード(特定のデバイスのドライバではない)がある場合は、QEMUを使用できます。 QEMU上で動作するソフトウェアにgdbを添付することができます。したがって、gdbを使用しているユーザコードのようなカーネルコードを実行することができます。しかし、あなたのコードがエミュレーションが利用できないデバイスドライバなどのデバイス固有のものであれば、あなたのソフトウェアは実行されません。 – Saurabh

+0

@ user420536質問は実際にLinuxやアーキテクチャを指定していません。非常に異なる場合があります。 – Flexo

0

カーネル自体が、(適切なディスプレイドライバと通信して)モニタに画像を表示しても、それだけでは機能しないため、インタラクティブに(またはローカルで)デバッグすることはできません。私はあなたの質問を別のやりかたにします:カーネルをtelnetで接続するより簡単にデバッグすることは可能ですか?

私の答えは:はい、そうです。少なくとも仮想化を利用したX86/X64アーキテクチャ上。私はローカルマシン上でデバッグできるゲストOSを実行するためにVirtualBoxを使用しています。また、私はVirtualKD(http://virtualkd.sysprogs.org/)を使って、デバッグマシン(ホスト)とVMの間の通信を大幅に高速化しています。

VirtualKDには、ゲストWindowsのboot.iniを変更するパッケージが含まれているため、Windowsが表示する適切なメニュー項目を選択することで、起動時にデバッグを有効にすることができます。

関連する問題