Trusty は、Google による Trusted Execution Environment(TEE)OS の実装であり、Android で実行されます。これは ARM Trustzone テクノロジーで TEE を提供するための仕様です。ARM デバイスで Trusty をセキュアな OS ソリューションとして使用する場合は、この後の各セクションの説明に従ってブートローダーを実装します。
TOS の初期化
Trusty OS(TOS)を読み込んで初期化するには、ブートローダーが以下の処理を行う必要があります。
- 使用可能なすべての RAM を設定して構成する
- シリアルポートを少なくとも 1 つ初期化する
- TOS イメージの署名を確認する
- TOS を RAM に読み込む(フラッシュや TCM からの実行には対応していません)
- 以下で説明するように、状態とレジスタを設定した後、TOS イメージの最初の命令にジャンプする
TOS イメージの呼び出し
最初に次の状態を構成します。
- MMU をオフにする
- データ キャッシュをフラッシュしてオフにする(命令キャッシュはオンとオフのどちらも可能)
- すべての割り込み(IRQ と FIQ)を無効にする
- CPU を ARMv7 では SVC モード、ARMv8 では EL3 モードにする
- レジスタを次の状態にする:
r0/x0
: TOS に割り当てるメモリのサイズ。r1/x1
: プラットフォーム独自のブート パラメータを含むメモリの連続したブロックの物理アドレス。このブロックのレイアウトはプラットフォームによって異なります。r2/x2
: メモリの上記ブロックのサイズ。r14/x30
: TOS の初期化後に(非セキュアモードで)ジャンプするリターン アドレス。
64 ビット プラットフォームの場合、次のようになります。
- パラメータには
w0-w2
のみが使用されるため、x0-x2
には 32 ビット値のみを含めます。 x30
には 64 ビットの値を設定できます。x0
の値が TOS エントリ ポイントのベースアドレスに追加された場合、結果は 32 ビット値になります。x1
のブート パラメータ ブロックのアドレスに追加したときのレジスタ x2 のサイズについても同様です。
TOS から戻る
TOS の初期化が完了すると、TOS は非セキュアモードでブートローダーに戻ります(SCR.NS が 1
に設定されます)。それにより、ブートローダーは主たるオペレーティング システム(Android)の読み込みを続行できます。