質問: 計算機システム 長文で失礼いたします。 ページ化セグメント方式を採用している仮想記憶方式の計算機について 命令をcpuに読み込んだ直後から、オペランドの読み出しが終わるまでの一連の動作をcpu内の処理と主記憶装置へのアクセスを区別して示したい。但し次の仮定を用いる。 (1)命令のアドレス部では、ベースレジスタ、インデックスレジスタおよびディスプレースメント(ベースアドレスからの変位)を指定する。 (2)セグメント表の先頭アドレスは、セグメントベースレジスタに格納されている。 (3)オペランドは主記憶装置から1回のアクセスでとりだせる。 (4)オペランドなど必要な情報の存在するページ表は主記憶装置に取り出されているものとする。 次のようになると思うのですが、途中からわからないのです。 まず、セグメントベースアドレスとベースレジスタの内容をcpu内で加算処理を行う。これにより、セグメント表のアドレスを得ることが出来る。得たセグメト表のアドレスにより主記憶にあるセグメント表にアクセスする。そのセグメント表にあるページ表の先頭アドレスの値とインデックスレジスタの値をcpuで加算処理を行うとページ表のアドレスが得られる。主記憶にあるこのページ表のアドレスにアクセスする。・・・・ その後が判らないのです。オペランドの読み出しはどこまでなんでしょうか?
回答: 途中からの回答になりますが。用語がいろいろ有るので、推測を交えながら。 用語について以下のように整理しておきます。 ・仮想アドレス(論理アドレス)・・変換前のアドレス。本来は実メモリーよりはるかに大きい仮想空間(補助記憶装置に生成)につけた0相対のアドレスの事。 ・実アドレス(物理アドレス)・・変換後のアドレス。実装されている主記憶装置(主メモリー)につけられている0相対のアドレス。 ・ベースレジスタ・・プログラムの再配置(リロケート)に対応するためのレジスタ。基本的にはosやローダが値をセットする。 ・インデックスレジスタ・・ユーザが表操作をするとき、表の行指定をするレジスタ。 次にアドレスの表現形を整理します。 ・命令のアドレス部・・(ベースレジスタ)+(インデックスレジスタ)+(ディスプレースメント) ・仮想アドレス(1)・・(セグメント番号)+(ページ番号)+(ページ内アドレス) ・仮想アドレス(2)・・0相対の仮想アドレス。 ・実アドレス(物理アドレス、主記憶アドレス)・・0相対の主メモリーアドレス。 次にオペランドの取り出しの過程(推測)です。図を書いてトレースしてください。 (1)命令のアドレス部で示される(ベースレジスタ)+(インデックスレジスタ)+(ディスプレースメント)を計算します。これが0相対の仮想アドレスになります。 (2)仮想アドレスをページ長で割り算して商と余りを計算します。ここでは仮に商にページ長を掛けてページ先頭アドレスを求めるものとします。 (3)プログラムごとのセグメント数は可変ですからちょっと厄介です。 (4)セグメントベースレジスタからセグメント表の先頭アドレスを取り出しテーブルサーチをします。先ほど計算したページ先頭アドレスよりも小さい直近のアドレスが目的のオペランドの所属するページの先頭アドレスです。 (5)セグメント表からそのセグメントのページ表の先頭アドレスをつかみます。 (6)セグメント先頭アドレスからページ先頭アドレスを引き、これをページ長で割ってセグメント内ページ番号を求めます。 (7)ページ表からページ番号でテーブルアクセスし、実アドレスのページ先頭アドレスを得ます。 (8)これに前に保存してあった余りを足すと実メモリーのアドレスが得られます。→これがオペランドのアドレスです。 なお、蛇足ですが、(4)でセグメントフォルト、(7)でページフォルトのチェックが入るべきだと思います。 主記憶のアクセス回数が1回と言う件ですが、間接アドレス命令(アドレステーブル経由)でなく、直接アドレス命令だという意味でしょう。そうでないと上記手順では(セグメント表n回)+(ページ表1回)+1回っデ2回どころでは有りません。 あと、実際の機械では、セグメント表やページ表はtlbやdatを使って高速化しています。(原理的には変わらないと思います)