1

Linux カーネルでページ フォールトの例外処理をインターセプトする必要がありますが、カーネル ソースを変更してカーネルをコンパイルすることは許可されていません。カーネルモジュールでこれを行う必要があります。私は今、いくつかのアプローチを持っています。


  1. IDT テーブルをコピーし、ページ フォールトの ISR を置き換えます。しかし、カーネルのアセンブリ コードを調べたところ、ISR がモジュールのコンパイル時にアドレスを特定できない関数を呼び出していることがわかりました。たとえば、callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>.
  2. kprobe/jprobe メカニズムを使用して をインターセプトdo_page_faultしますが、すべてのカーネルが kprobe を有効にして構成されているわけではありません。
  3. の最初の数バイトdo_page_faultを、コードにジャンプするジャンプ命令に置き換えます。ただし、do_page_faultコードで後者を使用する必要があります。置き換えた命令を別の場所に配置する必要がありますが、x86 コードのサイズを決定するのは難しく、置き換えられた命令の 1 つがジャンプである場合、事態はさらに複雑になります。

問題を解決するアイデアはありますか?

4

1 に答える 1

4

ハンドラーを指すように IDT エントリを変更します。必要に応じて、そこから元のハンドラーを呼び出します。IDT をコピーしたり、既存のコードにパッチを適用したりする必要はありません。

于 2013-04-25T10:48:14.543 に答える