英Armは日本時間の3月30日、Arm Vision Dayと題したオンライン説明会を開催。ここで10年ぶりの発表となる最新アーキテクチャ「Armv9」について説明を行った。
Armv9の存在そのものは実は以前から知られていた。富岳に使われている富士通の「A64FX」はArm v8.2-Aであるが、実は「スケジュールがもう少し後ろにずれればArmv9が使えたのだが、間に合わなかった」という話が関係者からの声として聞いていたし、2018年のArm TechConのNeoverseのセッションでは、Poseidon Platformの世代がArmv9になる事を示唆していた(Photo01)。少なくともこの時点では、Armv9は2019年中に発表、2020~2021年にIPの提供といったスケジュールだったらしい。
ところがその後、Armv9は(理由は不明ながら)スケジュールが後退。その代わりにArmv8.4-A~Armv8.6-Aが投入されることになった(Armv8.3-Aは、恐らく2018年の段階で想定されていたと思うのだが自信はない)。2019年あたりから、Ian Smythe氏にArmv9について尋ねた途端に「聞こえない」ふりをし始めたあたり、この辺で若干後ろにずらす決断がなされたのだと思う。
そんなArmv9であるが、やっと準備が整ったようで、今回「次の10年を支えるアーキテクチャ」として発表されることになった(Photo02)。
このうち、Machine Learning(ML)とDigital Signal Processing(DSP)についてはまとめてSVE2という形で実装される模様だが、これについては後述するとして、先にセキュリティについて説明したい。
元々Armv8の中でも特にArmv8-Aに関しては、段階的にセキュリティの強化が行われていた。そもそもArmv8-A世代の変遷を簡単にまとめると
- v8.0-A:Arm V8世代のベース。64bitのサポート
- v8.1-A:Atomics命令/VHE(Virtualization Host Extensions)を追加
- v8.2-A:半精度(FP16)のサポート、Stat Profiling、RAS機能、SVEを追加
- v8.3-A:ネストされた仮想化(Nested Virtualization)、RCpc(Release Consistent processor consistent)、ポインタ認証(Pointer Authentification)の追加
- v8.4-A:Crypto命令の強化とSHA512/SHA3対応命令の追加、Secure EL2、MPAM(Memory Partitioning and Monitoring)の追加
- v8.5-A:RNG(乱数発生命令)、BTI(Branch Target Identifier)、メモリタギング(Memory Tagging)の追加
- v8.6-A:MatMul命令の実装、bfloat16サポート、仮想化強化、ポインタ認証強化(Enhanced PAC2およびFPAC実装)、高精度タイマー搭載
- v8.7-A:PCIe Hot plugのサポート、Atomic 64Bytes load/storeのサポート、WFI(Wait for Instruction)/WFE(Wait For Event)(どちらもTimeout付)のサポート
となるが、このうちセキュリティに関係するのが、
- v8.3-A:ポインタ認証(Pointer Authentification)の追加
- v8.4-A:Crypto命令の強化とSHA512/SHA3対応命令の追加、Secure EL2、MPAM(Memory Partitioning and Monitoring)の追加
- v8.5-A:RNG(乱数発生命令)、BTI(Branch Target Identifier)、メモリタギング(Memory Tagging)、Cache Clean to Point of Deep Persistenceの追加
- v8.6-A:ポインタ認証強化(Enhanced PAC2およびFPAC実装)
といった具合だ。
Armv8.3-AのPointer AuthentificationはROP(Return-Orientated-Programming)やJOP(Jump-Orientated-Programming)に対応したもので、要はStackのアドレスなどを書き換える事で不正なプログラムが実行されるという仕組みを防止するために、飛び先アドレスの一部は別の場所に格納し、Stackにはその別の場所のIndexを格納する、という形で「不正に書き換えるとプロセスが飛び先アドレス不正でクラッシュする」仕組みを入れたものだ。
ただこれはROP/JOPを利用した脆弱性にとりあえず対応したもので、本格的なセキュリティの実装は次のArmv8.4-Aで行われた(Photo03)。
これにさらにセキュア関連命令をv8.5以降で追加していった形になるのだが、最新のドキュメントによれば、
- Armv8.5-AとArmv9.0-A:RNG/BTI/Memory Tagging/Cache Clean to Pointer
- Armv8.6-AとArmv9.1-A:MatMul命令/bfloat16/仮想化強化/ポインタ認証強化/高精度タイマー
- Armv8.7-AとArmv9.2-A:PCIe Hot plug/Atomic 64Bytes/WFI&WFE/Branch-Record recording(v9.2-Aのみ)
という形で命令がサポートされてゆくことが明らかになっている。つまりArmv9のうち、A Profileに関して言えばArmv8.5-Aをベースに、新機能を追加したという形の実装が行われることになる(Photo04)。
さて、ではArmv9にしかない新機能は? というと、これはおそらくA Profileだけだと思うが、新たにRealms(レルム)という概念が導入された(Photo05)。
通常の領域とは別の動作環境を用意し、こことNon-Secure環境の間で自由にContextを移動させることが出来る様になるというものだ。単純なケース(Photo06)では、Non-Secureな領域で動くアプリケーションを、そのままRealmで動かすことで、Secureかつ他の影響がない形で実行できる様になるという話だが、別にNon-Secureな環境だけでなくSecureな環境のContextもRealmで動かせるようになるとする(Photo07)。
このPhoto07の環境は、なんというかVMwareのLive Migrationを彷彿とさせるイメージである。まだRealmsの詳細が判っていないので断言は避けるが、単にSecurity云々だけではないように思える。
もちろん、Secure/Non-Secureを問わず独立した実行環境で動かすことで、それこそSpectreのように侵入されてもその影響はRealmsの自分の領域に留まるから、これをFlushしてしまえば他に影響しないというSecurity上のメリットは明白ではある。
なお、Memory Tagging(Photo08)や、Morello Program(Photo09)なども将来取り込みを行ってゆく(Memory TaggingはArmv8.5-A/v9.0-Aで実装される)といった形で、よりセキュリティに注力するというのがArmv9の大きな特徴の1つとされる。
ちなみに先のRealmsに関する詳細は夏ごろに公開される予定との事であった。
これに比べると、SVE2の方はまだ正体が明らかではない。Armv9世代の基礎、というこのスライド(Photo10)にあるうち、MLとかDSPに関係しそうなところがSVE2という形で実装される、という意味であろうかと思う。
セキュリティ機能の充実とは別に、Armv9世代ではさらなる性能向上を目指す必要があり、その中にはML向けに8bit未満のデータ型のサポート(INT 1/2/4あたりだろうか)とか、より柔軟なデータアクセス(Gather-Scatter DMAのサポートとかPredicationの実装など)を含むという話で、こうしたものがDSPあるいはAIとして表現されている模様だ。こちらも詳細はもう少し時間が経たないと明らかにならないだろう。
現状はまだArmv9世代の存在をアナウンスしたという段階で、まだArmv9.0-Aが公開された訳ではない(少なくとも現時点ではまだデータシートは公開されていない)が、すでにOEMの一社とは話し合いをしているという話であり、もうちょっとすると色々情報が出てくるかもしれない。今年のDevSummitではこのArmv9が焦点になりそうだ。