再起動せずにカーネルモジュールの挿入中にエラーが発生した場合、カーネルモジュールを削除または再挿入することはできません。

再起動せずにカーネルモジュールの挿入中にエラーが発生した場合、カーネルモジュールを削除または再挿入することはできません。

カーネルモジュールの作成方法を学んでいますが、すべてがうまくいきます。コンパイルして挿入すると、init.ko関数内のメッセージが正しく表示されます。その後、モジュールを変更、取り外し、再挿入します。メッセージは再び正常です。sudo insmod cheat.koprintkmodule_init/etc/log/syslogsudo rmmod cheat.koprintk

その後、新機能を試してみると、画面はエラーメッセージのあるttyのようになります。 ctrl-alt-f2 ctrl-alt-f7(私はUbuntuにいます)を実行し、Xサーバーに戻ります。

ソースファイルに対する最新の修正をキャンセルして再コンパイルしましたが、問題は再起動せずに再テストするためにモジュールを再挿入できないことです。これはテストするのが面倒です。

再起動せずに修正されたモジュールを再挿入するには?

私が試したことと得た情報は次のとおりです。

  • cat /etc/log/syslog:私に関連する唯一の情報は次のとおりです。

    BUG: unable to handle kernel NULL pointer dereference at 00000003
    

    それが問題の原因であるようですが、次のメッセージが表示されます。

    Oops: 0002 [#1] SMP
    

    以下は恐ろしいデバッグ情報ですが、モジュールを再挿入する方法には役に立たないようです。

  • sudo insmod cheat.ko:何も出力せずにコマンドを中断します。この端末エミュレータを引き続き使用できる唯一の方法は次のとおりです。c-c

  • sudo rmmod cheat:

    Error: Module cheat is not currently loaded
    
  • sudo modprobe -r cheat.ko

    FATAL: Module cheat.ko not found.
    
  • lsmod | grep cheat:

    cheat                  19009  -2
    

    -2その中の使用回数はとても受賞しています...

  • cat /proc/modules | grep cheat

    cheat 19009 1 - Loading 0x00000000 (OF+)
    

    面白いですね。モジュールがまだ読み込まれています...

編集する

他の人が言ったように、仮想マシンを使用してください。積極的に活用することをお勧めします徒歩旅行者それを管理するため。

編集2

いいえ、Vagrantは初心者のためのものです。代わりにQEMU + Buildrootを使用してください。https://github.com/cirosantilli/linux-kernel-module-cheat

答え1

module_exitLinuxカーネルは、モジュール関数が正常に返された場合にのみモジュールをアンロードします。モジュールの一部の機能がクラッシュした場合、カーネルは回復できますが、モジュールはメモリにロックされています。カーネルのデータ構造を見て、モジュールをロード不可能としてマークするように強制することもできますが、module_exit何もしないように関数をパッチしてみてください。最良の方法は再起動することです。

カーネルモジュールをテストする一般的な方法は、仮想マシンで実行されます。開発コンピュータでこのモジュールをテストしないでください。物理システムと比較すると、VMの利点は、テストの準備が整った構成でVMの状態を保存し、必要に応じて複数回復元できるため、テスト間の開始時間を節約できます。

関連情報