2

チェックサムを制御することにより、実行中のタスクのコード セグメントの整合性をチェックするカーネル モジュールを作成しています。私はいくつかのハードルに遭遇しました:

  1. module_listカーネルによってエクスポートされていない場合、変数を取得するにはどうすればよいですか ( にそのようなシンボルはありませんksyms)。コマンドを呼び出しているすべてのモジュールを確認できます。モジュールでlsmodコマンドを取得するにはどうすればよいですか?
  2. モジュールの実行中に、一部のコード セグメントが変更されたことが示されます。特定のライブラリでは常に発生します。なぜそれが起こるのですか?コードセグメントは一定だと思っていました。
  3. カーネルモジュールからプロセスデータのメモリアクセスを制御することは可能ですか?またその方法は?
4

1 に答える 1

7

自己変更コードは完全にサポートされています。なんら問題はなく、ありとあらゆるものに使われています。コードが一定であるというあなたの仮定は、単に正しくありません。そうかもしれませんが、そうではないかもしれません。

1 つの典型的な例は、SMP 対 UP システムです。たとえば、Pentium 4 クラスの Xeon マシンでは、ロックされていないインクリメントは、ロックされているインクリメントよりも 60 サイクル少なくて済みます。ロックされた増分は、SMP マシンでのみ必要です。実行時の条件によるオーバーヘッドなしに、同じコードを UP マシンと SMP マシンの両方で機能させるには、通常、自己変更コードが使用されます。命令の代わりに、 のlockような不正なオペコードud2が使用されます。SMP システムおよびUP システムでは、不正な命令割り込みがキャッチされ、ud2置き換えられます。locknop

カーネルはモジュール インターフェイスをエクスポートします。エクスポートされるのは次のとおりです。

__module_text_address __symbol_get symbol_put_addr use_module
module_layout module_put __module_put_and_exit module_refcount 
register_module_notifier __symbol_put unregister_module_notifier module_get 

/proc/modules本当に必要な場合は、解析することもできます。

于 2011-09-01T09:39:13.310 に答える