web-dev-qa-db-ja.com

再起動せずに挿入中にエラーが発生した後、カーネルモジュールを削除または再挿入できない

カーネルモジュールの作成方法を学習していますが、すべて正常に機能していました。.koを使用してSudo insmod cheat.koをコンパイルし、挿入し、init関数内にprintkメッセージを挿入しました(module_init)が/etc/log/syslogに正しく表示されました。次に、モジュールに変更を加え、Sudo rmmod cheat.koを使用してモジュールを削除し、再度挿入したところ、printkメッセージは再び良好でした。

次に、新しい機能を試したところ、画面が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でkillすることです。

  • 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+)
    

    興味深いので、モジュールはまだロードされています...

編集

他の人が言ったように、VMを使用します。そして、それを管理するために Vagrant を使用することを強くお勧めします。

編集2

いや、Vagrantはnewbs用です。代わりにQEMU + Buildrootを使用してください: https://github.com/cirosantilli/linux-kernel-module-cheat

Linuxカーネルは、module_exit関数が正常に戻った場合にのみモジュールをアンロードします。モジュールの一部の機能がクラッシュした場合、カーネルは回復できる可能性がありますが、モジュールはメモリ内でロックされています。カーネルデータ構造をくまなく調べて、モジュールを強制的にアンロード可能としてマークすることができます(module_exit関数にパッチを適用して何もしないようにしてください)。しかし、これは危険です。あなたの最善の策は、再起動することです。

カーネルモジュールをテストする通常の方法は、仮想マシンです。開発マシンでモジュールをテストしないでください。 VMは、物理マシンに比べて、VM状態をテスト用の構成で保存し、何度でも復元できるという利点があります。のように、テスト間の起動時間を節約します。