3

私はLinuxカーネル開発の最初のステップを実行しています。.koでインストールするカーネルモジュールを生成するコードがありますinsmod。モジュールをインストールしたときに何が起こるかをデバッグする方法が欲しいのですが、いくつかの問題に直面しています。

  1. の呼び出しをデバッグする必要がありますinit_module。この関数は実行時に呼び出されますinsmodeか?

  2. 何が起こるかをデバッグするために使用しようとしましinsmod "/my/url/fil.ko" -mたが、エラーが発生するたびにエラーが表示-1 Unknown symbol in moduleされ/cat/log/messageますunknown parameter -m

  3. GDBでデバッグする方法があるかどうか知っていますか?

4

2 に答える 2

4

はい、init_module関数は、insmodを使用してカーネルにロードするとすぐに呼び出されます。printkの行を追加して、モジュールを挿入するとすぐに印刷されていることを確認できます。

-mなどのパラメータを渡してカーネルモジュールをデバッグすることはできません。

MODULE_PARAMSを使用して、作成したカーネルモジュール内で処理することを目的としたパラメーターのみを渡すことができます。

于 2012-08-09T17:26:32.457 に答える
2

QEMU+GDBステップデバッグmodule_init

試してみる前に、まずカーネルモジュールQEMU + GDBデバッグを一般的に機能させてmodule_initください:QEMUを使用してLinuxカーネルモジュールをデバッグする方法は?

module_initカーネルモジュールがロードされる前にどこにロードされるかわからないため、より困難です。

次に、次の2つの非理想的ですが使用可能なテクニックを紹介しmodule_initます。

  1. モジュールのロードアドレスを見つけて、後で再利用します。

    モジュールのロード場所は、起動するたびに決定論的であるため、次のことがわかります。

    次に、それらを合計し、その時点で中断するようにGDBに指示します。

  2. 通話にステップインしmodule_initます。

    カーネル4.16では、最初に次の場所で中断します。

    do_init_module
    

    次に、次の手順を実行します。

    ret = fn();
    

    それからそれに足を踏み入れてください、そしてあなたはmodule_init関数の中に落ちます。

このQEMU+Buildrootセットアップは、これらの方法の両方を便利にテストするために使用できます。

于 2018-04-15T10:46:38.530 に答える