コンピューティングにおいて、物理アドレス拡張( PAE ) は、ページアドレス拡張とも呼ばれ、[ 1 ] x86 アーキテクチャのメモリ管理機能です。PAE は、最初に Intel がPentium Proで導入し、後に AMD がAthlonプロセッサで導入しました。[ 2 ]これは、ページ テーブル階層を 3 レベル (2 レベルではなく) で定義し、テーブル エントリをそれぞれ 32 ビットではなく 64 ビットにすることで、これらの CPU が 4ギガバイト(2 32バイト)を超える物理アドレス空間に直接アクセスできるようにします。
x86-64 CPUがロングモードで動作する際に使用するページテーブル構造は、ページテーブル階層を4レベル以上に拡張して仮想アドレス空間を拡張し、ページテーブルのすべてのレベルで追加の物理アドレスビットを使用して物理アドレス空間を拡張します。また、64ビットページテーブルエントリの最上位ビットを実行不可ビット(「NX」ビット)として使用し、関連付けられたページからコードを実行できないことを示します。NX機能は、これらのCPUが32ビットオペレーティングシステムを実行している場合、オペレーティングシステムがPAEを有効にしていれば、プロテクトモードでも利用できます。
PAEは1995年にIntel Pentium Proで初めて実装されましたが[ 3 ] 、付属のチップセットは通常、必要な追加のアドレスビットをサポートしていませんでした[ 4 ] 。
PAEは、Pentium Pro、Pentium II、Pentium III、およびPentium 4プロセッサでサポートされています。 2003年に導入された最初のPentium Mファミリープロセッサ(「Bania」)もPAEをサポートしていますが、 CPUID情報にPAEサポートフラグは表示されません。[ 5 ]これは、2005年の「Dothan」コアの後の改訂で修正されました。AMD Athlon [ 2 ] [ 6 ](ただし、チップセットは32ビットアドレッシングに制限されています[ 7 ])やそれ以降のAMDプロセッサモデルを含むAMDプロセッサでも利用可能でした。
AMDは、業界標準のx86アーキテクチャの64ビット拡張であるAMD64またはx86-64を定義した際に、 PAEに基づく「ロングモード」のページングシステムも強化しました。 [ 8 ] : 139 64ビット仮想アドレスをサポートしています[ 8 ] : 24(2023年7月現在) 、48ビットは一部のプロセッサで実装され、57ビットは他のプロセッサで実装されています[8]:139、141–143 [ 9 ])、52ビットの物理アドレス[ 8 ] : 24 、およびNXビット機能が含まれています。x86-64プロセッサが初期化されるとき、プロセッサをレガシーモードからロングモードに切り替える前にPAE機能を有効にする必要があります。[ 8 ] : 139
PAEでは、 x86アーキテクチャのページテーブルエントリが32ビットから64ビットに拡張されます。これにより、ページテーブルエントリ内の物理ページアドレス、つまり「ページフレーム番号」フィールドにより多くの領域が確保されます。PAEの初期実装では、ページフレーム番号フィールドは20ビットから24ビットに拡張されました。変換されるアドレスからの「バイトオフセット」のサイズは依然として12ビットであるため、物理アドレスの合計サイズは32 ビットから36 ビット(つまり20+12から24+12)に増加します。これにより、CPUが理論的にアドレス指定できる物理メモリが4GBから 64GBに増加しました 。
PAEをサポートする最初のプロセッサでは、パッケージのピン配置に、より大きな物理アドレスのサポートが明確に示されており、アドレスピンの指定はA31で止まるのではなく、A35まで伸びています。[ 10 ]後期のプロセッサファミリでは、専用のメモリ アドレス信号を持たないHypertransportやQuickPath Interconnectなどの相互接続を使用しているため、この関係はあまり明確ではありません。
仮想アドレスの32ビットサイズは変更されないため、通常のアプリケーションソフトウェアは引き続き32ビットアドレスを持つ命令を使用し、(フラットメモリモデル では)仮想アドレス空間は4ギガバイトに制限されます。このモードをサポートするオペレーティングシステムは、ページテーブルを使用して通常の4GB の仮想アドレス空間を物理メモリにマッピングします。物理メモリは、オペレーティングシステムとその他のハードウェアプラットフォームによっては、最大64GBになる場合があります 。マッピングは通常、各プロセスごとに個別に適用されるため、単一のプロセスが同時にすべてのRAMにアクセスできなくても、追加のRAMは有効に機能します。
その後、AMDによるx86-64アーキテクチャの開発に関連する研究により、物理アドレスの理論上の最大サイズは52ビットに拡張された。[ 8 ]: 24

ページングが有効になっている保護モード(制御レジスタのビット 31がセットされている)で、PAE がない場合、 x86プロセッサは 2 レベルのページ変換方式を使用します。制御レジスタには、単一の 4 KB 長のページ ディレクトリのページ境界に揃った物理アドレスが格納されます。これは 1024 個の 4 バイトのページ ディレクトリ エントリに分割され、有効な場合は、それぞれ 4 KB サイズのページ テーブルのページ境界に揃った物理アドレスが格納されます。これらも同様に 1024 個の 4 バイトのページ テーブル エントリで構成され、有効な場合は、物理メモリ (RAM) の 4 KB 長のページのページ境界に揃った物理アドレスが格納されます。PGCR0CR3

ページ ディレクトリのエントリには 、ビット 7にPS(ページ サイズ用) という名前の追加フラグがあります。システムがこのビットを に設定している場合、ページ ディレクトリのエントリはページ テーブルではなく、単一の大きな 4 MB ページ (ページ サイズ拡張)1を指します。

PAEを有効にする(システムレジスタのビット 5を設定する)と、このスキームに大きな変更が生じます。デフォルトでは、各ページのサイズは4KBのままです。ページテーブルとページディレクトリの各エントリは、追加のアドレスビットを収容するために、32ビットではなく64ビット(8バイト)長になります。ただし、各テーブルのサイズは変更されないため、テーブルとディレクトリの両方に512エントリしかありません。これにより、元のスキームのエントリの半分しか使用できなくなるため、階層が1レベル追加され、システムレジスタは物理的にページディレクトリポインタテーブルを指すようになります。これは、ページディレクトリへの4つのポインタを含む短いテーブルです。PAECR4 CR3
ページテーブルで64 ビット アドレスをサポートすることは、プロセッサのアドレス指定に 2 つの変更を可能にするため、重要な変更です。まず、ページ テーブルとディレクトリにアクセスするために物理アドレスを使用するページ テーブル ウォーカーは、PAE のないシステムでサポートされている 32 ビット物理アドレスよりも大きい物理アドレスにアクセスできるようになりました。これによりCR3、ページ テーブル ウォーカーは 32 ビット範囲を超えるページ ディレクトリとテーブルにアクセスできるようになります。次に、アクセスされるデータ (ページ テーブルに格納されている) の物理アドレスは、PAE のないシステムでサポートされている 32 ビット アドレスよりも大きい物理アドレスとして表現できます。これもまた、データ アクセスが 32 ビット範囲を超える物理メモリ領域にアクセスできるようにします。[ 11 ]

ページ ディレクトリのエントリには 、ビット 7にPS(ページ サイズ用) という名前の追加フラグがあります。システムがこのビットを に設定している場合、ページ ディレクトリのエントリはページ テーブルではなく、単一の大きな 2 MB ページ (ページ サイズ拡張)1を指します。
IA-32およびx86-64でサポートされているすべてのページテーブル形式では、ページテーブルエントリの最下位12ビットは、メモリ管理ユニットによって解釈されるか、オペレーティングシステム用に予約されています。実行禁止または実行無効化機能を実装しているプロセッサでは、最上位ビット(ビット 63)がNXビットです。次の11ビット(ビット52~62)は、IntelとAMDのアーキテクチャ仕様の両方でオペレーティングシステム用に予約されています。したがって、ページテーブルエントリの64ビットのうち、下位12ビットと上位12ビットは他の用途に使用され、物理ページ番号用に40ビット(ビット12~51)が残ります。線形アドレスからの「ページ内オフセット」12ビットと組み合わせると、物理 メモリのアドレス指定に使用できる最大ビット数は52ビットになります。これにより、最大252 バイト、つまり4 ペタバイト(約4.5× 10¹⁵バイト)のRAM構成が可能になります。
ネイティブロングモードのx86-64プロセッサでは、アドレス変換方式はPAEを使用しますが、4番目のテーブルである512エントリのページマップレベル4テーブルを追加し、ページディレクトリポインタテーブルを、保護モードの元の4エントリではなく512エントリに拡張します。これは、48ビットの仮想ページ番号が変換され、最大256 TBの仮想アドレス空間が得られることを意味します。一部のプロセッサでは、5番目のテーブルである512エントリのページマップレベル5テーブルを使用してモードを有効にすることができます。これは、57ビットの仮想ページ番号が変換され、最大128 PBの仮想アドレス空間が得られることを意味します。[ 8 ]: 141~153 ページテーブルエントリでは、元の仕様では、40ビットの物理ページ番号が実装されています。
CPUIDソフトウェアはフラグによって、CPUがPAEモードをサポートしているかどうかを識別できますPAE。Microsoft Windows用の無料プログラムがあり、PAEサポートを含む多くのプロセッサ機能を一覧表示します。[ 12 ] Linuxでは、などのコマンドでフラグが存在する場合にcat /proc/cpuinfo一覧表示できます[ 13 ] 。また、SYSLINUXハードウェア検出ツールなどの他のツールもあります。pae
プロセッサをPAEモードで動作させるには、オペレーティングシステムのサポートが必要です。PAEを使用して4GBを超える RAMにアクセスするには、オペレーティングシステム、チップセット、およびマザーボードでさらにサポートが必要です。一部のチップセットは4GB (16進数でFFFFFFFF)を超える物理メモリアドレスをサポートしておらず、一部のマザーボードには4GBを超えるRAMを搭載できるだけのRAMソケットがありません 。しかし、4GBを超えるRAMが利用できない場合でも、PAE対応CPUはPAEモードで動作させることができ、たとえば実行不可 機能を使用できます。
Microsoft Windowsの 32 ビット版は、適切なオプションで起動すれば PAE をサポートします。Microsoft のテクニカル フェローであるMark Russinovich氏によると、一部のドライバーは 4 GB を超える物理アドレスに遭遇すると不安定になることが判明しました 。[ 14 ]
以下の表は、Microsoft Windowsの32ビット版におけるメモリ制限を示しています。
Windows XP および Windows XP SP1 の初期リリースでは、PAE モードを使用して RAM を 4 GB アドレス制限を超えて拡張できるようにしていました。しかし、サードパーティ ドライバーとの互換性の問題が発生したため、Microsoft は Windows XP Service Pack 2 でこの機能を削除しました。Windows XP SP2 以降では、デフォルトで、実行不可 (NX)または実行無効 (XD)機能を備えたプロセッサで、NX を有効にするために PAE モードで実行されます。[ 18 ] NX ビットは ページ テーブル エントリのビット 63 にあり、PAE がない場合、32 ビット システムのページ テーブル エントリは 32 ビットしかありません。したがって、NX 機能を利用するには PAE モードが必要です。ただし、32 ビット Windows (Windows XP SP2 以降、Windows Vista、Windows 7) の「クライアント」バージョンでは、NXサポートが有効になっている場合は PAE モードで実行されるにもかかわらず、 ドライバーの互換性のために物理アドレス空間が最初の 4 GBに制限されています。 [ 14 ]
Windows 8以降のリリースは、 NXとSSE2に加えてPAEをサポートするプロセッサでのみ動作します。[ 19 ] [ 20 ]
Mac OS X TigerからMac OS X Snow Leopardまでは、IA-32 プロセッサでPAE とNX ビットをサポートしています。Snow Leopard は IA-32 プロセッサをサポートする最後のバージョンでした。x86-64 プロセッサでは、 macOSのすべてのバージョンで、 4 GB を超えるメモリをアドレス指定するために 4 レベル ページング (PAE ではなく IA-32e ページング) を使用します 。Mac ProおよびXserveシステムでは、最大 64 GB の RAM を使用できます。[ 21 ]
Linuxカーネルは、1999年のバージョン2.3.23以降、完全なPAEモードサポートを搭載しており、 32ビットマシンで最大64GBのメモリへのアクセスが可能になっています。 [ 22 ] PAE対応Linuxカーネルを使用するには、CPUもPAEをサポートしている必要があります。LinuxカーネルはビルドオプションとしてPAEをサポートしており、主要なディストリビューションでは、PAEカーネルがデフォルトまたはオプションとして提供されています。
NXビット機能には、PAEサポート付きでビルドされたカーネルが必要です。[ 23 ]
Linuxディストリビューションでは現在、PAE対応カーネルがデフォルトとして一般的に使用されており、この傾向は2009年に始まった。[ 24 ] 2012年現在Ubuntu (およびXubuntuやLinux Mintなどの派生版) [ 25 ] [ 5 ] Red Hat Enterprise Linux 6.0 [ 26 ]やCentOSなど、多くのディストリビューションが PAE 非対応カーネルの配布を停止したため、PAE 対応ハードウェアが必須となった。PAE を必要とする Linux ディストリビューションは、Pentium Mファミリーのプロセッサでは、CPUID 情報に PAE サポートフラグが表示されないため (内部的にはサポートされているにもかかわらず)、起動を拒否する可能性がある。[ 5 ]ただし、これはオプションで簡単に回避できるforcepae。[ 27 ]
非PAEオプションを提供するディストリビューションDebian(およびLMDE 2(Linux Mint Debian Edition)[ 28 ]などの派生版)、Slackware、LXLEなどを含むディストリビューションは、通常「i386」、「i486」、または「retro」ラベルを使用してこれを行います。[ 29 ] [ 30 ]軽量Linuxディストリビューションの記事には、古いコンピュータにLinuxをインストールできる他のディストリビューションもいくつかリストされています。
FreeBSDとNetBSDもカーネルビルドオプションとして PAE をサポートしています。FreeBSDは4.x シリーズ (4.9 以降)、5.x シリーズ (5.1 以降)、および 6.x 以降のすべてのリリースで PAE をサポートしています。サポートにはカーネルPAE構成オプションが必要です。ロード可能なカーネルモジュールは、 PAE が有効になっている状態でビルドされたモジュールのみ、PAE が有効になっているカーネルにロードできます。FreeBSD ディストリビューションのバイナリモジュールは PAE が有効になっていないため、PAE カーネルにロードできません。すべてのドライバが 4 GB を超える物理メモリをサポートしているわけではありません。そのようなドライバは、PAE が有効になっているシステムでは正しく動作しません。[ 31 ]
OpenBSD は、標準の GENERIC i386 カーネルで 2006 年以来 PAE をサポートしています。GeNUA mbH が初期実装をサポートしました。[ 32 ]リリース 5.0 以降、PAE には一連の変更があり、特に PMAP の i386 MMU 処理に変更がありました。pmap(9) を参照してください。[ 33 ]
SolarisはSolarisバージョン7以降PAEをサポートしています。ただし、バージョン7で使用されるサードパーティ製ドライバでPAEサポートが明示的に含まれていないものは、PAE搭載システムでは不安定に動作したり、完全に失敗したりする可能性があります。[ 34 ]
HaikuはR1 Alpha 2のリリース後、PAEの初期サポートを追加しました。R1 Alpha 3のリリースにより、PAEは正式にサポートされるようになりました。
(ページ アドレス拡張) が有効になっている場合、または PDE が大きなページを記述していない場合は、ページ テーブル エントリの PCD ビットと PWT ビットで構成される 2 ビットのインデックスを使用して、4 つの PAT レジスタ フィールドのいずれかを選択します。
最大4GBのメモリをサポート。
[35:03]# (I/O): A[35:3]# (アドレス) 信号は、2 から 36 バイトの物理メモリ アドレス空間を定義します。
プロセッサがサポートしており、カーネルがPAEサポート付きでコンパイルされている場合、実行無効化保護も有効になります。残念ながら、それ以外の場合はこの機能は利用できません。
非対応カーネルは、今後の Xubuntu リリースでは利用できなくなります。
非 PAE プロセッサとの互換性を保証するため、Linux Mint Debian の 32 ビット版にはデフォルトで 486 カーネルが付属しています。