ハードウェアがNXビットを提供しない32ビットx86などのプラットフォームでNXビットをエミュレートする方法を誰かに説明してもらえますか?どうやって実現できるのか想像がつかないので、エミュレートの基本を説明していただければ幸いです。前もって感謝します。
2 に答える
Exec Shield、PaX PAGEEXEC、およびPaX SEGMEXECについて読みたいと思うかもしれません。
私は NX エミュレーションを実装したことはありませんが、x86 について何か知っていると、それがどのように機能するかについての私の最良の推測です。
それはすべて、カーネルがグローバル記述子テーブルをセットアップして、コードを含むことができるアドレスの範囲を定義する方法に関係しています。
簡潔にまとめると... 32 ビット プロテクト モードの x86 では、16 ビット コードの古い「セグメント レジスタ」にはまだ何らかの意味があります。セグメント レジスタは、GDT のどのエントリが使用されるかを決定します。GDT エントリは基本的にメモリ範囲です。カーネルcs
が [x, y] の範囲内のアドレスのみを持つ GDT エントリで (コード セグメント) レジスタをポイントする場合、その範囲外のアドレスは実行できません。
NX ビットはページ テーブルエントリに入るため、これは NX ビットよりもはるかに粗粒度であることに注意してください。したがって、NX ビットを使用すると、任意のページを実行不可としてマークできますが、cs
セグメントを使用すると、(通常は大きく連続した) 範囲のみを実行不可として指定できます。