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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU エンディアンの設定

<<   作成日時 : 2012/07/27 15:22   >>

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

 デフォルトでbyte単位のリトルエンディアンと決めたが、任意に変更できるようにしたい。

ぼくのかんがえたさいきょうCPU エンディアンとタグ付きデータの扱い

 エンディアンの設定はあるレジスタで決めようかと思っていたが、コンテキストが切り替わるとそのレジスタの内容も保存しなければならない。できるだけ特殊なレジスタはなくしていきたい。ページテーブルで空間ごとに設定する方法もあるが、以下思いつきを。

 ロード命令の幅で考えてみる。

 1バイトのロードはそのままOK。
 2バイトのロードはリトルエンディアンとビッグエンディアンの切り替え。
 4バイトのロードは1バイト単位の入れ替えと2バイト単位の入れ替えがある。4通り。
 8バイトのロードは1,2,4バイト単位の入れ替えで8通り。
 ……

 一方、メモリアクセスにはアライメントという考えがある。2バイトのロードなら偶数番地にしかアクセスできない。これは境界をまたぐとメモリアクセスが面倒になるためで、1つの命令につき2つのメモリアクセスが発生することになる。有効アドレスの下位1bitが0でなければならない。

 1バイトのロードでは有効アドレスのbitはすべて有効。
 2バイトのロードでは有効アドレスの下位1bitが0でなければならない。
 4バイトのロードでは有効アドレスの下位2bitが00でなければならない。
 8バイトのロードでは有効アドレスの下位3bitが000でなければならない。
 ……

 ということは、0でなければならない有効アドレスのbitをエンディアンの指定に使えないだろうか?

 2バイトのロード 有効アドレスの[0]でバイト入れ替え指定
 4バイトのロード 有効アドレスの[0]でバイト入れ替え指定、[1]で2バイト入れ替え指定
 8バイトのロード 〃[0]でバイト入れ替え、[1]で2バイト入れ替え、[2]で4バイト入れ替え指定
 ……

 これだとコンテキスト切り替えと無関係に、メモリアクセスの命令ごとにエンディアンと切り替えることが出来る。

 考えられる問題点は、アクセスするアドレスの計算を間違うとアライメントエラーで割り込みが発生する代わりにデータが入れ替わってしまうというわかりにくい障害が発生しそう。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU エンディアンの設定 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる