はじめに
Google Tensor G1/G2については、下記のようにこのブログでも書きました。
Google Tensor G1/G2
- X1 の周波数が、2.8GHz => 2.85G
- A76@2.25GHz => A78@2.35GHz
- GPU : Mali-G78MP20 => G710MP07
- ISP : 8bit => 10bit
- DSP の追加
- Edge TPU が新しくなった?
Google Tensor G1のベースとなったSoCは、Samsung Exynos2100 です。Exynos2100の仕様は、
- CPU : Cortex X-1 x 1@2.9GHz + A78 x 3@2.8GHz + A55 x 4 @ 2.2GHz
- GPU : Mali G78 MP14
- NPU x 3 + DSP AI Engine
CPUの構成は、G2と似ていますね。GPUはコア数はちょっと少ない感じです。
G1/G2のAndroid Kernelおよび各種デバイスドライバの調査
G1/G2のAndroid Kernelおよび各種デバイスドライバの調査から、
というものがあることが分かりました。
EdgeTPUは、ISPだけでなく、AOC(Audio関係、Input/Output) にも接続しています。G2では、DSPにも繋がっています。
また、gsa (Google Security Anchor) なるデバイスドライバがあり、EdgeTPU/AOC はこの gsa 経由でアクセスされています。
Trusty
なんで、gsa 経由になるかというと、G1 & Android 12 では、Trusty OS が使われていて、この Trusty を使っているのが gsa です。gsa にて、TrustZone にアクセスしています。
下図は、上記のサイトから説明のために引用します。どうやら、下記のような感じで、Trusty OS 側で何かをやってるんじゃないかな?と思っています。
上の図にあるように、AndroidからTrustyOSへのアクセスは、trusty device driver 経由で行います。trusty device driver の中では、smc にて、ATF Runtime 31 に入り、その中から TrustyOS にアクセスしているんじゃないのかな?と思っています。
Trusty Dispatcher については、Arm Trusted Firmware の中にありました。
このドキュメントによると、NVIDIA's Tegra SoC で Trusty を検証しているということなので、探してみましょう!
実装は、services/spd/trusty にありました。
下記のように、Pixel 6 が出たときに、Pixel 6 / 6 Pro & Android 12で何が変わったのかの説明をブログにて解説していますね。
Trusty OS (TOS) パーティションなる説明があります。
TrustyOS そのものは、ここにあるものでしょうか?
Pixel 6 Pro の dmesg がここに載っています。
Android Virtual Framework
Android 13 からAndroid Virtual Framework なるものというものが導入されました。下図はAndroid Virtual Frameworkのサイトから説明のために引用します。
図の右側のpVMの説明
protected virtual machine(pVM)にて、メインの Android オペレーティング システム(「ホスト」)の隣で実行される、相互に信頼されていない隔離された実行環境(「ゲスト」)。pVM は pKVM で管理されます。 既存の高信頼実行環境(TEE)と比較すると、pVM は Microdroid と呼ばれるミニ Android ディストリビューションを含むリッチな環境を提供します。pVM は動的に使用でき、そこではサポート対象のすべてのデバイスで標準の API セットが提供されます。
AVF 対応アプリは、2 つの部分(ホストの Android OS 上で実行されるアプリ部分と pVM 内の Microdroid 上で実行されるアプリ部分)で構成されています。 Android 上で実行されるアプリ部分は、ユーザー インターフェース、機密性のないビジネス ロジックを実装し、pVM のライフサイクルを作成、管理します。 Microdroid 上で実行されるアプリ部分は、pVM 内で、安全に実行する必要があるすべてのタスクを実行します。
サンプルコードでは、下記の図(説明のために引用します)にあるように、Androidアプリ側でpVMで実行するコードをpVMにて実行します。pVM側ではAndroidアプリからの通信待ちになり、何かが来たら処理し結果を返すような感じになっています。
Virtualization のソースコードは、ここ にあります。
pvmfw のメインコードは、下記のようにRust で書かれています。
//! pVM firmware. #![no_main] #![no_std] mod console; mod psci; mod uart; use core::panic::PanicInfo; use psci::{system_off, system_reset}; /// Entry point for pVM firmware. #[no_mangle] pub extern "C" fn main() -> ! { console::init(); println!("Hello world"); system_off(); #[allow(clippy::empty_loop)] loop {} } #[panic_handler] fn panic(info: &PanicInfo) -> ! { eprintln!("{}", info); system_reset(); loop {} }
vm も Rust で書かれています。
Microdroid は pVM で動作する小型の Android OS です。Microdroid を使用する必要はなく、VM は任意の OS で起動できます。しかし、pVM の主なユースケースはスタンドアロン OS を実行することではなく、Android が提供するよりも優れた機密性と整合性が確保されるアプリの一部を実行するための分離された実行環境を提供することです。
基本的には、VMで起動されるものは上記にあるように、Androidアプリがセキュリティを高めるためにVMとして実行した方がいいものをです。
Microdroid は以下をサポートしていません。
- android.* パッケージの Android Java API (注: java.* パッケージのコア Java API は、VM で ART APEX を有効にすることでサポートされます。)
- SystemServer と Zygote
- グラフィック / UI
- HAL
この機能を使って、Linux (Ubuntu など) や Windows 10が動いているという報告もあります。
この機能は、現状では、Pixel 7 と 6 、つまり、Google Tensor G1/G2 搭載のものに限定されてはいます。
スライド : Android Virtualization Framework
おわりに
Google Tensor G1/G2、スペック的には、Snapdragon 8/8+ Gen1やGen2、MediaTek Dimensity 9000 に比べてと、1世代ぐらい古いですが、Androidを開発している利点から新しい機能を入れ込んでくるのは面白いですよね。