動作させるために、メーカーの設計CPU 32ビットアドレスバスまで、このモードでは、モードの保護でリアルモードアドレスバス20、約1Mへのメモリアクセス、より多くのメモリのCPU、アクセスので、メモリが大幅に増加しました。
アドレッシング32ビットを使用GDTと呼ばれるものを動作させるための保護モード、グローバル記述子テーブルと呼ばれるこのGDT(グローバル記述子テーブル)。それの私の理解では、それは、それぞれがメモリ内のセグメントと、このセグメントの先頭アドレスの大きさを保って、ディレクトリのようなものであるということです。
このセグメントは、その後、彼はメモリのセグメントであり、それに名前を付け、メモリ内の小片を選択するように理解されるであろう。
この図は、より良い、以下に説明します
もちろん、メモリ位置にGDTの範囲内で、確かにリアルモードでアクセスできるようになります。
あなたは、セグメントアクセスGDTの最初のエントリにセグメントにアクセスするために、より大きなアドレスにアクセスし、その後、彼の実際の物理アドレスを取得したい場合は、32ビットバスアクセスには、保護モードを起動します。
move ax [0x5a1]
のはもちろん、最初のベースアドレスレジスタが0に設定されている、あなたはリアルモードメモリは0x5a1場所斧がライン上のトップアセンブリ文でそれを登録したデータを読みたいとしましょう。
あなたはメモリ位置にアクセスしたい場合は、この方法でデータ5Mはない仕事、この時間は、次のコードを使用するようにします
[SECTION .gdt]
; 段基址 段界限 属性
LABEL_GDT: Descriptor 0, 0, 0
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C + DA_32
LABEL_DESC_VIDEO: Descriptor 0B8000h, 0ffffh, DA_DRW
LABEL_DESC_5M: Descriptor 0500000h, 0ffffh, DA_DRW
GdtLen equ $ - LABEL_GDT
GdtPtr dw GdtLen - 1
dd 0
SelectorCode32 equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo equ LABEL_DESC_VIDEO - LABEL_GDT
Selector5M equ LABEL_DESC_5M - LABEL_GDT
mov bx, Selector5M ;用 es 指向5M内存描述符
mov es, bx
mov edi, 0
mov ax, [es:edi]
コードの最初のブロックは、サイズ0FFFFH、LABEL_DESC_5Mと呼ばれる名前のセグメントメモリ5Mの位置に、このテーブルでは、GDTのために書かれています。私はまた、我々は気にしてはならない、他のセグメントの数を書きました。
第二は、第がある、LABEL_DESC_5M Selector5Mこのセクションでは、このテーブルが少ないGDT対応するコードブロックの使用です。レジスタBXレジスタを介して、それを渡すエス。このレジスタは、特にESは、テーブルエントリのGDTの真ん中に来ています。EDIレーン5Mアクセス5MのEDIセット場合は0に、値がこの位置に相対的であるこの位置をオフセットし、セット1にゼロバイト次いで5MアクセスEDI場合など、当然のことながら、最大セグメントを超えることはできません範囲。そして、最後の文は5Mは、それらを斧書き込みデータの位置です。
MOV斧は[0x500000]は、もちろん、これが実行されていないこと、次にリアルモードメモリアクセス5Mの使用方法は、レジスタとバスをサポートしていない場合は、考えてみましょう。
MOV斧、[ES:EDI]この文は、MOV斧とみなすことができる[0x500000 + 0]、彼はこのために実行することができました[ES:EDI]保護モードをトリガし、ESに取り組むべきであるそれから開始しますGDT保護モードは、メモリのアクセスより多くの量を読んで、この実装は、ハードウェア実装です。
以下の表にまとめました