いろんなものはつながっている

はじめて読む486(3)プロテクトモードのセグメント

アドレスの指定

アドレスの指定は

セグメントアドレス + オフセット

で定義される

セグメントのアドレスもオフセットもレジスタに保存されている。マシン語のセグメントを指定するにはCSレジスタを、データのセグメントを指定するにはDSレジスタ(もしくはSSレジスタ)を使用する。

各セグメントは、スタートのアドレス、サイズに加えて用途という属性をもって管理される。したがって、CSレジスタが指す先のメモリは実行形式属性がセットされたセグメント(メモリ領域)になる。一方、DSレジスタが指す先のメモリはデータ属性がセットされたセグメントになる。

CSレジスタ:マシン語の命令のセグメントをさす
DSレジスタ:命令の実行によるデータアクセスのセグメントをさす
SSレジスタ:スタックのセグメントをさす

命令の呼び出し

オフセット値もレジスタにセットされている。マシン語命令を呼び出す際のオフセット値はEIPレジスタにセットされている。

したがってマシン語命令の呼び出し先のアドレスは

CS + EIP

で表される。

静的データへのアクセス

静的データへのアクセスのためのオフセット値はEBP(ベースポインタ)にセットされる。したがってデータアクセス先のアドレスは

DS + EBP

で表される。

スタックへのアクセス

同様にスタックのセグメントはSSにセットされ、オフセット値はESP(スタックポインタ)にセットされる。したがってスタックのアドレスは

SS + ESP

で表される。

メモリの使用例

それぞれのセグメントでのメモリの使い方は下記のような図となる。
セグメント1

ディスクリプタテーブル

プロテクトモードではCSやDSに直接アドレス値を設定するわけではない。まずはセグメントを定義してメモリを領域にわける。次にディスクリプタテーブルというものを定義してセグメントを管理する。ディスクリプタテーブルではセレクタ値という値を定義してそれとセグメントをひもづける。CSやDSにはセレクタ値をセットする。セレクタ値からそれにリンクするアドレス値を取得することができる。ディスクプタテーブルのアドレスはGDTレジスタに保存されている。

セグメント2

実際にはタスクごとに異なるディスクリプタテーブルを使用できるようにするため、LDTレジスタというレジスタを導入しタスクごとにLDTレジスタをセットし、タスクごとのディスクリプタテーブルを指定できるようにしている。

セグメント3

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク