• ベストアンサー

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

tsukasa-12rの回答

回答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

  • MASMのセグメント+オフセットと物理アドレス値

    素人、アセンブリ言語をかじっています。専門的な教育は受けてません。 MASMではアドレス値を指定するのに セグメント値+オフセット値でしていします。 セグメント値を確定しオフセット値が決まれば当然物理アドレス値はきまります。 セグメント+オフセット -> 物理アドレス値 :一対一に対応しています。 しかし 物理アドレス値 -> セグメント+オフセット :一対一の対応 不可 だと思います。 セグメント値がきまらなければ一対一の対応はしませんし、物理アドレスからセグメント値は決められないと思っています。 物理アドレスからセグメント値がきまるのでしょうか? この辺の対処はどうなっているのでしょうか? MASM -> 機械語  対応はできますが、 機械語->MASM どう対応するのか? をふくめて、どうなっているのでしょうか 宜しく願います。

  • 8086のメモリ管理について。

    8086のメモリ管理について。 いつもお世話になっております。 小生、現在ポケコンZ-1GRでx86アセンブリを勉強中のアセンブリ初心者です。 今回質問させて頂きたいのは8086のメモリ管理についてです。 8086はメモリ管理にセグメントとオフセットという方法を使い、全部で2MBのメモリが使用できるのは、理解できました。 理解できないのは、物理メモリへの変換の際、(セグメントアドレス X 10H) + オフセットで物理メモリにアクセスできるという箇所です。 セグメントアドレス X 10Hで20bitのアドレス空間を操作できるのは分かるのですが、 問題はセグメントアドレス X 10Hがどこの箇所(例えばCPUの中)で行われているのでしょうか? MMUはもちろんないはずだと思います。 お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • sil_rew_memのメモリアクセスについて

    toppers/JSPにて組込みファームウェアの開発を行っております。 toppers/jspのメモリ空間アクセス関数でuint32_t sil_rew_mem(void* mem)にて、メモリアクセスを行うと、 memによるメモリアドレス指定が、4の倍数の場合は正常にデータが読込めますが、 4の倍数以外の2の倍数の場合は、繰り下げられた4の倍数の値が読込まれます。 つまり、 Address  : Data 0x0000 : 0x12345678 0x0004 : 0x9ABCDEF0 を書込み後、 0x0000 を sil_rew_memで読込むと、正常に0x12345678が読込まれます。 しかし、0x0002をsil_rew_memで読込んでも、同様に0x12345678が読込まれます。 この関数は、このような仕様なのでしょうか? どなたかご存知の方は、ご回答をよろしくお願いいたします。

  • XPモード上ブリッジモード接続で接続不安定

    Win7 Pro上でXPモードをインストールし利用しています。 XPモードの設定は以下の通りです。 RAM:1.5GB(ホストPCは4GB) ネットワークアダプタ:ホストPCの物理アダプタを指定(ブリッジモード) IPアドレス:192.168.1.100(固定IP) サブネットマスク:255.255.255.0 デフォルトGW:指定なし 上記XPモード上から同一NWのサーバ(192.168.1.10)にアクセスするアプリがあります。 はじめは通信できているのですが、よくアクセス断になります。 pingも通らなくなります(request timed out)。 通信不可時にXP自らのIPを調べると上記の設定に変わりありません。 その後、5~10分ほど待っているとまた正常にアクセスできます。 XPモードでブリッジモード接続は不安定な通信となるのでしょうか? 回避方法などあれば教えていただきたいです。

  • アドレス指定モード(基本情報処理試験)について

    基本情報処理試験本の中に出てくる、「アドレス指定モード」即値アドレス指定、レジスタアドレス指定、ベースアドレス指定、等々、知識としてはよく解るのですが、実際のところ、どれを使ってコンピュータは計算しているのでしょうか。

  • WRC-X3000GSAでアクセスポイントモードで

    WRC-X3000GSAでアクセスポイントモードでルータの管理画面が出ない IPアドレスを設定したい。 ※OKWAVEより補足:「エレコム株式会社の製品」についての質問です。

  • メモリアクセスにつきまして

    PC/AT互換機においてのメモリマップの仕組みについて質問があります。 例えばIO空間には0x00~0x100までのアドレスが割り当てられているとしたら、そのアドレスにアクセスがあった場合メインメモリにおけるアドレス0x00~0x100間には物理的には何にも読み書きされないのでしょうか? また、VRAM領域というのがありますがその領域にアクセスするということは物理的にビデオカードにあるVRAMに読み書きが行われるのであって、メインメモリのその領域には一切アクセスされないという解釈で正しいのでしょうか?? 何かご存知の方がいらっしゃいましたらお助け下さいませ。。

  • アセンブラのCAP-X COMP-X

    アセンブラのCAP-X COMP-X  いつも回答いただきありがとうございます。 アセンブラのCAP-X COMP-Xと言っても、知っている人は、少ないのでは無いでしょうか?  アセンブラのプログラムを組む機会自体が、減少していると思えるのです。  私が、最初に情報処理試験で触れたのは、このアセンブラと仮想のコンピュータでした。いつか、征服したいテーマでした。  でも、今でも、アセンブラと仮想機械では、もっとも、シンプルで、アセンブラの言語と原理を知るには、もっともふさわしいのでは、無いかと考えているのです。  その後も、アセンブラと仮想の機械は、進展しましたが、知らない者には、いよいよ理解しがたく、近づくことが、できないので、この CAP-X COMP-Xを  まず、理解したいと考えているのです。、  アセンブラを理解できる人には、なじみの無いアセンブラと仮想機械と思いますが、現在知っているアセンブラから、類推して回答していただけるとありがたいです。  今は、Windowsの時代になってCAP-X COMP-Xをシュミレーションできるソフトも無くなりました。頭の中で仮想するばかりです。  一語16ビットの計算機であって、0を含めて256の整数倍の番地から始まる連続した256語を1記録ブロックとして、最少1記憶ブロックから最大256記憶ブロックを実装することができる。N個の記憶ブロックを使用するとき、アクセスできるアドレスは、 0番地から(256*N-1)番地までである。  Nが、256の時、 256*256-1=65536 となって65Kのアドレス空間を持つことになる。 ●Q01. このメモリーの中で、コードとテータの両者を使っていると解釈してもよいのだろうか? ●Q02. もし、メモリーのアドレス空間をコードとデータの両者を混合して使用していると誤ってプログラムしてしまうとコードをデータとして読み込んだり、コードのアドレスに誤って、データを書いてしまい、これが、原因で、コンピューターが、暴走したりする危険性は、あるのでしょうか? ●Q03. この仮想の機械には、OSのような領域は、存在しないのでしょうか? ●Q04. 必要ないのでしょうか?  OSが、必要であるのなら、65Kの全ての領域は、使用できなくなると考えることができるのでしょうか? ●Q05. アセンブラの記号を作って、実行するようにしています。しかし、アセンブラを機械語にアセンブルして、メモリーにロードする必要があるように感じますが、この機械では、 アセンブラを機械語に翻訳するソフトは、どのようにして利用されるのでしょうか? ●Q06. 最初にアセンブラ言語を機械語に変換するアセンブリ言語をメモリーにロードしてから、アセンブラを機械語に変換して、メモリーにロードして、アセンブリ言語をクリアして使用するということになるのでしょうか? ●Q07. これなら、機械語とデータ領域の合計として65Kを使えるということになるのでしょうか?  16ビットの命令語のうちアドレスを指定できるのは、 ADフィールドの アドレスの下位8ビットを指定することになります。  これでは、256通りしか表現できません。  上位8ビットは、 BR(基底レジスターbase register)で定められる。  つまり、BRを変更しないと256通りのアドレスを超えてのアドレスを指定できなくなる。  このBRを変更するのに、 JSR命令(jump to subroutine)が使用される。subroutineに飛ぶのと、記憶ブロックを超えるのとどうして、同じ命令で行われるのか分かりません。 ●Q08. どうしてでしょうか?  昔、ユニバック、マシーンというのがありました。  36ビット、1ワードの機械でした。36ビットの中に命令部分とアドレス部分16ビットの両方を納めなければならないので、アドレス空間には、限度がありました。  16ビットだと限度のアドレス空間は、65Kワードということになります。  これ以上に大きな空間は、アクセスできない。  バイトマシーンのように最初の命令語によって、何バイトでも、アキュームレーターに収納できて大きなアドレス空間にアクセスできるようになっていなかったのです。  大きな容量のプログラムを作るとき、65Kワードでは、収納できない。それで、使用したのは、オーバーレイという手法でした。  プログラムをセグメントに切って、必要に応じて順にプログラムをメモリーに載せ替えるという方法です。しかし、セグメントが大きくなるとこれでは、収まることができないので限度がありました。 ●Q09. オーバレイのやり方は、記憶ブロックのやり方と同様と考えて良いのでしょうか?  初期的な質問で申訳ありません。  また、質問が続くようなことがありましてもよろしく教授方お願いします。 ーーーーーーーーーー CAP-X Computer Application X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 COMP-X の仕様[編集] COMP-X はデータワード長が16ビット、メモリアドレス長も16ビットのコンピュータである。アドレスはバイト単位ではなくワード単位に付与される。ワード中のビットの番号付けは、最上位ビットを 0 番、最下位ビットを 15 番とする。バイト単位の処理という概念がないため、エンディアンも規定されていない。また、COMP-X には入出力の概念が規定されておらず、何らかの手段でメモリ上にプログラムとデータを格納し、実行し、その結果はメモリを読み取ることでわかるようになっている。従って、入出力命令は存在しない。扱う数は整数のみで、2の補数表現を採用している。 レジスタは次の通り。 ーーーーーーーー COMP-X Compuer X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 命令語は全て 1 ワードであり、先頭から順に OP フィールド(4ビット)、GR フィールド(2ビット)、XR フィールド(2ビット)、AD フィールド(8ビット)で構成される。OP フィールドは命令の種類を表すコード(オペコード)であり、COMP-X には 12 種類の命令しかない。GR フィールドでは演算で使用する GR の番号が指定される。また、JC命令では分岐条件の指定に使われる。XR フィールドではアドレス修飾を行う GR の番号が指定され、内容が 0 の場合は GR0 を意味するのではなく、GR によるアドレス修飾をしない。AD フィールドはアドレスの下位8ビットを指定する。 実効アドレスとは命令で使用するメモリアドレスであり、上位8ビットは BR で、下位8ビットは AD フィールドで指定される。XR フィールドが 0 以外の場合、指定された GR の下位8ビットと AD フィールドの値を加算し、結果の下位8ビットを実効アドレスの下位8ビットとする。

  • HIGHMEMについて

    IA-32のカーネルは、1Gの仮想空間を、物理アドレスの下位からストレートマップしてる故、1G(896M)を超える物理アドレスにアクセスできない。従って、理屈はともかく、HIMEM空間を通して、物理アドレスをアクセスする必要がある。となんとなく理解しています。 そこでふと思ったのですが、上の理解が妥当だとすると、HIMEMはあくまでカーネル空間だけの話で、プロセス空間は3G、しかも連続してマップする必要のないユーザプロセスでは、ページテーブルを設定すれば言いだけの話で、従って1Gを超える物理メモリを搭載した環境で、あえてHIMEM領域を設定しなくても、カーネルはちゃんとユーザプロセスに1Gを超える物理メモリを割り当てることができる。と思いに至った次第です。この認識、正しいでしょうか?

  • ベースアドレスの設定について

    高速化の為に/BASEオプションや defファイルなどで dll やプロセスのベースアドレスを設定する場合についてですが、これはどういう風にアドレスを設定すればいいのでしょうか? 例えばプログラムや dll がメモリにロードされる時に、マルチプロセスな OS 用のアプリケーション等の場合だと他にどんなモジュールがメモリに配置されているかは実行時じゃないとわかりませんよね?こういう場合はベースアドレスは普通設定しないものなのでしょうか? それと、複数の同時に使用される可能性のある dll を作成する場合に、ベースアドレスを重ならないように設定するといいとのことですが、これは単純に "A.dll のベースアドレスに A.dll の大きさ(バイト)を足したものを B.dll のベースアドレスにする" みたいな感じでいいでしょうか? それからもう1つ、高速であるべきモジュールを作成する時に、どうしても再配置によるオーバーヘッドを払いたくない場合、初期化時に、ソースコード中のアドレスを指定している部分を実行時のベースアドレスとオフセットによって書き換える、ということをしたらいいんじゃないかと思ったのですが、こんなことをするのは現実的ではないですか?(ロード時間がある程度かかるのは気にしないとして) 1つでも回答いただけたら嬉しいです。よろしくお願いします。