TrustZone(セキュリティ拡張機能)

TrustZoneの概要

TrustZoneはCortex-Aシリーズの拡張機能で、大規模OSやアプリケーションが動作するノーマルワールドとセキュリティ関連が動作するセキュアワールドを導入しており、ノーマルワールドメモリ空間(ノーマルワールドが動作するメモリ空間)とセキュアワールドメモリ空間(セキュアワールドが動作するメモリ空間)の分離が可能です。

ノーマルワールドの特権モードで設定変更ができないレジスタは、セキュアワールドの特権モードで設定を行い、リセット例外発生時は、セキュアワールドの特権モードで動作を開始するので、ノーマルワールドとセキュアワールドの理解が必要になります。ノーマルワールドとセキュアワールドの切り替えを行う場合、セキュアモニタモードを使用します。

図1

ノーマルワードとセキュアワールドの切り替え

ノーマルワールドとセキュアワールドの設定は、SCR(セキュア構成レジスタ)のNSビットで行います。ワールド間の切り替えは、SMC(セキュアモニタコール)命令またはIRQ、FIQ、外部アボートを用いてセキュアモニタモードで設定可能です。尚、セキュアワールドでSCRのNSビットを書き換え、ノーマルワールドに切り替えることは非推奨です。

図2

アドレス空間の分離

ノーマルワールドメモリ空間とセキュアワールドメモリ空間は、ARMプロセッサコアから出力されるAxPROT信号とTZPC(トラストゾーンプロテクションコントローラ)を使用してメモリ空間を分離できます。ノーマルワールドメモリ空間とセキュアワールドメモリ空間のサイズは、それぞれ4Gバイトの空間です。セキュアワールドメモリ空間の0x8000番地とノーマルワールドメモリ空間の0x8000番地は、別アドレス空間として扱います。セキュアワールドはセキュアワールドメモリ空間とノーマルワールドメモリ空間へのアクセスができますが、ノーマルワールドはノーマルワールドメモリ空間にしかアクセスできません。

図3

TrustZoneの設定

メモリ空間の設定方法

セキュアワールドメモリ空間とノーマルワールドメモリ空間の設定は、MMU(第12回参照)の第1レベル記述子のNSビットで設定します。ページテーブルの場合は3ビット、セクションおよびスーパーセクションの場合は19ビットで設定します。“NS=1”の場合はノーマルワールドメモリ空間、“NS=0”の時はセキュアワールドメモリ空間となります。

図4

MMUの設定

レジスタが自動的に切り替わることをバンク化と言います。一部のレジスタは、SCRのNSビットの状態により自動的に切り替わります。例えば、SCTLR(システム制御レジスタ)やMMUの設定レジスタ(TTBR0/TTBR1/TTBCR/DACR)は、バンク化されるのでワールドごとにMMUの設定が必要です。

【MMU関連レジスタ】
No レジスタ名 機能概要
1 SCTLR 命令およびデータキャッシュ、MMUなどの稼働設定。
2 TTBR0(変換テーブルベースレジスタ0) 変換テーブル0アドレスを設定。
3 TTBR1(変換テーブルベースレジスタ1) 変換テーブル1アドレスを設定。
4 TTBCR(変換テーブルベースレジスタ) 変換テーブルウォークのベースアドレスがTTBR0/TTBR1を選択。
5 DACR(ドメインアクセス制御レジスタ) 16個のメモリドメインのアクセス許可を定義。

キャッシュの設定

キャッシュのラインには、ノーマルワールドメモリ空間とセキュアワールドメモリ空間を判別するNS属性が追加されています。Cortex-A9の場合、リセット時にキャッシュの無効化をソフトウェアで設定するので、ノーマルワールドメモリ空間とセキュアワールドメモリ空間の無効化が必要です。

例外機能の設定

GIC(汎用割り込みコントローラ)は8ビット優先度フィールド、セキュアワールドは32レベル優先度の割り込み優先度、ノーマルワールドは16レベルの優先度を持っています。優先度の高い上位16レベルの優先度設定は、ノーマルワールドでは使用できません。例外処理の呼び出しは、デフォルト設定ではセキュアワールドの例外処理が呼び出されます。割り込みIDごとに、CDISRn(割り込みセキュリティレジスタ)で例外処理を行うワールドを設定します。割り込み優先度は、関連する全ての優先度レジスタに適用されます。

  • ●ICDIPRn(優先度レベルレジスタ)
  • ●ICCPMR(優先度マスクレジスタ)
  • ●ICCBPR(バイナリポイントレジスタ)
図5

TrustZoneが使用された場合、例外が発生した場合の例外処理は、SCRの設定によって動作が異なります。

【セキュア時の動作設定】
例外要因 SCR 動作モード CPSR.F(FIQ割り込み)
EA IRQ FIQ
リセット例外 × × × スーパバイザ 禁止
未定義命令例外 × × × 未定義 変更なし
SVC(スーパバイザコール) × × × スーパバイザ 変更なし
SMC × × × モニタ 禁止
すべての外部アボート 0 × × アボート 変更なし
1 × × モニタ 禁止
すべての内部アボート × × × アボート 変更なし
IRQ割り込み × 0 × IRQ 変更なし
× 1 × モニタ 禁止
FIQ割り込み × × 0 FIQ 禁止
× × 1 モニタ 禁止
【非セキュア時の動作設定】
例外要因 SCR 動作モード CPSR.F
EA IRQ FIQ AW FW
リセット例外 × × × × × スーパバイザ 禁止
未定義命令例外 × × × × × 未定義 変更なし
SVC × × × × × スーパバイザ 変更なし
SMC × × × × × モニタ 禁止
すべての外部アボート 0 × × 0 × アボート 変更なし
0 × × 1 × アボート 変更なし
1 × × × × モニタ 禁止
【SCRレジスタ設定概要】
名称 設定値 内容
AW 0 CPSR.Aビットは、セキュア状態でのみ変更。
1 CPSR.Aビットは、任意のセキュリティ状態で変更。
FW 0 CPSR.Fビットは、セキュア状態でのみ変更。
1 CPSR.Fビットは、任意のセキュリティ状態で変更。
EA 0 外部アボートをアボートモードで処理。
1 外部アボートをモニタモードで処理。
FIQ 0 FIQ割り込みが発生した場合、FIQモードに遷移。
1 FIQ割り込みが発生した場合、モニタモードに遷移。
IRQ 0 IRQ割り込みが発生した場合、FIQモードに遷移。
1 IRQ割り込みが発生した場合、モニタモードに遷移。