3

OSをフリーズしているデバイスドライバーがあります。マウスも動かない。私はこの問題をデバッグしようとしていますが、1つの良いアプローチはqemuでgdbを使用することであると信じています。これは、これまで使用したことのない2つのことです。より良いアプローチはありますか?

したがって、最初に、すでに実行したデバッグシンボルを使用してカーネルをコンパイルする必要があります。

これで、ソースと同じフォルダーにあるvmlinuxという名前の新しいファイルが生成されます。 以下を使用して新しくコンパイルされたカーネルを実行できるように、これに応じたbzImageファイルも必要なようです。

qemu-system-i386 -kernel bzImage 

またはデバッグモード

qemu-system-i386 -s -S -kernel bzImage

bzImageファイルが見つかりません。どこにありますか、またはここに何が欠けていますか?bzImageは、qemu-img createを使用して作成したOSイメージを参照していますか?

また、私が理解していないのは、カーネルがコンパイルされた(vmlinux)ということです。qemuでどのように実行しますか?だから私の質問は、qemuで実行するとき、またはデバッガーがメインOSでアプリとして実行されているカーネルであるかどうかです。

また、デバイスドライバをインストールするにはどうすればよいですか?私の理解では、カーネルはUbuntuではないので、UIはありませんか?

また、qemuをインストールしましたが、qemuと入力すると、コマンドが見つかりません。qemu-system-i386、qemu-system-x86_64、またはqemu-x86_64のように、特定のプロセッサエミュレータを選択する必要があると思いますか?

qemuはkvmコマンドとどのように異なりますか?

ありがとう。

4

1 に答える 1

3

したがって、問題を正しく理解していれば、特定のハードウェアを必要としないカーネルモジュールがあります。モジュールを操作しているとき、システムはフリーズしますが、カーネルログには特別なものは何も含まれていません。

以下が役立つ場合があります。

ログの取得

あなたが説明した症状は、カーネルoopsまたはパニックの結果である可能性があります。ロギング機能は、エラーに関する情報をログファイルに出力する前に停止することがあります。シリアルポートを介してログを出力しようとする場合がありますが、これはより信頼性が高いはずです。

カーネルモジュールは特定のハードウェアを必要としないため、最も簡単な方法は、仮想マシンに使用するのと同じLinuxディストリビューションをインストールし、そのマシンの仮想シリアルポート(COM)をホストシステムのパイプに接続することです。

これは通常、非常に簡単です。たとえば、このブログ投稿には、ホストOSとゲストOSがUbuntu11.10の場合の詳細な手順が含まれています。

VirtualBoxは、仮想マシンを管理するためにそこで使用されます。QEMUを好む場合は、これも可能です。VirtualBoxを使用する方が少し簡単だと思いますが、個人的な好みの問題です。

基本的に、次の手順を実行する必要があります。

  • 仮想マシンを作成し、そこにゲストOSとして必要なLinuxディストリビューションをインストールします。
  • 仮想マシンの構成でシリアルポート(COM1、...)を有効にし、ホスト上の特別なファイル(「ホストパイプ」)に接続するように構成します/tmp/vbox_serial
  • ゲストOSを起動し、そのブートオプションを調整します。少なくとも、console=ttyS0,115200ブートローダーメニューのカーネルオプションにそのようなものを追加します。
  • ホストで、を開始するかminicomsocatまたはから読み取る他のすべてのもの/tmp/vbox_serial
  • それだ。これで、を介してホストシステムに注ぐゲストOSのカーネルログを取得する必要があります/tmp/vbox_serial。ゲストシステムがクラッシュすると、ゲスト自体のファイルに保存されていなくてもログが取得されます。

物事を簡単にするために、そのブログ投稿の作成者が提案するのではsocatなく、ホストシステムで使用することができます。minicomの力minicomはおそらくここでは必要ありません。

このようにして、ログをコンソールに出力しながら、ログをファイルに保存するsocatことができます。teeguest.log

socat /tmp/vbox_serial - | tee guest.log

カーネルoopsまたはパニックが発生した場合、ログのバックトレースは通常、何が問題になっているのかを見つけるのに役立ちます。

デッドロックの検出

シリアル接続またはその他の手段で完全なログを取得しても、疑わしいものがなく、カーネルにデッドロックが発生していると思われる場合は、 lockdepツールが役立つ可能性があります。これはカーネルに含まれています(ただし、でカーネルを再構築する必要がある場合がありますCONFIG_LOCKDEP_SUPPORT=y)。

Lockdepは潜在的なデッドロックを検出し、結果をカーネルログに出力します。このプレゼンテーションは、その出力を分析するのに役立つ場合があります。

トレース施設

システムをデバッグするためにカーネル内のいくつかのイベントをトレースする必要がある場合は、便利なツールがいくつかあります。

  • Kprobes-カーネル内のほぼ任意の場所に設定できる一種のブレークポイント。パフォーマンスに中程度の影響を与えながら、特に関数呼び出しをトレースするために使用できます。
  • SystemTap-カーネルで何が起こっているかを分析するための強力なシステム。その一部はKprobesに基づいています。
  • Ftrace-カーネルに含まれているトレースシステムは、それが重要な場合、Kprobesよりもオーバーヘッドが少なくなります。
于 2013-02-20T07:51:27.933 に答える