写真提供:マイナビニュース

写真拡大

●ARMv8-Mはこれまでと何が違っているのか?
「ARM TechCon 2015」の基調講演では「ARMv8-M」について、専ら「Trust Zone」を中心に紹介したが、実際はもう少し広範にわたる変更があるので、順を追って説明したい。

現在のCortex-Mシリーズの場合、Cortex-M0/M0+/M1がARMv6-M、Cortex-M3/M4/M7がARMv7-Mということで2種類のアーキテクチャが混在している。もっともARMv6-Mは、ARMv7-Mから「不要なものを削ぎ落として簡潔にした」という方が正確で、その意味ではARMv6-MはARMv7-Mのサブセット的な位置づけにある。実際ARMv6-Mの命令は57個に留まっており、他に

・特権命令、SysTick Timer、Halt Debug Support、MPUはImprement Option
・外部割込みは32まで、Priotiry Levelは4つまで
・メモリアクセスはAligmnetのみ(Unalignアクセスは未サポート)
・排他アクセスは未サポート

といった制約が付いている。逆に言えば違いはこれだけとも言える。Photo01で言えば、ARMv6-Mが利用できる命令は左下の緑の部分のみで、ARMv7-Mになると水色にまで命令が増え、さらにDSP/FPUを利用するとピンク/オレンジの命令が利用できる様になる訳だが、緑の部分に関しては完全に共通で下位互換性は保たれており、なのでCortex-M0/M0+とCortex-M4のコアを利用して製品ラインアップを展開しても「命令セットは共通」といった売り方が可能であった。

ただやはりこれはわかりづらいと思ったのか、ARMv8-Mでは、新たにBaselineとMainlineという2種類の命令グループが定義された(Photo02)。少なくともこれで世代的には完全にARMv8-Mで統一されたことになる。ではこのARMv8-Mは後述するTrustZone以外になにが違うか? というのがPhoto03だ。

ハードウェア除算や、Compare and branch、排他アクセスなど随分さまざまな命令が追加された。Wide immediate movesでは16bitの即値のハンドリング命令(MOVW/MOVBT)が追加されるとか、排他アクセスではC11 atomic変数のサポート命令が追加されるなど、命令数的にも結構増えている。ただし、Compare and branchとか排他制御、ハードウェア除算などに関してはARMv7-Mではすでにサポートされていた内容である。

ちなみにここに出ていない項目として、サポートされる外部割込み数が増えるとか、デバッグ機能が拡充されているなどの機能もあり、またこれとは別に後述のPMSA v8やTrustZoneなども利用できるので、先の命令セットとあわせて、全体的に性能の底上げが図られているのが特徴だ。

ではMainlineの方は? というと、こちらはBaselineの機能をすべてサポートした上で、最大で40%の性能改善に繋がる追加命令、それにDSP/FPUのサポートが追加されている(Photo04)。

ちなみにBaseline/Mainlineとも、PMSA(Protected Memory System Architecture) v8に基づくMPU(Memory Protection Unit)がサポートされる。Baselineでもサポートが追加されるのは、後述するTrustZoneの絡みでMPU無しという訳にはいかなくなったからだ。PMSA v8では、ついに32バイト単位で任意の大きさの領域を指定できるようになっている(Photo05)。

●ARMv8-MのTrustZoneは従来のものとは何が異なるのか?
さて、次が基調講演でも出てきたTrustZoneの話になる。基本的には既存のTrustZoneと同じ「コンセプト」である(Photo06)。具体的に言えば、ARMv8-Mでは「Secure Mode」と「Non Secure Mode」という2つの動作モードが新たに設けられた。もっともこのSecure Modeを設けるにあたり、追加されるリソースは本当に最小限である。例えばレジスタ類を新設することすらしていない。ではこれでどうやってTrustZoneを実現できるのか?。

まずプログラマから見たメモリマップがPhoto08である。これはNon Secure Modeから見た構図であるが、セキュアな領域はMPUによって保護されるので、「基本」アクセスが一切出来ないことになる。

一方、Secure ModeにおいてはこのSecure Unitにアクセスが可能である。「基本」と書くのは例外があるからで、Photo09の赤い部分は、NCU(Non-Secure Callable)と定義される。NCUはおおむね、簡単なエントリポイントなどが置かれる程度のものだが、要するにNormal StateからSecure Stateを呼び出す際に利用される領域として定義される。

さて、もう少し先に進んでみる。Non Secureで稼働中にThread→Handler、あるいはHandler→Secureの遷移はこれまでと同様だし、Secureで稼働中も同じである。ではNon Secure Thread中にSecureなインタラプトが入った(あるいはSecure Thread中にNon-Secureなインタラプトが入った)らどうなるか、がPhoto10となる。扱いとしてはARMv7-MのException Handlingと同じ仕組みとすることである。遷移の際にかならずZero Clearするのは、これによるSnoopの可能性を抑えるためである。

ちなみにSecureかNon Secureかの区別は、基本的にはアドレスベースでの管理となる。これを管理するのが(Photo09のキャプションにも出てきている)SAUで、ここがメモリ領域ごとにSecureかNon Secureかの情報を格納している(Photo11)。なので、Non Secure StateのアプリケーションがSecureなアドレスにアクセスしようとすると、Memory Faultを発生する形でSecureが担保される。ちなみにBranch/CallでSecure Addressをアクセスしようとした場合は、新しく追加されたSecure Fault(Exception Number 7)が発生する形だ。

このあたりをもう少し見やすくしたのがPhoto12で、Secure State/Non Secure-State、Secure Address/Non-Secure Addressは完全に分離されており、唯一NSCの領域でのみ両者がアクセスできる事になる。もっとも分離されているといっても、お互いの呼び出しは自由に可能である(Photo13)。Thread同士で呼び出す場合はこんな具合だ(Photo14)。この場合呼び出されたSecure Thread側はまずSGでSecure Modeに切り替わり、その後Secure Codeを実行、最後にBXNSでNon-Secure Modeに戻る形になる。ちなみにExample(Photo15)などにはまだ具体的なコード記述の仕方などが示されていないが、恐らくPhoto10と同じように、BXNSを呼び出す前に(戻り先と戻り値以外の)RegisterはZeroクリアするような作法が入るのではないかと思われる。

ちなみにARMv8-Mの場合、TrusuZoneをインプリメントしないとNon-Secure Modeで起動するが、インプリメントした場合は無条件でSecure Modeでの起動となる。なのでアプリケーションもSecure ModeでSystem Startを記述する必要がある(Photo16)。

●ARMv8-Mとあわせて発表された「AMBA 5 AHB」
最後に、基調講演では一切触れられなかったが「AMBA 5 AHB」の話を。ARMv8-Mとあわせて発表されたのがAMBA 5 AHBである。Cortex-A35の記事でも少し触れたが、端的に言えばAMBA 3 AHBにTrustZone対応を付加した様な構成になっている。また、ARMは大きくは取り上げていないが、マルチコア構成に最低限必要となるMulti-Core Synchnonizationの仕組みが統合された(Photo17)。

なぜこれが必要になったかといえば、CPUコアに繋がる周辺回路も、当然Secure/Non-Secureをきちんと認識し、例えばSecure FlashはNon-Secureでアクセスできないようにしてやる必要がある。ただFlashそのものはSecureだろうがNon-Secureだろうが構造に違いがないので、バスの側で「これはSecure Access」「これはNon-Secure Access」と周辺回路に通知することで、周辺回路がどちらのアクセスかを認識できる様になっている。具体的に言えば、新しくHNONSECという信号が追加されており、これがAssertされているとNon-Secure、NegateされているとSecureという形になる。実際にはこのHNONSEC以外にもいくつか追加があるが、要するに周辺回路に対してもSecure Modeをちゃんと徹底させないとSecureなSoCが出来ない訳で、そのために設けられたと思ってよい。

ちなみに今回の発表はあくまでもアーキテクチャであって製品ではない。では、例えばアーキテクチャライセンスを受けて自社で実装するメーカーはありえるのか? と尋ねた所「もちろん我々はアーキテクチャライセンスも提供可能だが、興味を持っている会社は1社もない」(Nandan Nayampally氏)との事で、今は各社ともこれを実装したIP待ちとのこと。またこれを実装した製品は、既存の製品とは名称を変えるという話(例えばCortex-M0++とかCortex-M4+とかにはならない)であった。実際命令セットもこれだけ違うと、流石に同一製品の派生型として扱うには無理があるだろう。

気になるのは、TrustZoneはConfiguration Optionという話であったが、このOptionは例えば起動時にTrustZone Enable/Disableを選べるのか、それとももう製造レベルのOptionで、一度TrustZone Enableで製造したコアはDisableには出来ないのか、また機会があったら確認してみたいと思う。

(大原雄介)