• ベストアンサー

x86のプロテクトモードのセグメントについて

x86のプロテクトモードについて勉強中なのですがわからないことがあるので教えて下さい。 まず「セレクタによってディスクリプタテーブルの中のセグメントディスクリプタが指定されベースアドレスが決まりオフセットが足され物理メモリにアクセスする」と理解しているのですが、これで正しいのでしょうか? またセレクタは8の倍数であると調べたのですが、なぜ8の倍数なのでしょうか。いろいろ調べたのですが、根拠がわかりません。 x86については詳しく知らないので、詳細に教えていただければ嬉しいです。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

下記にIntel CPUの技術情報(日本語)があります。参照ください。 # http://www.intel.com/jp/download/index.htm セグメントの扱いは以下のPDFファイルが詳しいでしょう。 「IA-32 インテル® アーキテクチャ ソフトウェア・デベロッパーズ・マニュアル 下巻:システム・プログラミング・ガイド」 # http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol3_i.pdf この80ページ目あたり(3-9~3-10)にセグメント・セレクタの構造があります。ここをみればセレクタが8の倍数という表現が変だと判ると思います。

osiete-pc
質問者

お礼

詳しいマニュアルを教えていただいて本当にありがとうございます。じっくりと読んで理解を深めたいと思います。お陰さまでずいぶん勉強になりました。感謝します。

その他の回答 (3)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

> 「セレクタによってディスクリプタテーブルの中のセグメントディスクリプタが指定されベースアドレスが決まりオフセットが足され物理メモリにアクセスする」 x86のプロテクトモードというのが286の場合ならこれで良いですが、386以降ではこれで決まるのはリニアアドレスで、この後にページング処理を行って物理アドレスを得ます。 またセレクタは8の倍数というのは正しくないと思います。単にセレクタの下位3ビットがGDT/LDTの識別と要求特権レベルの指定に使われ、その上の13ビットがディスクリプタのインデックスに使われるだけです。

osiete-pc
質問者

お礼

ご回答本当にありがとうございます。リニアアドレスにページングを行えば物理アドレスになるということなのですね。理解が深まりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

セグメントディスクリプタは 286 の時代から 8バイト境界にそろえている (286 では 6バイトしか使っていないけど) ので, セレクタの値も 8 の倍数になっていると楽... かというとそうでもなく, 実際には 0→0 1→8 2→16 .... という変換をしてもたかがしれています. 「8 を掛ける」と思うとアレですが, 実際には「配線をずらすだけ」です. そして 8 の倍数にしていようとそうでなかろうとそのあとの加算の手間は同じ. だからセレクタの持つ情報を見ないといけないんだけど, 「8バイト境界にそろっている」ということは「3ビット分余計にある」とも言えます. そして, ちょうどこの 3ビット分を使ってその他の情報を持っています. ま, これも「どこにおくか」は本質じゃないんだけどね.

osiete-pc
質問者

お礼

詳しい説明ありがとうございます。ただx86についてはしっかりと理解をしておらず、セレクタの意味、持っている情報などについてははっきりした知識を持っていません。(本を読み漁ったり、ネットで調べたりしたのですが、分りませんでした)手を煩わせてしまって本当に申し訳ないのですが、セレクタについて基本から教えていただけませんか。

回答No.1

セレクタが8の倍数なのは、ディスクリプタテーブルの各要素が 8byte だから、ということになると思います。論理的には 0、1、2、・・・ というインデックス値を指定する方法も可能なんでしょうけど、そうすると、ディスクリプタテーブルって実メモリに配置されるので、ディスクリプタテーブルにアクセスするとき 0 → 0 1 → 8 2 → 16 ・・・ のような変換をしなければならなくなり効率がよくないので、あらかじめ 8 の倍数で設定しておくようにしているのかな、と思います。 念のため、リンクを貼っておきます。 (ディスクリプタテーブルの構造については↓の「 3.4.3 セグメント・ディスクリプタ」が参考になると思います。) http://download.intel.com/jp/developer/jpdoc/ia32_arh_dev_man_vol3_i.pdf ちなみに、8byte 境界に配置する ( 8 の倍数のアドレスに配置する ) のは、その方が処理効率が良いからという話だったような気がします。

osiete-pc
質問者

お礼

なるほど!ディスクリプタに合わせて8の倍数ということだったんですね。しかもIntelのガイドのページも合わせて教えていただいてありがとうございます。すっきりしました。

関連するQ&A