カーネル モジュールの読み取り専用メモリ ロケーション (そのようなメモリ ロケーションの例は sys_call テーブル) に書き込むには、CR0 レジスタの 16 番目のビットを操作してページ保護を無効にするだけで十分ですか?
それとも、読み取り専用のメモリ ロケーションに書き込むために、さらに何かが必要ですか?
質問する
2512 次
1 に答える
0
ページ書き込み保護を無効にすると、それに依存する何か (たとえば、カーネル ページで発生するコピー オン ライト) が壊れる可能性があります。そのようにする場合、おそらく一時的に割り込み/スケジューリングを無効にする必要があるため、メモリの変更はその CPU でアトミックに見えます。これにより、複数の CPU がある場合にスレッドを別の CPU に移動することも回避できます。
0xc12c9e90 のようなハードコードされたアドレスを使用することが良い考えかどうかはわかりません。Linux がアドレス空間のカーネル部分にどのようにレイアウトするかはわかりませんが、アドレスは、動的メモリ割り当てまたはセキュリティ上の理由により、ブートごとに変更される可能性があります (物事を移動すると、可能性が減るので便利です)。カーネルのバグの悪用など)。
于 2013-01-31T06:12:32.227 に答える