プロテクトモードのセグメント機構プロテクトモードのセグメント機構リアルモードとプロテクトモードのセグメントプロテクトモード時のセグメント機構は、リアルモード時のそれとは大きく異なります。リアルモードの場合、メモリへのアクセス範囲は1MByte(0x00000-0xfffff)に制限されています。セグメントレジスタには、セグメントアドレスをセットする事によりメモリのアクセスを行います。Table]のセレクタ値と呼ばれるインデックス値をセットする事によりメモリアクセスが行われます。Table]のインデックスとなっていて、CPUはその内容に従い物理メモリーにアクセスを行う。Register]があり、CPUはこの値を使用して、ディスクリプタ・テーブルにアクセスを行う。Register]アドレス変換を行う時、CPUは任意のメモリ上に存在するディスクリプタ・テーブルを使用するが、これを使用するためには、CPUはあらかじめディスクリプタ・テーブルのアドレスを知っておく必要がある。GDTRは、このディスクリプタ・テーブルのアドレスを設定するために使用する。このレジスタに、ディスクリプタ・テーブルのリニアアドレスを設定することによりCPUは、ディスクリプタ・テーブルを参照できるようになる。ディスクリプタ・テーブルのLimit値(テーブルのbyte数-1)がセットされる。使用するディスクリプタ・テーブルのリニア・アドレスLGDT命令GDTRに値をロードするためには、6バイトのメモリ上に値をセットしておき、これをLGDT命令によりCPUにロードする。Addressがレジスタにロードされる。ビットのセグメント識別子である。これは、セグメントを直接に指すのではなく、その代わりにセグメントを定義するセグメント・ディスクリプタを指す。セグメント・セレクタは、次の構成となっている。セレクタの特権レベルを指定する。Level])が高いプログラムでも一時的に、特権レベルを落としてメモリにアクセスする事が可能である。使用するディスクリプタ・テーブルを指定する。このフラグをクリアするとGDTが選択され、セットするとLDTが選択される。ディスクリプタ・テーブルのインデックス値をセットする。Tableを参照してアドレス変換を行う。Descriptorは、セグメントのサイズと位置、およびアクセス制御情報とステータス情報をCPUに提供する。Table[IDT]がある。Limitセグメントのサイズを指定する。プロセッサは、2つのセグメント・リミット・フィールドを一緒にして20bit値を形成する。プロセッサは、G(グラニュラリティ)flagの設定に応じて、次の2つの方法のうちの1つでセグメント・リミットを解釈する。Flagが0の時、セグメント・サイズは、1byte単位で、1byteから1Mbyteまでの範囲に及ぶ。Flagが1の時、セグメント・サイズは、4Kbyte単位で、4Kbyteから4Gbyteまでの範囲に及ぶ。Address4Gbyteのリニア・アドレス空間内のセグメントにおける、最初の位置を定義する。Addressは、16byte境界にアライメントを合わせなければならない。16byteの境界にアライメントを合わせることは必須ではないが、プログラムは、コードとデータを16byte境界にアライメントを合わせることによって最大の処理能力を出すことができる。Typeセグメントまたはゲートのタイプを指示し、セグメントに行うことができるアクセスの種類と伸長の方向を指定する。Flagがセットされていると、ディスクリプタはコード・セグメント用またはデータ・セグメント用である。Segmentは、読取り/書込みセグメントでなければならない。Segmentをエクスパンドダウン・データ・セグメントにすることができる。アクセス済みビットは、オペレーティング・システムまたはエグゼクティブが最後にこのビットをクリアして以降に、セグメントがアクセスされたかどうかを示す。Flag=1)かを指定する。Flagセグメントの特権レベルを指定する。範囲で指定でき、0が最高の特権レベルである。DPLは、セグメントへのアクセスの制御に使用される。Flag=0)を示す。このフラグがクリアされていると、セグメント・ディスクリプタを指しているセグメント・セレクタがセグメント・レジスタにロードされると、プロセッサはセグメント不在例外(#NP)を生成する。メモリ管理ソフトウェアは、このフラグを使用して、所与の時点でどのセグメントを実際に物理メモリにロードするかを制御することができる。これは、仮想メモリを管理するためのページングに加えた制御を提供する。Flagセグメント・ディスクリプタが実行可能なコード・セグメントであるか、エクスパンドダウン・データ・セグメントであるか、またはスタック・セグメントであるかに応じて、異なる機能を実行する。bitのコード・セグメントとデータ・セグメントに対しては0に設定する必要がある。)実行可能なコード・セグメント。Flagといい、セグメント内の命令によって参照される実効アドレスとオペランドのデフォルトの長さを示す。このフラグがセットされていると、32bitのアドレスと32bitまたは8bitのオペランドが想定される。クリアされていると、16bitのアドレスと16bitまたは8bitのオペランドが想定される。使用して、デフォルト以外のオペランド・サイズを選択することができ、プリフィックス67Hを使用して、デフォルト以外のアドレス・サイズを選択することができる。スタック・セグメント(SSレジスタによって指されているデータ・セグメント)。Flagといい、(push,pop,callなど)暗黙のスタック操作に使用されるスタック・ポインタのサイズを指定する。このフラグがセットされていると、32bitのESPレジスタにストアされる32bitのスタック・ポインタが使用される。クリアされていると、16bitのSPレジスタにストアされる16bitのスタック・ポインタが使用される。Flagはスタック・セグメントの上限も指定する。エクスパンドダウン・データ・セグメント。Flagといい、セグメントの上限を指定する。このフラグがセットされていると、上限はFFFFFFFFH(4Gbyte)である。クリアされていると、上限はFFFFH(64Kbyte)である。Flagセグメント・リミット・フィールドのスケーリングを決定する。Flagが0の時、セグメント・リミットはbyte単位で解釈される。Flagが1の時、セグメント・リミットは4Kbyte単位で解釈される。(このフラグは、常にバイト・グラニュラであるベース・アドレスのグラニュラリティには影響を与えない。)グラニュラリティ・フラグがセットされていると、オフセットをセグメント・リミットに対してチェックするときに、オフセットの下位12bitはテストされない。AVLシステム・ソフトウェアで自由に使用することができる。