• ベストアンサー

intel 486 ins命令

intel 486系のins命令は 指定したI/Oポートからデータを読み込み、ES:DI番地に書き込むらしいのですが、 この「ES:DI」番地というのは仮想アドレスではなくて、 物理アドレスということでしょうか? システムがページングを有効にしていたとしても、ins命令はページンングとは無関係に ES:DIの物理アドレスにデータを置くのでしょうか?

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

  • ベストアンサー
回答No.1

Intelの命令セットでは、メモリにアクセスする場合にはセグメントセレクタ(16bitであればセグメントレジスタ)を用いて、論理アドレス(仮想アドレス)を物理アドレスに変換します。 16bitモードで動いている場合には、セグメントレジスタ(16bit)の値に16を乗じた値を論理アドレス(16bit)に加算して、物理アドレスを決定します。但し、計算結果が21bitになってしまう場合で、A20GATEが閉じている場合には、計算されたアドレスの最上位ビットを無視するという例外があります。 32bit/64bitの場合では、セグメントセレクタの値を用いてディスクリプタテーブルと呼ばれるテーブルを引き、それを用いて論理アドレスを丁度良く変換してやると物理アドレスになります。 この質問の場合でも、ESで参照しているので、論理アドレスになる筈です。 尚、この命令の実行の際にページフォールトが起きる場合、 ins命令発行→PF→OSが例外をキャッチし、PFを解消する→ins命令続行 となります。 # 例外をキャッチしない場合は、概ね # PFが発生 #  →OSがPFをキャッチしなかった場合はDF(Double Fault)が発生 #   →OSがDFをキャッチしなければTF(Triple Fault)が発生してマシンが停止する # という動作になったような気がします。調べるのも実験するのも面倒臭いので確認はしていませんがご愛嬌。

Skynetwork
質問者

お礼

あれから調べてES:DIが論理アドレスだということがわかりました。 Linux0.12のカーネルが単に物理メモリをリニアマップしてただけでした。 どうもありがとうございました。

Skynetwork
質問者

補足

ありがとうございます。 実は古いLinuxのソースを読んでまして妙な気がしたのです。 linux0.12のswap.cのtry_to_swap_outにて、ページの物理アドレスを取得してファイルに書き込んでいるのですが、 この時すでにページングはONですし、スワップアウトはもちろんユーザエリアのページが対象です。 それで調査を続けますとlinuxはinsw,outswを使ってディスクデータの読み書きを行っているのを見つけました。 しかし、何度確認しても物理アドレスに対してinsw,outswしているのです。 もしもカーネルエリアのページならストレートマップで物理アドレスでも仮想アドレスでも同じ値ということも あり得るのでしょうけれど、そうではなさそうだと感じています。 それでインテルのマニュアルみてもinswのアドレスについて特別なことは書いてないので 物理アドレスではないのかなぁと思い質問させて頂きました。 ES:DIが論理アドレスだとしますと、ますますlinuxのコードがわからなくなってきましたσ(^_^;)

その他の回答 (1)

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

ページングをしてる状況で「物理アドレスにデータを置く」って, 何のメリットがあるの?

Skynetwork
質問者

補足

ありがとうございます。 下のかたの補足にも書いたのですが、ページング中にページイン、ページアウト処理するのは楽なのかなぁ という気がしますがよくわかりません。 linuxではページテーブルエントリを壊してからページをページアウトしてます。 ですのでページアウト対象のページはもはや物理アドレスでしかさわれない気もするのですが、 ins,outswが物理アドレス対象でないとするとわけがわからなくなりますσ(^_^;)し、 期待する情報は全然見つかりません(~_~;)

関連するQ&A