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