@nminoru_jp さんによる IA-64 とエミュレーションの話

ACOSのハードウェア実装復活記念(?) IA-64 の、まさにエミュレータのためにあるような数々の機能の話
4
中村 実 @nminoru_jp

NECがACOSのItaniumエミュレーションを止めたので、弔辞のかわりにA-64がどれだけ他のアーキテクチャをエミュレーションするのに適していたかをツイートしていこうと思う。

2012-06-29 21:06:33
中村 実 @nminoru_jp

@nminoru_jp ①汎用レジスタが多い。x86-64は汎用レジスタが16本しかないから31本のMIPSをJITコンパイルでエミュする場合、最近使った数本しかレジスタに載せておけない。でもIA-64の汎用レジスタは127本。ゲストのレジスタを決め打ちで格納できる。万歳。

2012-06-29 21:07:06
中村 実 @nminoru_jp

@nminoru_jp ②2^64の仮想メモリ空間は2^61ずつ8つにregion分割されている。各regionはプログラムの配置ルールが違いLinunx/Winだとreg-0はIA-32エミュ用の領域になっている。エミュをする上で既存OSの邪魔を受けない領域が最初からあった。

2012-06-29 21:08:36
中村 実 @nminoru_jp

@nminoru_jp ③Translation Register(TR)。IA-64はSoft Page Table WalkでTLBエントリは命令で明示的に挿入する。この時、勝手にパージされない固定エントリ TR を作ることができる。Itanium2は最大64個まで。

2012-06-29 21:09:11
中村 実 @nminoru_jp

@nminoru_jp 既存のページテーブルに覆いを被せたりできる。また登録したエントリ内容を後から取得することも可能なので、自分の登録した「ゲストTLBエントリ」を後から確認することもできた。

2012-06-29 21:10:12
中村 実 @nminoru_jp

@nminoru_jp ④データデバッグ機能が多彩。Itaniumの4組のDBRはアドレスマスク方式で検査するので網の形を自由に変えられる。また有効にしてもトラップしない限り性能低下がない。また次の1命令実行だけデータデバッグを無効化するということが可能。

2012-06-29 21:13:15
中村 実 @nminoru_jp

@nminoru_jp ⑤Protection Key Register(PKR)。ページに対して24ビットのkeyが設定できる。CPU側に16本のPKRを持ててkeyが合致し、かつkey毎のrwxの権限が一致した場合にのみアクセスでき、ダメなら専用例外という機構がある。

2012-06-29 21:15:02
中村 実 @nminoru_jp

@nminoru_jp ゲストマシンのページに設定するUser/Supervisorをどうエミュレーションするかは悩みどころだけど、ItaniumならこれをPKRで楽々クリアできる。他のゲストMMU機能も幅広くPKRが使える。

2012-06-29 21:16:51
中村 実 @nminoru_jp

@nminoru_jp ⑥メモリ検査命令probeがある。probe.w.faultは1バイトのメモリを指定してそのページが書き込み権限を持っているかを検査してくれる。権限違反ならprobeでアクセスしたことを判別可能なフォルトを発生させることができる。

2012-06-29 21:19:03
中村 実 @nminoru_jp

@nminoru_jp ゲストマシンの命令のエミュレーションのためにこれから書き込む予定の領域を検査する必要が出てくる。x86-64だと lock: addb (addr), $0 みたいなコードが必要になる。IA-64だとprobe.w.faultがあるってことです。万歳。

2012-06-29 21:21:09
中村 実 @nminoru_jp

@nminoru_jp ⑦ユーザランドでendianを切り替え可能。普段はlittle endianで動いているけど、JITコードだけbig endianにとかできるよ。がんばれば。

2012-06-29 21:22:16