TrustZoneの概要
TrustZoneはCortex-Aシリーズの拡張機能で、大規模OSやアプリケーションが動作するノーマルワールドとセキュリティ関連が動作するセキュアワールドを導入しており、ノーマルワールドメモリ空間(ノーマルワールドが動作するメモリ空間)とセキュアワールドメモリ空間(セキュアワールドが動作するメモリ空間)の分離が可能です。
ノーマルワールドの特権モードで設定変更ができないレジスタは、セキュアワールドの特権モードで設定を行い、リセット例外発生時は、セキュアワールドの特権モードで動作を開始するので、ノーマルワールドとセキュアワールドの理解が必要になります。ノーマルワールドとセキュアワールドの切り替えを行う場合、セキュアモニタモードを使用します。
ノーマルワードとセキュアワールドの切り替え
ノーマルワールドとセキュアワールドの設定は、SCR(セキュア構成レジスタ)のNSビットで行います。ワールド間の切り替えは、SMC(セキュアモニタコール)命令またはIRQ、FIQ、外部アボートを用いてセキュアモニタモードで設定可能です。尚、セキュアワールドでSCRのNSビットを書き換え、ノーマルワールドに切り替えることは非推奨です。
アドレス空間の分離
ノーマルワールドメモリ空間とセキュアワールドメモリ空間は、Armプロセッサコアから出力されるAxPROT信号とTZPC(トラストゾーンプロテクションコントローラ)を使用してメモリ空間を分離できます。ノーマルワールドメモリ空間とセキュアワールドメモリ空間のサイズは、それぞれ4Gバイトの空間です。セキュアワールドメモリ空間の0x8000番地とノーマルワールドメモリ空間の0x8000番地は、別アドレス空間として扱います。セキュアワールドはセキュアワールドメモリ空間とノーマルワールドメモリ空間へのアクセスができますが、ノーマルワールドはノーマルワールドメモリ空間にしかアクセスできません。
TrustZoneの設定
メモリ空間の設定方法
セキュアワールドメモリ空間とノーマルワールドメモリ空間の設定は、MMU(第12回参照)の第1レベル記述子のNSビットで設定します。ページテーブルの場合は3ビット、セクションおよびスーパーセクションの場合は19ビットで設定します。“NS=1”の場合はノーマルワールドメモリ空間、“NS=0”の時はセキュアワールドメモリ空間となります。
MMUの設定
レジスタが自動的に切り替わることをバンク化と言います。一部のレジスタは、SCRのNSビットの状態により自動的に切り替わります。例えば、SCTLR(システム制御レジスタ)やMMUの設定レジスタ(TTBR0/TTBR1/TTBCR/DACR)は、バンク化されるのでワールドごとに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(バイナリポイントレジスタ)
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 | × | × | × | × | モニタ | 禁止 |
名称 | 設定値 | 内容 |
---|---|---|
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割り込みが発生した場合、モニタモードに遷移。 |
こちらも是非
“もっと見る” Cortex-A編
初期化処理
リセット例外からmain()関数を呼び出すまでの初期化は、ユーザが作成する部分とArmコンパイラが実行する部分に分けることができます。コードのコピーや初期化変数/未初期化変数の初期化は、リンカのメモリ配置設定を処理系ライブラリが実行します。
PMU(パフォーマンス監視ユニット)
PMUに関連するレジスタは、ユーザモードでのアクセスは禁止されていますので、PMUSERENR(ユーザイネーブルレジスタ)を特権モードでユーザモードアクセス許可を設定します。PMUSERENRについては、 後述の該当項目を参照ください。
NEONコプロセッサ
NEONコプロセッサは、リセット時に無効化されるため、初期化処理でアクセス権設定と稼働設定が必要です。NEONコプロセッサが無効状態でNEON命令を実行した場合、「未定義命令例外」が発生します。