竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU 分岐先の抽象化

<<   作成日時 : 2015/10/31 02:18   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 従来のマイクロプロセッサはどれも任意の番地にジャンプして命令の流れを変えることができる。これはBASIC言語の行番号と同じである。

 以前考えたのは分岐先の命令に識別子を付けて、飛び込み可能かどうかを判定し、飛び込み不可であれば例外を発生させるというもの。

プログラムカウンタはなくせるか?


 今回はもうちょっと考えてみた。

 あるプログラムの命令列を以下の様に定義する(とりあえず4バイト単位で)。先頭から続くラベルに対応する番地の集まりを分岐先テーブルとする。

00000000: 命令が実行される先頭番地 (ラベルL0)
00000004: ラベルL1の番地
00000008: ラベルL2の番地
……
L0: 命令の先頭
 命令……
L1: 命令1
 命令……
L2: 命令2
 命令……

 特権モードからこのユーザーモードでのプログラムがメモリ上に置かれ、最初に呼び出されるときはL0番地へジャンプする。順に命令は実行される。
 L1に分岐する命令は、L1に対応する先頭から0x00000004番地に置かれている分岐先アドレスを読み込み、そこへジャンプする。その他のラベルも同様。

 こうすればラベル付きの構造化BASIC程度にはなった。ラベルが付いていない番地へは分岐することができないし、命令ごとにエントリポイントであるかどうかの識別子をつけなくてもよい。ラベルとして表すリテラルは0,1,2,...で扱えるので命令列が短くなる。
 常に間接ジャンプになってしまうのでそこはどうか?この分岐先テーブルはそのままプロセッサ内部の分岐予測器にコピーされそこで参照されるので、毎回メインメモリを参照するロスはない。分岐先テーブルが分岐予測器よりも大きければ、キャッシュメモリのような構造にしてもよい。
 ジャンプテーブルはどうするか?あるラベルLnからLn+1,Ln+2,... の場所に実際の分岐先アドレスを置いておき、レジスタでLnから加算すればよい。
 この考えをロードストアによるデータの参照に拡張することもできる。分岐先テーブルを拡張してデータテーブルを置き、同様に扱う。このデータテーブルの情報は、データキャッシュのインデックス情報として使える。また、分岐先テーブルは命令キャッシュのインデックス情報としても使える。
 この分岐テーブルが書き換えられてしまうと大変なので、ユーザモードからは書き換えられないよう保護の対象とすべきだろう。またはテーブルそのものをユーザモードからは不可視の領域に置くか。

 コンパイラが吐き出すオブジェクトファイルはデバッグ用や他のオブジェクトファイルの参照用にラベルの情報を持っている。これはリンカがオブジェクトファイルから実行形式のファイルを作るときに使う情報をプロセッサで扱ってみたらという考えでもある。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU 分岐先の抽象化 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる