AArch64は64ビットアーキテクチャであり、アドレスを指すポインタも64ビットであるが、現実には、32ビット空間では不足でも64ビット空間がフルに必要というわけではない。このため、ARMv8で扱える仮想空間は48ビット(256TB)となっている。これはIntelの64ビットアーキテクチャでも同様である。

AArch64のメモリ空間の使い方

そして、通常のアプリケーションは0番地から始まる低番地のメモリ領域を使い、OSのカーネルは2の64乗番地側の高番地のメモリ領域を使い、その中間は空きという使い方になっている。このアプリケーション側、OS側ともに最大48ビットのアドレス空間が使用できる。なお、ARMv8ではサポートされる物理メモリ空間も最大48ビット(256TB)であるが、実際にはこれほど大量のメモリを付けることはないので、それぞれの実装で現実的なビット数が選ばれることになる。

アドレス変換のページサイズは4KBと64KBの2種類がサポートされているのは従来のARMv7と同様であるが、仮想アドレス空間が広くなったので、4KBページの場合は4レベルのテーブルを使うアドレス変換となっている。これはIntelの64ビットアーキテクチャと同様である。また、64KBページの場合は2レベルのテーブルを使うアドレス変換となっている。

ARMv8のアドレス変換とページテーブルエントリの形式

ARMv7は仮想メモリをサポートしているが、仮想アドレスから物理アドレスへのアドレス変換は1回で、Intelで言えばVTサポート前のプロセサと同じ構造である。今回の発表ではARMv8の仮想化サポートについては言及されていないが、仮想化の最大のオーバヘッドであるシャドーテーブルの作成を不要にするIntelのEPTやAMDのNPTのような機構がARMv8に含まれていないと、仮想化した時の性能低下がx86プロセサより大きくなる恐れがある。

また、原則としてARMv7のA32命令と同じ意味をもつ命令がA64にも作られていると書かれているが、レジスタ指定ビットがAarch32では4ビット(16個のレジスタ)で済んでいたが、AArh64では32個のレジスタがあるので、5ビットを必要とする。しかし、ARMv7の命令は、次の図のようにレジスタの番号を指定する欄は4ビットしかない。ARMの標準的なレジスタ間のデータ処理命令ではRn、Rm、Rdの3つのレジスタを指定する必要があり、全体では命令ビットが3ビット不足してしまう。

ARMv7のデータ処理命令の形式

これをどこから持ってくるかが問題である。1つのヒントは、A32からの主要な変更のところで、条件分岐などの条件を使う命令の種類が大幅に減っていると書かれていることである。

この図のように、ARMv7の多くの命令は4ビットのCondition Field(状態欄)を持っており、プロセサの状態レジスタ(Negative、Zero、Carry、Overflow)と命令の状態欄に指定された状態が一致した場合だけその命令が実行され、条件が合わない場合はNOP(何の動作もしないノーオペレーション)となる。筆者の推測であるが、この部分を1ビットに減らしてレジスタ指定に必要となる3ビットをねん出しているのではないかと思われる。

そして、もう1つのA32との主要な相違点として、任意長のロード、ストア命令の廃止がある。こちらは命令のビット数の問題ではなく、このような長さが可変のメモリアクセス命令は、Out-of-Order実行などとの相性が悪く実装上の負担が大きいということで廃止されたのではないかと思われる。

ARMv8アーキテクチャについては、まだ、概要が公開された状態で、アーキテクチャの詳細は2012年後半に発表される予定である。そして2012年にはサンプルチップが出てきて、2014年にはシステムのプロトタイプが出る予定となっている。

また、ARMの64ビットアーキテクチャ開発のパートナの1社であるAMCCはFPGAで作ったARMv8エミュレータを来年1月から発売すると発表しており、ARMv8用のコンパイラもARMから提供されるので、一応のソフト開発環境ができ、ARMの64ビット化の歯車が回り始める。