セキュリティを考えなくてもOSECPUの設計に至る
(0) はじめに
- OSECPUのバイトコードは、「第三世代OSASK」としてKが数年前から設計していたものでした。これがOSECPUになる際に、実は大きな仕様変更をすることなく、そのまま流用できています。つまりKは知らないうちにセキュアな設計をしていたのです。
- ではどうやってこの仕様に決めていたのか、その話を書きたいと思います。
(1) 仕様の理由
- なぜJITコンパイル方式?
- CPUに依存しない互換性を提供したかったから。Javaがうらやましかったから真似してみた。
- なぜ整数レジスタとポインタレジスタを分離したのか?
- ページングもセグメンテーションもない環境下で、(多少時間がかかってもいいから)メモリ上の構造体を移動することを考えよう。この時、この構造体を指していたポインタはすべて修正されなければいけない。だからメモリ内のデータのうち、どれがポインタであるかはOSが完全に把握することにした(だからmalloc時に型を明示する)。
- ではレジスタはどうか。もし汎用レジスタ方式を採用していたら、その値は整数値なのかポインタなのかをどうにかして判断できなければいけない。そのために各レジスタがポインタを扱っているのかどうかを制御するフラグレジスタを作り、それを制御する命令を付けたモデルを検討したが、結局のところ、汎用レジスタ方式をやめるほうが単純化できると分かった。
- 汎用レジスタ方式をやめれば、整数レジスタとポインタレジスタのビット数も独立に決められる。さらにポインタレジスタの値を直接設定させなければ、ポインタレジスタのビット数に依存しないでプログラムが書けることもわかった。これはアドレス幅に無関係にアプリが書けるということなので、互換性の面で非常に良い。
- なぜメモリアクセス時に型チェックをするのか?
- エンディアンが違うシステムでも同一の結果を保証するにはこれしかないと思った。
- なぜレジスタ数がこんなに多いのか?
- なぜ「reg0=reg1+reg2;」のような三項演算形式にしたのか?
- なぜフラグレジスタがないのか?
こめんと欄