建築學

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

所述的Virtio驅動器和為Virtio設備之間的通信發生與virtqueue ,這是DMA狀散射的環緩衝器聚集列表。幾個傳輸,如MMIOPCI可用於交換的VM之間的為Virtio消息。

在某些情況下, vsock已經利用了虛擬機間的通信。車輛HAL,音頻控制,和通信Dumpstate使用的對等代理在一個單獨的VM在連接支撐vsock接口。 GRPC-vsock用於訪問這些非標準化的子系統。 GRPC在Android源代碼樹已經被修改為工作與vsock用的地址格式vsock:CID:PORT_NUMBER

虛擬化架構
圖1.虛擬化體系結構

圖形

當 AAOS 作為訪客 VM 與其他汽車操作系統一起運行時,Android 可能無法直接訪問 GPU 或顯示控制器。在這種情況下,梅薩和一個virtio-gpu在Android客戶VM和駕駛員virtio-gpu裝置可以被用來訪問GPU。

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

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

該AAOS參考平台trout目前支持OpenGL ES只支持福爾康,在未來的版本的預期。

圖形架構
圖2.圖形架構

傳感器

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

傳感器HAL與Linux內核IIO子系統IIO SCMI驅動器,它採用了SCMI傳感器管理協議提供了由通信ARM系統控制和管理接口(SCMI)規範來發現和配置的傳感器,讀出傳感器數據,並且被通知傳感器的值變化。的IIO SCMI驅動程序使用為Virtio SCMI驅動程序,如在指定其採用為Virtio傳輸協議virtio-scmi規範與主機VM上為Virtio SCMI設備交換SCMI消息。 VirtIO SCMI 設備可以通過特定於 SoC 的傳感器驅動程序直接訪問傳感器。

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

傳感器 HAL 位置

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

傳感器 HAL 配置

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

原始設備製造商可以提供傳感器的構造,例如方向和位置,在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的客戶端虛擬機可以使用virtio-snd訪問音頻。 virtio-snd提供了虛擬化的PCM設備到Android VM,使得音頻HAL實現可以用與TinyALSA庫中的虛擬聲音設備進行交互。

默認音頻HAL實現位於AOSP在/device/google/trout/hal/audio/6.0 。 OEM廠商可以修改ro.vendor.trout.audiohal.{in,out}_period_{ms,count}對於他們的平台。原始設備製造商還可以通過重寫音頻相關的變量,實現自己的音頻HAL /device/google/trout/aosp_trout_common.mk.

音頻控制 HAL 管理 AAOS 中的音頻焦點。例如,當系統播放緊急聲音時,後台播放的音樂可能需要靜音。在這種情況下,音頻控制 HAL 將通知那些播放音樂的應用程序靜音。在虛擬化系統中,聲音可能來自其他虛擬機。在參考實現,在AAOS來賓虛擬機有守護進程運行的音頻控制服務器,它採用GRPC-vsock接收來自其他虛擬機的音頻焦點請求。主機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 )。通過覆蓋通信 API,OEM 可以使用 GRPC 以外的不同傳輸協議。例如,參見device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp

擴展視圖系統

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

車庫模式

欲了解更多信息,請參閱什麼是車庫模式? .

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

轉儲狀態

在為虛擬化 AAOS 生成錯誤報告時,包含主機 VM 信息非常重要,這樣開發人員可以更全面地了解系統。要做到這一點, trout參考實施工具IDumpstateDevice HAL,收集通過主機VM信息GRPC-vsock 。焦油包裝的主機VM信息被命名為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-console ,和virtio-net

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