架构

在 AAOS 中支持 VirtIO 所需的大部分更改涉及 HAL 实现级别及 Android 通用内核以下级别的更改。 Android 框架使用 AAOS 来宾 VM 内核中的 VirtIO 驱动程序与通用硬件无关的 HAL 进行通信,该驱动程序使用 VirtIO 协议与主机端的 VirtIO 设备进行通信。主机端的 VirtIO 设备可以使用 SoC 特定的设备驱动程序访问物理硬件。

VirtIO 驱动程序和 VirtIO 设备之间的通信通过virtqueue进行,它是分散收集列表的类似 DMA 的环形缓冲区。 MMIOPCI等多种传输方式可用于在虚拟机之间交换 VirtIO 消息。

在某些情况下, vsock已被用于虚拟机间通信。通过vsock接口连接到单独虚拟机上的对等代理,支持车辆 HAL、音频控制和转储状态通信。 GRPC-vsock用于访问这些非标准化子系统。 Android 源代码树中的GRPC已修改为与vsock一起使用,地址格式为vsock:CID:PORT_NUMBER

虚拟化架构
图 1.虚拟化架构

声音的

在虚拟化 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 发送心跳,直到焦点被释放。

音频架构
图 5.音频架构

蓝牙

蓝牙实现基于下图所示的设计。

蓝牙架构
图 5.蓝牙架构

蓝牙免提配置文件

为了在trout上启用蓝牙免提配置文件 (HFP),VirtIO 声音设备规范已扩展为支持音频控制。使用这种方法,主机/管理程序端的 VirtIO 声音设备提供以下三个与 HFP 相关的音频控制:

  • hfp_enable
  • hfp_set_sampling_rate
  • hfp_volume

当 AAOS 作为来宾 VM 运行时,AAOS 使用 TinyAlsa 来设置这些音频控制。为了启用 HFP 用例,主机/管理程序相应地执行供应商特定的路由和校准。

蓝牙实现基于下面的设计插图。

蓝牙架构
图 5.蓝牙架构

转储状态

在生成虚拟化 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 文件的路径传递到转储状态服务器。例如:
    --config_file my_config.xml
    

扩展视图系统 (EVS)

扩展视图系统(EVS)用于显示后视和环视摄像头捕获的视频。在虚拟化 AAOS 中,EVS 堆栈可以从使用 VirtIO-video 驱动程序的虚拟化 V4L2 流设备访问视频流。

车库模式

有关更多信息,请参阅车库模式

进入和退出车库模式由车辆 HAL 发送的AP_POWER_STATE_REQ属性触发。在虚拟化模式下,Garage模式是从主机端触发的。主机 VM 应保持开机状态,为 Android VM 提供虚拟设备,直到 Android 关机。主机 VM 上的 VHAL 服务器将关闭信号发送到 AAOS 来宾 VM。收到 VHAL 客户端信号后,AAOS VM 进入 Garage 模式并开始发送心跳信号以保持主机 VM 处于活动状态。

全球导航卫星系统(GNSS)

trout 1.0 中,添加了对virtio-console上的 GNSS 虚拟化的支持。该实现支持从主机到访客交换原始测量值和位置修复。

数据交换格式是 GnssLogger 应用程序使用的 CSV。在参考实现中,由于本机 GNSS 驱动程序不可用,因此可以使用模拟数据,但无需任何来宾端更改即可实现本机驱动程序。示例模拟主机代理作为trout源代码的一部分提供。

当前的实现期望 GNSS 初始化和辅助 GNSS (AGNSS) 由主机操作系统环境处理。

全球导航卫星系统架构
图 2. GNSS 架构

图形

当 AAOS 作为来宾虚拟机与其他汽车操作系统一起运行时,Android 可能无法直接访问 GPU 或显示控制器。在这种情况下,可以使用Mesagoldfish-opengl以及 Android 来宾 VM 和virtio-gpu设备上的virtio-gpu驱动程序来访问 GPU。

在 Android 来宾 VM 上,Mesa 或goldfish-opengl将 OpenGLES 命令分别编码到 Gallium 流或自动生成的 GLES 流中。 virtio-gpu内核驱动程序用作传输。在主机端, virglrenderer (对于 Mesa )和vulkan-cereal (对于goldfish-opengl )在现有 GPU 驱动程序之上重播解码的命令流。 AAOS 参考平台trout支持 OpenGL ES,并且支持 Vulkan,预计将在未来版本中提供支持。

图形架构
图 3.图形架构

传感器

当 AAOS 作为来宾虚拟机与其他汽车操作系统一起运行时,Android 可能无法直接访问传感器。在这种情况下,Android 来宾虚拟机上的 Virtio-SCMI 驱动程序和主机虚拟机上的 VirtIO-SCMI 设备用于访问传感器。 AAOS 虚拟化参考平台提供通用且与硬件无关的传感器 HAL,可用于基于 ARM 的 SoC 访问传感器。

Sensor HAL 与 Linux 内核 IIO 子系统中的 IIO SCMI 驱动程序进行通信,该驱动程序使用ARM 系统控制和管理接口 (SCMI)规范提供的 SCMI 传感器管理协议来发现和配置传感器、读取传感器数据以及获得传感器通知值变化。

IIO SCMI 驱动程序使用 VirtIO SCMI 驱动程序,该驱动程序使用virtio-scmi规范中指定的 VirtIO 传输协议与主机 VM 上的 VirtIO SCMI 设备交换 SCMI 消息。 VirtIO SCMI 设备可以通过 SoC 特定的传感器驱动程序直接访问传感器。

传感器架构
图 4.传感器架构

传感器 HAL 位置

使用 VirtIO SCMI 的传感器 HAL 的参考实现位于device/google/trout/hal/sensors

传感器 HAL 配置

传感器 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>

车辆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

其他子系统

VirtIO 已经为块存储、网络、控制台、输入、套接字和熵等组件提供了定义良好的接口。对于这些子系统,AAOS 按原样使用驱动程序,例如virtio-blkvirtio-inputvirtio-consolevirtio-net

在虚拟化 AAOS 参考平台中, mac80211_hwsim支持 Wi-Fi,以启用VirtWifi无线网络,然后使用virtio-net隧道将网络流量发送到主机虚拟机,主机虚拟机可以直接访问实际的 Wi-Fi 网络。