一般に、プロセスは、書き込みを許可しない保護を備えたメモリ(アドレス空間内)に書き込むことができないことを知っています。しかし、プロセスがこれを実行できるかどうかをチェックするものは何ですか?アセンブリ命令はオペレーティングシステムを通過しますか?それはどのように機能しますか?
3 に答える
最新のCPU(Intel x86、ほとんどのARMフレーバー)では、チェックを行うのはCPU自体です。CPUは、レジスタの1つに、メモリのレイアウト(「ページテーブル」)を指定するデータ構造のアドレス(具体的には、読み取り可能、書き込み可能、実行可能)を格納します。CPUのすべてのメモリアクセス操作は、ページテーブルに対してチェックされます。
プログラムがそれぞれのページテーブルエントリで許可されていないメモリ位置に対して何かを行おうとすると、CPUが例外(割り込み)を生成し、OSが制御を取得します。それ以降のアクションはOSによって異なります。一般的なシナリオの1つは、OSがエラーメッセージを表示し、障害のあるプログラムを終了することです。ただし、必ずしもそうとは限りません。たとえば、ページスワッピング(ディスク上のページファイルへのメモリの書き込みと必要な場合の読み取り)は、同じメカニズムを介して実装されます。
ページテーブルはOSによって維持され、ユーザーランドコードには(通常)表示されません。OSの関連部分は、ハードウェアに依存します。
ページテーブルには、現在実行中のプロセスのメモリスペースに関するすべての情報が含まれています。書き込みによって読み取り専用のメモリにアクセスしようとした場合、または自分に属していないメモリにアクセスしようとすると、プロセッサはマッピングを見つけることができず(または書き込みできないことがわかります)、OSにページフォールトを発行します。 。次に、OSは、それがコピーオンライトページであるか、アクセスしたページが自分のものであるがまだマップされていないか、または不良スペースにアクセスしてそれに応じて処理するかどうかを判断します(通常はセグメンテーション違反でプロセスを強制終了します)悪いスペースにアクセスした場合)。
When this is supported in hardware, typically there is a bit in the information describing a block of allocated memory that indicates whether the block of memory may be executed.
On Intel processors this is called the NX (Never Execute) bit, while AMD calls that the XD (Execution Disabled) bit.
The NX bit specifically refers to bit number 63 (i.e. the most significant bit) of a 64-bit entry in the page table. If this bit is set to 0, then code can be executed from that page; if set to 1, code cannot be executed from that page, and anything residing there is assumed to be data.
http://en.wikipedia.org/wiki/NX_bit
The bit is set by the operating system after it loads executable code into memory. It may only be set by privileged code (e.g. the OS, or drivers).
See also: