ARM、組み込み向けプロセッサ「Cortex-M7」やmbed OSのセキュリティ機能を解説
英ARMは、Cortex-A72の詳細情報などと合わせて、組み込み系プロセッサやmbed OSなどについても情報のアップデートを行った。ここでは、それらをいくつかまとめて紹介する。
○組み込み向けのハイエンドプロセッサ「Cortex-M7」
ARM系のプロセッサは、大きくアプリケーションプロセッサ、組み込み系、リアルタイム系と分かれていて、前回紹介したCortex-A72は、アプリケーションプロセッサの1つ。このクラスは仮想記憶や仮想マシン、情報保護といった機能を備え、高度な機能を持つOSと組み合わせてスマートフォンやタブレットなどに使われる。
これに対して組み込み向けはCortex-M系列のプロセッサが対応する。このクラスは仮想記憶などを行うMMU(メモリ管理ユニット)がなく、命令体系もシンプルものになっている(Thumb-2 短縮命令セット)。
わずか0.08ミリ角になるCortex-M0から、スーパースケーラー構造で浮動小数点演算も可能なCortex-M7まで5種のプロセッサをそろえる。このうち、Cortex-M7は、組み込み向けの「ハイエンド」プロセッサ。
プロセッサのおおまかな構造は(図2)のようになる。
PC用などの一般的なプロセッサで見慣れないのが「TCM:Tightly Coupled Memory」だ。これは、プロセッサ外部に置くスタティックメモリ(同期SRAMを最大16メガバイトまでサポート)で、命令コード用(64bit幅)とデータ用(32bit幅×2、アドレスの下位3ビット目で切り替え)がある。
組み込み系では、プログラムの格納にフラッシュメモリを使うことが多いが、その読み書きの速度に対して、組み込み系のプロセッサは高速になりつつある。以前は、プログラムはNOR型フラッシュ、データストレージはNAND型といった使い分けもあったが、速度が出ないNAND型のみが大容量化したためにコストが下がったという状況もある。
高速なプロセッサであるCortex-M7ともなれば、そのメモリとの速度差はかなり大きくなる。そこで、割り込みなど高速に対応するプログラムや必要なデータなどをTCMに置いておき、必要に応じて利用するわけだ。また、TCMは設定でメモリ空間に割り当てることができるため、見かけ上はプログラムやデータへのアクセスが高速化したようになり、アクセスに専用の命令を使う必要もない。
ただし、事前にプログラムやデータをTCMに入れておくという処理は必要となる。また、TCMに使うSRAMが不揮発性の場合、ここから起動する機能もあるようだ。
TCMはオプションの機能ではあるが、Cortex-M7を高いクロックで実行させる場合には重要となるだろう。一般に組み込み系では、フラッシュメモリなどに書き込まれた命令やデータをメインメモリに展開して実行する(アプリケーションプロセッサなどはこのようにして高速なメインメモリをアクセスする)ことはあまり行われない。
その理由としては、電源オンやリセット後のシステム起動の仕組みが複雑になり時間がかかること、メインメモリ量が増えコストが上がることに加えて、用途によってはノイズによる影響の可能性や、メモリが書き換えられてしまうというセキュリティ的なリスクなども挙げられる。
ただし、Cortex-M7はTCMのほか、オプションで命令用やデータ用のキャッシュを装備することも可能だ。キャッシュの場合、初回にメモリからキャッシュに取り込む時間はかかるが、1回キャッシュに入ってしまうと、高速化が期待できる。
組み込み系では、あまり大きなプログラムを使うことはないため、使い方に対して適切なキャッシュを装備することで、フラッシュメモリとの速度差の問題はある程度防ぐことができる。
また、キャッシュの場合、TCMのように事前にプログラムやデータをロードしておく必要はない。
○Cortex-M7のさらなる詳細
さて、肝心のCortex-M7のパイプラインだが、(図4)のようになる。フェッチされた命令はInstraction Buffer(写真左端のグレーのボックス)、Instruction Decorder、Intenger Register Fileを経て、9つの実行ポートへと発行される。
実行ポートは、
2つの32bitロードパイプ
2つの整数演算ALUパイプ
積和パイプ
ストアパイプ
ブランチ
浮動小数点用演算パイプ
浮動小数点、乗算、除算、ルートパイプ
となっている。2つの32bitロードパイプは、組み合わせて使うことで64bitデータのロードに対応できる。また、2つの整数演算パイプは、それぞれ構造が異なり、シフトと演算が別ステージになっているものと、1ステージ分処理を遅らせてシフトまたは演算のどちらかを行うものになっている。これはロード命令と組み合わされる演算命令の処理を考慮したものだ。
メモリからロードされたデータは、レジスタファイルへの書き込みとは別のパスを使って整数演算パイプに渡すことができ、このとき、1ステージずらした演算パイプだと、パイプラインをストールせずに演算に入ることができる。
また、浮動小数点命令も開始を1ステージずらしてあり、ロードして演算という命令の組み合わせに対応できる。浮動小数点演算は、加算などの単純演算用と乗算、除算、ルート演算用の2つに分かれており、浮動小数点の積和演算の場合には2つのパイプをつなげて演算を行う。倍精度浮動小数点演算も可能だが、Cortex-M7は、単精度浮動小数点演算に最適化されている。
なお、Cortex-M7は、スーパースケーラー構造だが、実行はインオーダーで、特定の条件(整数演算と浮動小数点演算など)でのみ2命令を同時に発行できる。整数演算などは4ステージ、ストアや浮動小数点パイプは5ステージとなっている。
Cortex-M7は、組み込み系にしては「リッチ」な内部構造を持つも、回路構成からするとかなり高速で、逆にフラッシュメモリとの速度差が大きく、この点ではTCMなどを使わないと高速化できないことがある。
用途としては、ディスプレイを備え、タッチ操作や音声操作などが可能なものや、通信機能を持つもの、多数のモーターなどを同時制御する組み込み機器などが想定されている。家庭内でいえば、高性能な白物家電などが相当する。
また、映像関連の組み込み機器(テレビやレコーダー)は、もはやCortex-Aの領域だが、オーディオ機器などのほか、工作機械や自動車の機能モジュール、ドローンといった、ある程度の性能が要求されるが高性能なOSを動かさない組み込み機器もCortex-M7の対象となる。
組み込み機器でも年々、プロセッサに求められる性能は上がっており、IoTではさらに多数の組み込み機器が登場することを考えると、高性能なものはM7が使われることになると想定されている。
●mbed OSのセキュリティ
○mbed OSのセキュリティ
続いてはmbed OSのセキュリティについて。ARMは、2014年11月に米国で開催したTechConで、IoTデバイスのための組み込みOSであるmbed OSを発表した。これは現在開発中で、特定開発者向けのプレビューが行われているところだが、2015年11月のTechConのタイミングで、Ver.3.0として正式公開される予定だ。
mbed OSはイベント駆動型のOSで、基本はオープンソース(一部、外部ライセンスなどの関係でバイナリ提供のみになる部分を含む)だ。また、IoT向けの通信スタックを持ち、さまざまな物理層の上で複数のIoT向けのプロトコルが利用できる。
インターネット接続が可能な機器と通信可能な無線LANといったの汎用的な物理層を持つ機器や、BluetoothなどでスマートフォンやPCを中継に利用できる機器が構築可能だ。
こうしたIoT機器の管理用にARMは、mbed Device Serverを用意している。こちらは、Linuxなどの汎用OSの上で動作する。今回のアップデートでは、これらに対して、Linuxなどの上で動作し、mbed OSアプリケーションを実行可能なmbed Clientが加わった。
これは、LinuxやリアルタイムOSなどの上でmbedアプリケーションを実行可能なライブラリ、ランタイムのようなもの。これを使うことで、既存のLinuxなどを使った組み込み機器をmbed対応とすることも可能になる。また、mbed Device Serverと接続が可能であり、mbed OS機器と合わせて同じように管理が可能だ。
ARMは、IoTの時代では、組み込み系のセキュリティが重要であるとし、mbed OSに組み込まれたセキュリティ機能の説明を行った。簡易なリアルタイムOSなどを使ったこれまでの組み込み系アプリケーションは、通信関連の機能をアプリケーション内に含んでいるため、開発者のノウハウや技量がセキュリティ強度に大きく関係しており、一部の開発者だけが高度なセキュリティを実現できていたという。
これに対してmbed OSは、通信部分をOS内に持つだけでなく、暗号化や暗号化通信などの機能を持つ。これにより、アプリケーション側は、セキュリティ関連のコードを開発したり、他社から購入して組み込む必要がなくなったという。
mbed OSを使った機器のセキュリティは、 「デバイス」自体のセキュリティ、「通信」のセキュリティ、そして、ファームウェアアップデートなどの「ライフサイクル」のセキュリティに分類できる。
「通信」に関するセキュリティは、mbed OSが備える通信機能と、TLS(Transport Layer Security。SSLをベースに定義されたプロトコル)のmbd TLSライブラリによって保たれる。
デバイスに関するセキュリティだが、mbed OSでは、「パブリック」部分と、外部からはアクセスできない「プライベート」部分が分離されているため、従来の組み込み系デバイスに比べると攻撃に対する耐性が高い。
mbed OSでのセキュリティは、内部にある「μvisor」が制御を行う。ハードウェアには、「特権アクセス制御」(特権を持つコードのみがアクセスできる)、メモリ分割(他のプログラムからアクセスできないメモリ領域を作る。ただし、メモリ保護ユニットはハードウェアオプションであるため、これを持たないプロセッサもある)、暗号化ハードウェア(構成による)などがあり、μvisorがこれを利用してプライベート領域を保護する。μvisorは、割り込みの応答速度などを考慮し、低遅延でシステム負荷が高くならないように作られている。
また、mbed OSは、このμvisorを利用して、安全な「鍵」保管領域や暗号化機能、乱数発生などの機能を提供している。これにより、デバイス自体のデッドコピーを防ぎ、サーバーなどから受け取るセキュリティ関連の情報(アクセストークンなど)を保護する。また、通信に利用するTLS関連の機能もμvisorにより保護される。
さらに、IoTではソフトウェアの複雑化から、ユーザーによるファームウェアアップデートが不可避だとして、フラッシュメモリのアップデートに対するセキュリティ機能を持つ。これは、mbed Device Serverと組み合わせて行われる「ライフサイクル」のセキュリティだ。
mbed OS側には、フラッシュアップデートセキュリティレイヤーがあり、電子署名のあるコードのみを受け付ける。また、こうしたアップデート作業は、mbed device Serverが管理を行う。mbed Device Serverは、デバイス制御のアプリケーションとIoTデバイスの間に入ることで、セキュリティを確保する。mbed Device Serverには、webインターフェース(HTTPSサーバー機能)があり、エンドユーザーアプリ、JavaSDKにより開発されたアプリやユーティリティなどは、ここに接続してmbed Device Server経由でデバイスを管理する。
高性能なシステムで実行されるmbed Device Serverであれば、セキュリティの負荷は問題にならない。mbed Device Serverは、mbed OS搭載デバイス(IoTデバイス)とは、データグラムTLS(UDPなどのデータグラム型プロトコル上のTLS)を使うCoAPトランスポート(Constrained Application Protocol:機械同士の通信を想定したHTTPを簡易化したプロトコル)を利用する。
mbed OSは、2015年11月に正式出荷予定だが、すでに特定開発者向けのプレビューは開始されている。いまのところ、まだmbed OSを搭載したIoTデバイスは登場していおらず、当初は開発ボードのみだろうが、2016年ぐらいからは、搭載製品が登場するのではないかと考えられる。ただ、mbed OSの対応範囲は多岐にわたるため、必ずしもコンスーマー製品とは限らず、目にする機会も少ないかもしれない。