x86 メモリ構成

最終更新: 2024-07-08 12:41:37 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

x86 のメモリ構成は、レジスタ幅、アドレスバス幅、保護機構、マルチタスクに関する制約が段階的に変化した結果として発展してきた。物理メモリは依然としてバイトアドレス空間であり、変換後、プロセッサはメモリインターフェイス上に物理アドレスを出力する。ただし、そのアドレスに到達する経路は大きく変化している。

x86 命令は最初に 実効アドレス(EA)を計算する。これはオフセットとも呼ばれる。使用可能なセグメンテーションを備えたモードでは、選択されたセグメントがベースを提供し、リニアアドレスが生成される。ページングが有効な場合、ページテーブルがリニアアドレスを物理アドレスへ変換する。したがって、段階は次のようになる。

instruction+-->effectiveaddress+-->segmentation+--p>h|yspiacgailngad|dress|

リアルアドレスモードにはページングがないため、セグメント演算によって物理アドレスが直接生成される。現代の 64 ビットシステムも同じ概念的な順序を維持しているが、ロングモードではアドレス生成における通常のセグメンテーションが無効になり、ページングが必須となる。

物理アドレスによるプログラミング #

Intel 8080 や 8085 などの初期プロセッサは、物理アドレス空間を命令から直接公開していた。命令長は最大 3 バイトであり、オペコードが 1 バイトを占めるため、即値オペランドに使えるのは最大 2 バイトだった。これらのプロセッサには 16 本のアドレス線があるため、2 バイトの即値で任意の物理アドレスを表現できる。

アセンブリでは、メモリ位置を 2 通りの方法で参照できる。

  1. 既知のアドレスを命令にエンコードする。 アセンブラはラベルを対象のアドレスに解決するか、プログラマが数値アドレスを指定する。たとえば、SHLD 0x0055 は HL レジスタペアを物理アドレス 0x0055 に格納し、JMP foo は foo に割り当てられたアドレスへ制御を移す。ラベルによってソースコードは保守しやすくなるが、生成された命令には依然として固定アドレスが含まれる。
  2. レジスタに保持されたアドレスをデリファレンスする。 8080 と 8085 の汎用レジスタは 8 ビットだが、アドレスは 16 ビットである。そのため、レジスタペア BC、DE、HL がアドレスを保持する。STAX B と STAX D はそれぞれ BC と DE 経由で A を格納し、MOV M,A は HL 経由で格納する。

直接的なモデルは単純だが、固定アドレスによってコードがロード位置に束縛される。再配置には埋め込まれたすべてのアドレスの変更が必要であり、独立してロードされるプログラムは物理アドレス範囲を調整しなければならない。

8086/8088: セグメンテーション v1 とその理由 #

8086 と 8088 は 20 本のアドレスピンを持ち、1 MiB をアドレス指定できるが、汎用レジスタとセグメントレジスタの幅は 16 ビットである。仮想メモリもページングも存在しない。メモリ参照は依然として物理メモリに到達するが、命令エンコーディングでは 20 ビット物理アドレスを通常のアドレス指定形式として扱わなくなった。

20 ビット即値をエンコードすると 3 バイト全体を消費し、4 ビットが無駄になる。また、固定ロードアドレスという柔軟性のなさも残る。アドレスをレジスタにロードすれば動的に計算された位置を表現できるため、専用の 20 ビット即値形式は、新しいユースケースを提供しないままハードウェアとエンコーディングを複雑にするだけだった。後続の x86 命令には直接的な オフセット 形式(moffs)を保持するものもあるが、これは依然としてセグメント付きで解釈され、セグメントなしの物理アドレスオペランドではない。

セグメンテーション v1 #

8086 の解決策は、16 ビットのセグメント値と 16 ビットのオフセットを組み合わせることだった。

  1. セグメントレジスタは CS、SS、DS、ES の 4 つ存在する。
  2. すべてのメモリ参照にはデフォルトセグメントがある。命令フェッチは CS、通常のデータ参照は DS、実効アドレスが BP を使用する参照とスタック操作は SS を使用する。文字列命令は規定されたソースセグメントとデスティネーションセグメントを使用する。多くの参照では、セグメントオーバーライドプレフィックスによって別の許可されたセグメントを選択できる。
  3. 命令は、オプションのベースレジスタ(BX または BP)、オプションのインデックスレジスタ(SI または DI)、オプションのディスプレースメントからオフセットを計算する。合法な 16 ビットアドレス指定の組み合わせはエンコーディングによって制約されるが、結果の演算は base + index + displacement である。エンコードされたコンポーネントのうち少なくとも 1 つがメモリオペランドを識別する。整数命令は通常、明示的なメモリオペランドを最大 1 つしかエンコードしない。文字列命令は、暗黙のソースアクセスとデスティネーションアクセスを含む重要な例外である。

たとえば、MOV AX, [4] はデフォルトの DS セグメントを使用する。アセンブラは MOV AX, CS:[4] のようなオーバーライドをエンコードできる。一般的な moffs エンコーディングでは、後者に追加の 0x2E プレフィックスが付く。アセンブラの表記は異なるが、プレフィックスのアーキテクチャ上の意味は同じである。

実行ユニットが EA を計算する。その後、バスインターフェイスユニットが選択されたセグメント値を 4 ビット左シフトし、EA を加算する。

text
segment     4 5 0 0
offset        F C 3 2
-------------------
sum         5 4 C 3 2

physical address = (segment << 4) + effective address
seefgfmeecnttivreegoifsftseertshiftleft4segmentbaadsdephysicaladdress

8086 が公開するアドレスビットは 20 ビットだけである。加算によってビット 19 を超えるキャリーが発生すると、バスアドレスは 1 MiB を法としてラップアラウンドする。そのため、元の 8086 では、よく知られた FFFF:FFFF の計算によって 1 MiB を超える一意のアドレスへ到達できるわけではない。したがって、[BX] や [40] と記述された参照は、オフセットが絶対アドレスのように見える場合でも、セグメント演算を回避しない。リアルモードの説明でいう「実物理アドレス指定」とは、ページングが最終アドレスを仮想化しないことを意味し、命令がセグメントなしで任意の物理アドレスをエンコードすることを意味しない。

セグメント値はパラグラフ番号である。4,096 個のベースを提供し、それぞれが 16 バイト間隔に配置され、各オフセットは 64 KiB のウィンドウをカバーできる。セグメントは隣接、分離、部分的な重複、または同一となり得る。したがって、1 つの物理位置に複数の segment:offset 表現が存在し得る。

結論: 8086/8088 のメモリセグメンテーション #

セグメンテーションは主に、アドレスバスより狭いレジスタを補うためのものだった。暗黙のセグメントによってオフセットだけをエンコードすればよくなるため、多くの命令も短縮された。Intel はセグメント値を 4 ビットではなく 8 ビット左シフトする案を検討した。この場合、24 ビットのアドレス空間と 256 バイトのセグメントアラインメントが生じる。4 ビットシフトは 1 MiB という設計目標を維持しながら、より細かい配置粒度を保った。

この構成は、ポインタが単一のフラットな数値ではないため、ソフトウェアを複雑にする。汎用レジスタがアドレス空間の幅に達すると、このコストを正当化することは難しくなったが、互換性要件によってセグメンテーションはアーキテクチャに残された。

80286: セグメンテーション v2 #

80286 は 16 ビットの汎用レジスタを維持しながら、物理アドレスバスを 24 ビットに拡張し、最大 16 MiB をサポートした。リアルアドレスモードとプロテクトモードを導入し、リセット時にはリアルアドレスモードで開始する。

80286 の MSW.PE ビットがプロテクトモードを有効にする。後続の x86 プロセッサとは異なり、80286 はこのビットをクリアするだけではプロテクトモードからリアルアドレスモードに戻れない。ソフトウェアは慣例的にプロセッサをリセットして復帰する。この制約は初期のオペレーティングシステムに影響するが、どちらのモードでもアドレス変換規則は変わらない。

リアルアドレスモード #

リアルアドレスモードは、8086 互換の segment:offset アドレス指定を維持する。セグメントレジスタには 16 ビットのセグメント値が入り、プロセッサはセグメントを 4 ビット左シフトして 16 ビットオフセットを加えることでアドレスを生成する。元の 8086 パッケージとは異なり、80286 はアドレス線 A20 を公開する。A20 が有効な場合、FFFF:FFFF 付近の参照は 1 MiB を超えるハイメモリ領域に到達できる。互換性ハードウェアは A20 をマスクして 20 ビットのラップアラウンドを再現できる。そのため、8086 向けに書かれたプログラムは、他のハードウェア前提が満たされる限り、ソースコードを変更せずに実行できる。

80286 はリアルアドレスモードで利用できる新しい命令も追加した。これらの命令は、リアルアドレスセグメンテーションをプロテクトセグメンテーションに変えたり、ページングを追加したりするものではない。

プロテクト仮想アドレスモード #

80286 のプロテクトモードは、保護された可変サイズのセグメントを追加するが、ページテーブルによる仮想メモリはまだ実装していない。したがって、「プロテクト仮想アドレスモード」はプロテクトセグメンテーションを意味し、80386 以降のプロセッサに関連するデマンドページング型の仮想メモリモデルを意味しない。

メモリ上の 2 つのディスクリプタテーブルがセグメントを定義する。

  • グローバルディスクリプタテーブル(GDT)はシステム全体で共有される。
  • ローカルディスクリプタテーブル(LDT)はタスクに関連付けられたセグメントを記述できる。

各セグメントレジスタの可視部分は、シフトされたベースではなく、16 ビットの セレクタ になった。その形式は次のとおりである。

15index(13bits)|TI(1)|2RPL(2bits)0
  • index は 8 バイトのディスクリプタを選択する。
  • TI がクリアされている場合は GDT、セットされている場合は現在の LDT を選択する。
  • RPL は要求元特権レベルであり、保護チェックに参加する。

セレクタをロードすると、その妥当性が検証され、選択されたディスクリプタがセグメントレジスタに関連付けられた、アーキテクチャ上は不可視のディスクリプタキャッシュにロードされる。キャッシュには、後続の参照に必要なベース、リミット、アクセス権が含まれる。セグメントレジスタを読み取ってもセレクタだけが見え、ソフトウェアはキャッシュされたフィールドを直接読み書きできない。キャッシュにより、すべてのメモリ参照でディスクリプタテーブルへアクセスする必要がなくなる。

グローバルディスクリプタテーブル(GDT) #

GDTR は GDT の位置を示す。80286 では、24 ビットの物理ベースと 16 ビットのリミットを含む。

39GDTbase(24bits)1615limit(16bit0s)

リミットはテーブルサイズから 1 を引いた値(バイト単位)であり、エンコード可能な最大サイズは 65,536 バイトとなる。各ディスクリプタは 8 バイトなので、完全なテーブルはディスクリプタ境界で終了する。特権命令 LGDT と SGDT がこのレジスタをロードおよび格納し、通常のデータ命令から GDTR をアドレス指定することはできない。

GDT はディスクリプタの配列である。S = 1 のディスクリプタはコードまたはデータセグメントディスクリプタである。S = 0 のディスクリプタは、LDT やタスク状態ディスクリプタなどのシステムディスクリプタである。80286 のセグメントディスクリプタは、24 ビットのベース、バイト粒度の 16 ビットリミット、アクセスバイトを格納する。

bytrees7ervedbytrees6ervedbytaecc5essbytbeas4e23..16bytbeasse3.1.50..0,limit|

図は最後の 4 バイトグループ内のバイト順ではなく、フィールド配置を要約している。ディスクリプタの下位 16 ビットがリミットであり、その後にベースのビット 15 から 0 が続く。セグメントは、任意の 24 ビットベースと可変リミットを持つ連続範囲となり、16 バイトのシフトは使用しない。80286 にはページ変換がないため、ディスクリプタのベースは物理メモリを識別する。

GDT のエントリ 0 はすべてゼロのヌルディスクリプタでなければならない。TI が GDT を選択しているとき、セレクタインデックス 0 を無効にする。

ローカルディスクリプタテーブル(LDT) #

LDT は GDT と同じディスクリプタレイアウトを持つが、最初のエントリを有効にできる。複数の LDT がメモリ上に存在できる一方、マシンが一度に使用する GDT は 1 つである。LDTR の可視セレクタは、GDT 内の S = 0 の LDT ディスクリプタを識別し、その不可視キャッシュが LDT のベースとリミットを提供する。LLDT と SLDT が可視の LDTR セレクタをロードおよび格納する。

80286 のハードウェアタスク機構は、タスク切り替え時に LDTR を再ロードできるため、LDT をタスク固有にできる。オペレーティングシステムは、ソフトウェアによるコンテキストスイッチのほうが柔軟かつ移植性に優れるため、ハードウェアタスク切り替えを一般に回避する。IA-32e モードではハードウェアタスク切り替えは利用できないが、タスク状態セグメントは特権スタックや割り込みスタックの管理など、別の目的で使用される。

セグメントレジスタ #

任意の時点で、セレクタは GDT と LDTR が選択した LDT を参照できる。CS、SS、DS、ES はそれぞれ、アーキテクチャ上可視の 16 ビットセレクタと、アクセス不能なディスクリプタキャッシュから構成される。MOV、POP、LDS、遠隔制御転送、その他の該当命令によっていずれかをロードすると、プロセッサは次のいずれかから選択する。

v1i5ssieblleecttoorsoftware0inbvaissei,blleimciatc,heaccessrights|

キャッシュは、ソフトウェアから見える別のレジスタレイアウトではない。この図は、セレクタのロードに成功した後にプロセッサが保持する値を示している。後続のメモリ参照はディスクリプタテーブルを再読み込みせず、これらのキャッシュ値を使用する。

  • TI が 0 の場合は GDT。
  • TI が 1 の場合は現在の LDT。

その後、プロセッサはディスクリプタキャッシュにディスクリプタを格納する前に、型、存在、リミット、特権規則をチェックする。遠隔 JMP、CALL、リターン、割り込み、ゲートは CS をロードできるが、通常の MOV はできない。

インデックス 0 かつ TI = 0 のセレクタは ヌルセレクタ である。ヌルセレクタを CS または SS にロードするとフォルトが発生する。DS と ES にはヌルセレクタを保持できるが、そのレジスタをメモリ参照に使用するとフォルトが発生する。後続のプロセッサは、FS と GS にも同じ有用な無効データセグメント規則を適用する。

結論: ページングを伴わない 80286 セグメンテーション #

80286 は、ディスクリプタベースの保護、特権チェック、可変セグメントサイズを追加した。また、割り込みディスクリプタテーブルと IDTR も備えるが、割り込みディスパッチは通常のデータアドレス経路を変更しない。ページテーブル段階が存在しないため、プロテクトモードのメモリは依然としてセグメント化された物理メモリである。

80386 以降: セグメンテーションと仮想ページング #

80386 は 32 ビット汎用レジスタ、32 ビットセグメントベース、ページテーブルによる仮想メモリを導入した。このモデルは、後続プロセッサ上の 32 ビットプロテクトモードソフトウェアにも適用される。関連する実行モードは 3 つある。

  1. リアルアドレスモードは 8086 互換のままである。
  2. プロテクトモードは 80286 のプロテクトセグメンテーションを拡張し、ページングを有効にできる。
  3. 仮想 8086 モードは、リアルモード形式のプログラムをプロテクトモードタスクとして実行する。ページングと保護は周囲のプロテクトモード環境に属するため、仮想 8086 タスクは他プロセスのマッピングを回避できない。

プロテクトモードの刷新 #

32 ビットプロテクトモードでは、元の 80386 の汎用レジスタ、オフセット、リニアアドレス空間、セグメントベース、物理アドレスバスはすべて 32 ビット幅である。ディスクリプタエントリはベースフィールドを 32 ビットに拡張し、粒度やデフォルトのオペランド/アドレスサイズなどのフラグを追加する。80286 で予約されていたディスクリプタ上位バイトは、これらの意味を持つようになった。

セグメンテーションは、ゼロ以外のベース、リミット、拡張下方向データセグメント、特権チェックを含め、完全に機能し続ける。しかし、32 ビットオペレーティングシステムはコードセグメントとデータセグメントのベースを 0、リミットを 4 GiB に設定できる。このような フラットセグメンテーション によって、オフセットはリニアアドレスと等しくなり、ページングでプロセスを分離できる。セグメントセレクタ自体はゼロではない。カーネルは通常、0x08 や 0x10 など、フラットな有効ディスクリプタを指す非ヌルセレクタをロードする。

80386 は SIB(scale-index-base)エンコーディングも追加した。これにより EA の生成は次のように拡張される。

text
effective address = base + index × scale + displacement
scale = 1, 2, 4, or 8

ModR/M バイトとオプションの SIB バイトが、参加するレジスタとディスプレースメントサイズを選択する。スケールは 2、4、8 バイト要素の配列に有用だが、EA の生成だけを変更し、セグメンテーションやページングのモデルは変更しない。

bidanisdseepxlraercgeegm+e-n-t-+-->---s-c-a-l-e------>addeafdfdercetsisve

ページング #

CR0.PG を設定すると、プロテクトモードでページングが有効になる。その後のアドレス生成は 4 段階で行われる。

  1. 命令が、適用される ModR/M、SIB、レジスタ、ディスプレースメントから EA を計算する。
  2. 選択されたセグメントのキャッシュ済みディスクリプタがオフセットを検証し、ベースを提供する。結果は 32 ビットのリニアアドレスとなる。
  3. ページングは、そのリニアアドレスを CR3 の物理アドレスを起点とするテーブルウォークに使用する。
  4. 選択されたページエントリが物理ページフレームベースを提供し、ページオフセットを加えることで物理アドレスが生成される。

プロセッサはセグメント化されたアドレス段階の前またはその間にディスクリプタ権限をチェックし、変換中にページ権限をチェックする。存在しないエントリや禁止されたアクセスはページフォルトを生成する。TLB(Translation Lookaside Buffer)は成功したリニアアドレスから物理アドレスへの変換をキャッシュするため、オペレーティングシステムはアクティブなページテーブルを変更した後、キャッシュされた変換を無効化するか、別の方法で同期しなければならない。

旧来の 32 ビットページング #

元の 80386 方式は 4 KiB ページと 2 段階の階層を使用する。CR3 は現在のアドレス空間のページディレクトリを識別し、システム全体で 1 つのページディレクトリを共有するわけではない。コンテキストスイッチでは別の CR3 をロードでき、オペレーティングシステムは複数のディレクトリ間で選択したカーネルマッピングを共有できる。

ページディレクトリと各ページテーブルは 4 KiB のページを占有する。それぞれは 4 バイトのエントリを 1,024 個含む。

31physicalbaseaddress1211flags0

ページディレクトリエントリ(PDE)はページテーブルを指し、ページテーブルエントリ(PTE)は 4 KiB の物理ページフレームを指す。下位ビットには、present、read/write、user/supervisor、accessed、キャッシュ制御属性など、レベルに応じた関連フラグが格納される。PTE には dirty 状態もあり、PDE はページサイズ拡張が有効な場合に大きなページを直接表現できる。

32 ビットのリニアアドレスは次のように分割される。

31d1i0rebcittosry2221t1a0blbeits1211p1a2gebiotfsfset0

directory が PDE を選択し、table がそのページテーブル内の PTE を選択し、offset が得られた 4 KiB フレーム内のバイトを選択する。CR4.PSE が有効で、ページサイズビットが設定された PDE は、ページテーブル段階を省略して 4 MiB ページを直接マッピングできる。

seloefcftsoertdbeasscer+iopftfosretlaidnderaersspavgieatCaRb3lespahdydsriecsasl
物理アドレス拡張(PAE) #

PAE は 32 ビットのリニアアドレスを維持するが、ページング階層を変更し、64 ビットのページングエントリを使用する。CR4.PAE で有効になる。初期の PAE 実装は物理アドレスを 36 ビットに拡張したが、後続プロセッサのアーキテクチャ上の物理アドレス幅は実装依存である。

PAE ページングでは、CR3 が 4 エントリのページディレクトリポインタテーブル(PDPT)を指す。選択された各ページディレクトリには 512 個のエントリがあり、選択された各ページテーブルにも 512 個のエントリがある。32 ビットのリニアアドレスは次のように分割される。

31P2D3P0T29d9irbeicttsory2120t9abbliets1211p1a2gebiotfsfset0

ページディレクトリポインタが PDPTE を選択し、次の 2 フィールドが PDE と PTE を選択する。ページサイズビットが設定された PAE PDE は 2 MiB ページをマッピングする。PAE は、EFER.NXE が有効な場合の no-execute 権限ビットに必要なエントリ形式も提供する。NXE がない場合、高位ビットは実行ポリシー制御ではなく予約ビットである。

IA-32e とロングモードのページング #

IA-32e モードは 64 ビット対応の実行環境である。64 ビットモードと互換モードを含む。どちらも IA-32e ページングを使用し、これは必須である。IA-32e モードがアクティブな間は CR0.PG をクリアできない。

IA-32e モードに入るには、特権ソフトウェアが有効な PAE 形式のページテーブルを構築し、CR4.PAE を設定し、EFER.LME を設定してから CR0.PG を有効にする。LME が設定された状態でページングを有効にすると、IA-32e モードがアクティブであることを示す読み取り専用の EFER.LMA がラッチされる。L ビットが設定されたコードセグメントへの遠隔制御転送によって 64 ビットモードに入り、L = 0 かつ適切なデフォルトサイズのコードセグメントによって互換モードに入る。ページングを有効にする前に遷移コードがマッピングを確立しなければならない。次の命令フェッチは新しい階層を通じて変換されるためである。

4 レベルページングは、PML4、ページディレクトリポインタテーブル、ページディレクトリ、ページテーブルを使用する。各テーブルには 8 バイトのエントリが 512 個あるため、各インデックスは 9 ビットである。

47P9MLb4its3938P9DPbTits3029d9irbeicttsory2120t9abbliets1211p1a2gebiotfsfse0t

4 レベル実装は 48 ビットの仮想アドレスを使用する。ビット 63 から 48 はビット 47 のコピーでなければならず、これによってアドレスは canonical になる。非 canonical アドレスはページテーブルウォークの前にフォルトする。5 レベルページング(CR4.LA57)を備えたプロセッサは 9 ビットの PML5 インデックスを追加し、57 ビットの仮想アドレスをサポートする。ビット 63 から 57 はビット 56 のコピーでなければならない。物理アドレス幅はプロセッサ依存のままであり、CPUID によって報告される。リニアアドレス幅から推測してはならない。

IA-32e ページテーブルは、PTE レベルで 4 KiB ページ、ページサイズビットが設定された PDE で 2 MiB ページ、プロセッサがサポートを報告している場合は同ビットが設定された PDPTE で 1 GiB ページをマッピングできる。ページエントリには、物理フレームアドレスビット、権限、メモリタイプ、accessed、該当する場合は dirty、global、execute-disable の制御が含まれる。execute-disable ビットは EFER.NXE が有効な場合にのみ機能する。

IA-32e モードのセグメンテーション #

ロングモードは、セグメントセレクタやディスクリプタを削除することなくセグメンテーションを変更する。

  • 64 ビットモードでは、通常のアドレス生成において CS、DS、ES、SS はベース 0 を提供する。通常の参照ではリミットは使用されない。FS と GS は、専用のモデル固有レジスタから供給される有用なベースを保持し、オペレーティングシステムはスレッドローカルデータやプロセッサローカルデータに使用する。FS または GS のベースを加算した後も、canonical アドレスチェックとページングは適用される。
  • 互換モードでは、16 ビットおよび 32 ビットのプロテクトモードアプリケーションは、IA-32e ページングを使用しながらプロテクトモードのセグメンテーションセマンティクスを維持する。
  • IA-32e モードがアクティブな間、仮想 8086 モードとハードウェアタスク切り替えは利用できない。特権遷移と割り込みスタック管理には、依然としてタスク状態セグメントが必要である。

したがって、ロングモードのカーネルは、値 0 のセグメントレジスタをロードするだけでフラットなアドレス空間を得るわけではない。64 ビットモードの規則により通常のベース 0 が得られ、必要な場所では有効なディスクリプタを選択し、アドレス空間の分離と権限について canonical アドレス規則とページングに依存する。

モード間のアドレス変換 #

歴史的な発展によって、現在見られる層が説明できる。

プロセッサとモード実効アドレスとセグメンテーションページング結果
8086/8088 リアルモード16 ビット EA と segment << 4なし20 ビット物理アドレス
80286 リアルモード8086 互換のセグメント演算なしリアルアドレスによる物理アクセス
80286 プロテクトモードセレクタが 24 ビットベースのディスクリプタを解決なし保護されたセグメント物理アクセス
80386 プロテクトモード32 ビットディスクリプタベースと EAオプションの旧来ページングリニアアドレスを物理メモリへ変換
32 ビット PAE モード32 ビットプロテクトセグメンテーション必須の PAE 階層より広い物理アドレス変換
IA-32e 64 ビットモードFS と GS 以外はゼロベース必須の 4 または 5 レベルページングcanonical リニアアドレスを物理メモリへ変換

したがって、アドレス生成は一般的な「x86 メモリモデル」ではない。8086 はセグメンテーションによって 16 ビットオフセットを 20 ビット物理アドレスに拡張する。80286 はセグメント値を保護されたディスクリプタセレクタに変換する。80386 はリニアアドレスページングを追加する。PAE はページングエントリの幅と階層を変更し、IA-32e はページングを必須にするとともに 64 ビットモードで通常のセグメンテーションを縮小する。

ディスクリプタの詳細については x86 プロテクトモードと特権 を参照し、実効アドレスをエンコードする命令フィールドについては x86 命令エンコーディング を参照。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)