NXビット(実行禁止ビット)は、プロセッサの機能の一つで、仮想アドレス空間(プログラムが使用するメモリレイアウト)の領域を、データやプログラム命令を格納するためのセクションに分割します。NXビットをサポートするオペレーティングシステムは、仮想アドレス空間の特定の領域を実行不可としてマークすることができ、プロセッサがそこに格納されたコードを実行できないようにします。この手法は、実行可能領域保護、または書き込みXOR実行と呼ばれ、バッファオーバーフロー攻撃のように、悪意のあるソフトウェアが他のプログラムのデータ格納領域に有害なコードを挿入して実行しようとするのを防ぎます。
「NXビット」という用語は、Advanced Micro Devices (AMD) がマーケティング用語として導入したものです。Intelはこの機能をXD ビット(実行無効) として販売していますが、MIPS アーキテクチャではXI ビット(実行禁止)と呼ばれています。ARMv6で導入されたARMアーキテクチャでは、 XN (実行禁止)として知られています。 [ 1 ] NX ビットという用語は、他のプロセッサにおける同様の実行可能領域保護技術を説明するために広く使われることがよくあります。
x86プロセッサは、 80286以降、セグメントレベルで同様の機能を実装していました。しかし、80386以降のx86プロセッサ向けのオペレーティングシステムはほぼすべてフラットメモリモデルを採用しているため、この機能を使用できません。これらのプロセッサのページテーブルエントリ(ページ記述子)には、フラットメモリモデルを使用するオペレーティングシステムでこの機能を利用できるようにするための「実行可能」フラグがありませんでした。AMDがAMD64アーキテクチャでページテーブルエントリに「実行不可」またはNXビットを追加し、セグメント全体ではなくページ単位で実行を制御できるメカニズムを提供するまで、この機能は存在しませんでした。
Intel は2001 年にIA-64アーキテクチャを持つItanium ( Merced ) プロセッサで同様の機能を実装しましたが、より普及している x86 プロセッサ ファミリー ( Pentium、Celeron、Xeonなど) には導入しませんでした。x86 アーキテクチャでは、AMD が最初にNX ビットとして実装し、 Athlon 64やOpteronなどのAMD64プロセッサで使用しました。[ 2 ]
AMD がこの機能を AMD64 命令セットに含めることを決定した後、Intel はPrescott コアの後のバージョンに基づくPentium 4プロセッサから始まる x86 プロセッサで同様の XD ビット機能を実装しました。 [ 3 ] NX ビットは、ページ テーブルの 64 ビット エントリのビット番号 63 (つまり最上位ビット) を具体的に指します。このビットが 0 に設定されている場合、そのページからコードを実行できます。1 に設定されている場合、そのページからコードを実行することはできず、そこにあるものはすべてデータであるとみなされます。これは、ロング モード (64 ビット モード) または従来の物理アドレス拡張(PAE) ページ テーブル フォーマットでのみ使用可能で、x86 の元の 32 ビット ページ テーブル フォーマットでは使用できません。これは、そのフォーマットのページ テーブル エントリには、実行を無効および有効にするために使用される 64 番目のビットがないためです。
Windows XP SP2以降は、データ実行防止(DEP)をサポートしています。
ARMv6では、新しいページ テーブル エントリ フォーマットが導入されました。これには「実行しない」ビットが含まれています。[ 1 ] ARMv8-Aでは、ステージ 1 の変換用の VMSAv8-64 ブロックおよびページ ディスクリプタ、および VMSAv8-32 ロング ディスクリプタ ブロックおよびページ ディスクリプタには、特権モードと非特権モードの両方で「実行しない」ビットがあり、ステージ 2 の変換用のブロックおよびページ ディスクリプタには 1 つの「実行しない」ビットがあります (ARMv8.2-TTS2UXN 機能により 2 ビット)。レベル 1 の VMSAv8-32 ショート ディスクリプタ変換テーブル ディスクリプタには、特権モードと非特権モードの両方で「実行しない」ビットがあり、レベル 2 では 1 つの「実行しない」ビットがあります。[ 4 ]
Alpha Architecture マニュアルの第 4 版の時点では、DEC (現在の HP) Alpha はOpenVMS、Tru64 UNIX、および Alpha Linux PALcodeを使用したページ テーブル エントリに Fault on Execute ビットを持っています。[ 5 ]
サンSPARCバージョン8用のSPARCリファレンスMMUは、ページテーブルエントリに読み取り専用、読み取り/書き込み、読み取り/実行、および読み取り/書き込み/実行のパーミッション値を持っていますが[ 6 ]、すべてのSPARCプロセッサがSPARCリファレンスMMUを持っているわけではありません。
SPARC バージョン 9 MMU は、読み取り/書き込み/実行権限の任意の組み合わせを提供することができますが、提供する必要はありません。[ 7 ] Oracle SPARC Architecture 2011、ドラフト D1.0.0 の翻訳ストレージバッファ内の翻訳テーブルエントリには、実行可能ビットと書き込み可能ビットが別々にあります。[ 8 ]
IBM PowerPCのハッシュ ページ テーブルのページ テーブル エントリには、実行不可ページ ビットがあります。[ 9 ] Power ISA の基数ツリー ページ テーブルのページ テーブル エントリには、読み取り/書き込みと実行アクセスを許可する個別のパーミッション ビットがあります。[ 10 ]
PA-RISC 1.1 および PA-RISC 2.0 の翻訳ルックアサイドバッファ(TLB) エントリとページテーブルエントリは、読み取り専用、読み書き可能、読み実行可能、および読み書き実行可能なページをサポートしています。[ 11 ] [ 12 ]
Itaniumの TLB エントリは、読み取り専用、読み書き可能、読み書き実行可能、および読み書き実行可能ページをサポートしています。[ 13 ]
z/Architecture Principles of Operationの第 12 版以降、z/Architecture プロセッサは命令実行保護機能をサポートする可能性があります。この機能は、ページ テーブル エントリにビットを追加し、特定の領域、セグメント、またはページからの命令を実行できるかどうかを制御します。[ 14 ]
[仮想メモリシステムアーキテクチャ]では、APXおよびXN(実行不可)ビットが追加されました。