建築學

在 AAOS 中支持 VirtIO 所需的大多數更改都涉及 Android 通用內核中 HAL 實現級別及以下的更改。 Android 框架使用 AAOS 來賓 VM 內核中的 VirtIO 驅動程序與通用的硬件無關 HAL 進行通信,該驅動程序使用 VirtIO 協議與主機端的 VirtIO 設備進行通信。主機端的 VirtIO 設備可以使用 SoC 特定的設備驅動程序訪問物理硬件。

VirtIO 驅動程序和 VirtIO 設備之間的通信是通過virtqueue進行的,它是分散聚集列表的類似 DMA 的環形緩衝區。多種傳輸方式,例如MMIOPCI ,可用於在 VM 之間交換 VirtIO 消息。

在某些情況下, vsock已被用於 VM 間通信。使用通過vsock接口連接到單獨 VM 上的對等代理來支持車輛 HAL、音頻控制和 Dumpstate 通信。 GRPC-vsock用於訪問這些非標準化子系統。 Android 源代碼樹中的GRPC已修改為與地址格式為vsock vsock:CID:PORT_NUMBER的 vsock 一起使用。

虛擬化架構
圖 1.虛擬化架構

圖形

當 AAOS 作為客戶 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問 GPU 或顯示控制器。在這種情況下,Android 客戶虛擬機和virtio-gpu設備上的Mesavirtio-gpu驅動程序可用於訪問 GPU。

在 Android 客戶 VM 上,Mesa 使用 Gallium3D 框架將著色器編譯為 TGSI 中間表示,並將 API 轉換為狀態對象。 Gallium3D 然後將編譯的狀態對象和繪圖調用提交給 Mesa Virgl,然後使用virtio-gpu作為傳輸協議將命令和著色器發送到主機 VM。

在主機端, virglrenderer接收virtio-gpu命令流並將該流轉換為 OpenGL ES 命令。它還將著色器從 TGSI 格式轉換為 GLSL 格式,然後在現有 GPU 驅動程序之上重放它們。

AAOS 參考平台trout目前僅支持具有 Vulkan 支持的 OpenGL ES,預計在未來的版本中。

圖形架構
圖 2.圖形架構

傳感器

當 AAOS 作為訪客 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問傳感器。在這種情況下,Android 客戶 VM 上的 Virtio-SCMI 驅動程序和主機 VM 上的 VirtIO-SCMI 設備用於訪問傳感器。 AAOS 虛擬化參考平台提供通用且與硬件無關的傳感器 HAL,可用於基於 ARM 的 SoC 訪問傳感器。

Sensor HAL 與 Linux Kernel IIO 子系統中的 IIO SCMI 驅動程序進行通信,該驅動程序使用ARM 系統控制和管理接口 (SCMI)規範提供的 SCMI 傳感器管理協議來發現和配置傳感器、讀取傳感器數據以及收到傳感器通知值變化。 IIO SCMI 驅動程序使用 VirtIO SCMI 驅動程序,它使用virtio-scmi規範中指定的 VirtIO 傳輸協議與主機 VM 上的 VirtIO SCMI 設備交換 SCMI 消息。 VirtIO SCMI 設備可以通過 SoC 特定的傳感器驅動程序直接訪問傳感器。

傳感器架構
圖 3.傳感器架構

傳感器 HAL 位置

使用 VirtIO SCMI 的傳感器 HAL 的參考實現位於device/google/trout/hal/sensors

傳感器 HAL 配置

Sensor HAL 可能需要修改從主機 VM 接收到的傳感器數據,以符合 Android 汽車傳感器坐標系。傳感器配置的架構可以在device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd中找到。

OEM 可以在sensor_hal_configuration.xml中提供傳感器配置,例如方向和位置,並將文件複製到/odm/etc/sensors//vendor/etc/sensors/ 。下面提供了一個示例傳感器配置:

<sensorHalConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude">
    <modules>
        <module halName="android.hardware.sensors@2.0-Google-IIO-Subhal" halVersion="2.0">
            <sensors>
                <sensor name="scmi.iio.accel" type="1">
                    <configuration>
<!-- Attribute rotate denotes if HAL needs to modify the sensor data to comply with //
        the Android car sensor coordinate system -->
                        <orientation rotate="true">
               <!-- Attribute map denotes the indexes of data in sensor data received -->
               <!-- Attribute negate denotes if data needs to be negated -->
                            <x map="0" negate="false"/>
                            <y map="1" negate="true"/>
                            <z map="2" negate="true"/>
                        </orientation>
                        <location>
               <!-- Attribute x, y, z denotes location of the sensor placement -->
                            <x>10</x>
                            <y>15</y>
                            <z>20</z>
                        </location>
                    </configuration>
                </sensor>
         </sensors>
        </module>
    </modules>
</sensorHalConfiguration>

聲音的

在虛擬化 AAOS 中,Android 來賓 VM 可以使用virtio-snd訪問音頻。 virtio-snd向 Android VM 提供虛擬化 PCM 設備,以便音頻 HAL 實現可以通過 TinyALSA 庫與虛擬化​​聲音設備交互。

默認音頻 HAL 實現位於 AOSP 中的/device/google/trout/hal/audio/6.0 。 OEM 可以針對他們的平台修改ro.vendor.trout.audiohal.{in,out}_period_{ms,count} 。 OEM 還可以通過覆蓋/device/google/trout/aosp_trout_common.mk.

音頻控制 HAL 管理 AAOS 中的音頻焦點。例如,當系統正在播放緊急聲音時,後台播放的音樂可能需要靜音。在這種情況下,音頻控制 HAL 會通知那些播放音樂的應用靜音。在虛擬化系統中,聲音可能來自其他虛擬機。在參考實現中,AAOS 來賓 VM 運行了一個音頻控制服務器守護進程,它使用GRPC-vsock接收來自其他 VM 的音頻焦點請求。宿主 VM 可以使用device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller向 AAOS 發送音頻控制請求。當libandroid_audio_controller持有音頻焦點時,它會繼續向 AAOS 發送心跳,直到焦點被釋放。

音頻架構
圖 4.音頻架構

藍牙

當 AAOS 作為訪客 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問藍牙控制器。在這種情況下,Android 來賓 VM 上的 VirtIO-Console 驅動程序和主機 VM 上的 VirtIO-Console 設備可用於打開虛擬 COM 端口並將 HCI 數據包發送到藍牙控制器並接收事件。此設計允許 Android 藍牙堆棧使用通用且與硬件無關的藍牙 HAL。主機 VM 可以處理特定於硬件的任務,例如藍牙控制器的初始化和固件下載。

藍牙實現基於下面的設計插圖。

藍牙架構
圖 5.藍牙架構

車輛 HAL

Vehicle HAL 實現由兩個組件組成:

  • 客戶。提供 Android 在虛擬化 AAOS 中使用的 API
  • 服務器。直接與硬件通信,例如車輛總線(或仿真器)。

在虛擬化中,VHAL 服務器在宿主 VM 上運行。 VHAL 客戶端和服務器通過GRPC-vsock進行通信(有關更多信息,請參閱device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto )。 OEM 可以通過覆蓋通信 API 來使用 GRPC 以外的不同傳輸協議。例如,請參閱device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp

擴展視圖系統

擴展視圖系統 (EVS) 用於顯示由後視和環視攝像頭捕獲的視頻。在虛擬化 AAOS 中,EVS 堆棧可以訪問來自使用 VirtIO-video 驅動程序的虛擬化 V4L2 流設備的視頻流。

車庫模式

有關詳細信息,請參閱什麼是車庫模式? .

進入和退出車庫模式由 Vehicle HAL 發送的AP_POWER_STATE_REQ屬性觸發。在虛擬化模式下,車庫模式是從主機端觸發的。主機 VM 應保持開機狀態,以便為 Android VM 提供虛擬設備,直到 Android 關機。主機 VM 上的 VHAL 服務器向 AAOS 來賓 VM 發送關閉信號。收到信號 VHAL 客戶端后,AAOS VM 進入 Garage 模式並開始發送心跳信號以保持主機 VM 處於活動狀態。

轉儲狀態

在為虛擬化 AAOS 生成錯誤報告時,包含主機 VM 信息是很有價值的,這樣開發人員可以更全面地了解系統。為此, trout參考實現實現IDumpstateDevice HAL,它通過GRPC-vsock收集主機 VM 信息。 tar 打包的主機虛擬機信息在錯誤報告中命名為dumpstate_board.bin ,而轉儲日誌位於dumpstate_board.txt中。

要配置要執行的命令:

  1. 將以下文件中的配置詳細信息複製到 XML 文件中,例如config.xml
    <dumpstateHalConfiguration version="1.0">
        <services>
            <service name="coqos-virtio-blk"        command="/bin/journalctl --no-pager -t coqos-virtio-blk"/>
            <service name="coqos-virtio-net"        command="/bin/journalctl --no-pager -t coqos-virtio-net"/>
            <service name="coqos-virtio-video"      command="/bin/journalctl --no-pager -t coqos-virtio-video"/>
            <service name="coqos-virtio-console"    command="/bin/journalctl --no-pager -t coqos-virtio-console"/>
            <service name="coqos-virtio-rng"        command="/bin/journalctl --no-pager -t coqos-virtio-rng"/>
            <service name="coqos-virtio-vsock"      command="/bin/journalctl --no-pager -t coqos-virtio-vsock"/>
            <service name="coqos-virtio-gpu-virgl"  command="/bin/journalctl --no-pager -t coqos-virtio-gpu-virgl"/>
            <service name="coqos-virtio-scmi"       command="/bin/journalctl --no-pager -t coqos-virtio-scmi"/>
            <service name="coqos-virtio-input"      command="/bin/journalctl --no-pager -t coqos-virtio-input"/>
            <service name="coqos-virtio-snd"        command="/bin/journalctl --no-pager -t coqos-virtio-snd"/>
            <service name="dumpstate_grpc_server"   command="/bin/journalctl --no-pager -t dumpstate_grpc_server"/>
            <service name="systemd"                 command="/bin/journalctl --no-pager -t systemd"/>
            <service name="systemctl"               command="/bin/systemctl status"/>
            <service name="vehicle_hal_grpc_server" command="/bin/journalctl --no-pager -t vehicle_hal_grpc_server"/>
        </services>
        <systemLogs>
            <service name="dmesg" command="/bin/dmesg -kuPT"/>
        </systemLogs>
    </dumpstateHalConfiguration>
    
  2. 啟動時將新 XML 文件的路徑傳遞給 dumpstate 服務器。例如:
    --config_file my_config.xml
    

其他子系統

VirtIO 已經為塊存儲、網絡、控制台、輸入、套接字和熵等組件提供了定義良好的接口。對於這些子系統,AAOS 按原樣使用驅動程序,例如virtio-blkvirtio-inputvirtio-consolevirtio-net

在虛擬化 AAOS 參考平台中,通過mac80211_hwsim支持 Wi-Fi 以啟用VirtWifi無線網絡,然後使用virtio-net隧道將網絡流量發送到主機 VM,主機 VM 可以直接訪問實際的 Wi-Fi 網絡。