Архитектура

Большинство изменений, необходимых для поддержки VirtIO в AAOS, связаны с изменениями на уровне реализации HAL и ниже в общем ядре Android. Платформа Android взаимодействует с универсальным аппаратно-независимым HAL с помощью драйверов VirtIO в ядре гостевой виртуальной машины AAOS, которое взаимодействует с устройствами VirtIO на стороне хоста с помощью протоколов VirtIO. Устройства VirtIO на стороне хоста могут получать доступ к физическому HW с помощью драйверов устройств, специфичных для SoC.

Связь между водителем Virtio и устройством Virtio происходит с virtqueue , которые DMA-буфера , как кольцо разброса собирают списки. Несколько транспорта, такие как MMIO или PCI может быть использован для обмена сообщениями между Virtio виртуальных машин.

В некоторых случаях, vsock было привлечено для связи между VM связи. Автомобиль HAL, управления аудио и Dumpstate связь обеспечивается с помощью подключения к одноранговой агента на отдельной VM над vsock интерфейсом. GRPC-vsock используется для доступа к этим нестандартизированным подсистемам. КПГРЫ в дереве Android источника была модифицированы для работы с vsock с форматом адрес vsock:CID:PORT_NUMBER .

Архитектура виртуализации
Рисунок 1. Архитектура виртуализации

Графика

Когда AAOS работает как гостевая виртуальная машина вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к графическому процессору или контроллеру дисплея. В этом случае, Mesa и virtio-gpu драйвер на Android гостя VM и virtio-gpu устройства могут быть использованы для доступа к GPU.

На гостевой виртуальной машине Android Mesa использует платформу Gallium3D для компиляции шейдеров в промежуточное представление TGSI и транслирует API в объекты состояния. Gallium3D затем передает скомпилированные государственные объекты и отрисовки звонков в Мес Virgl, который затем использует virtio-gpu в качестве транспортного протокола для передачи команд и шейдеров на хост VM.

На принимающей стороне, virglrenderer получает virtio-gpu команды потока и преобразует поток в команды OpenGL ES. Он также переводит шейдеры из формата TGSI в формат GLSL, а затем воспроизводит их поверх существующего драйвера графического процессора.

Эталонная платформа AAOS trout в настоящее время поддерживает OpenGL ES только с поддержкой Vulkan, ожидается в будущем выпуске.

Графическая архитектура
Рисунок 2. Графическая архитектура

Датчики

Когда AAOS работает как гостевая виртуальная машина вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к датчикам. В этом случае драйвер Virtio-SCMI на гостевой виртуальной машине Android и устройство VirtIO-SCMI на хост-машине используются для доступа к датчикам. Эталонная платформа виртуализации AAOS предоставляет общий и HW-независимый датчик HAL, который можно использовать для SoC на базе ARM для доступа к датчикам.

Датчик HAL взаимодействует с драйвером IIO SCMI в подсистеме Linux Kernel Iio, который использует протокол управления SCMI датчика обеспечивается управление и интерфейс управления ARM System (SCMI) спецификацией для обнаружения и датчиков конфигурирования, считывать данные датчика, и получать уведомления о датчике изменение стоимости. Драйвер IIO SCMI использует драйвер Virtio SCMI, который использует транспортный протокол Virtio , как указано в virtio-scmi спецификации для обмена сообщениями SCMI с устройством Virtio SCMI на хосте VM. Устройство VirtIO SCMI имеет прямой доступ к датчикам через драйверы датчиков, специфичные для SoC.

Архитектура датчика
Архитектура Рисунок 3. Датчик

Расположение датчика HAL

Эталонная реализация датчика HAL, который использует Virtio SCMI, расположена на device/google/trout/hal/sensors .

Конфигурация датчика HAL

Sensor HAL может потребоваться изменить данные датчика, полученные от хост-виртуальной машины, чтобы они соответствовали системе координат автомобильного датчика Android. Схему для конфигурации датчиков можно найти в device/google/trout/hal/sensors/2.0/config/sensor_hal_configuration.xsd .

ОЙ может обеспечить конфигурацию датчика, например, ориентацией и расположением, в sensor_hal_configuration.xml и скопировать этот файл на любом /odm/etc/sensors/ и /vendor/etc/sensors/ /odm/etc/sensors/ или /vendor/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 так , что реализация аудио HAL может взаимодействовать с виртуальными звуковыми устройствами с библиотекой TinyALSA.

Реализация по умолчанию аудио HAL находится в AOSP на /device/google/trout/hal/audio/6.0 . OEM - производители могут изменять ro.vendor.trout.audiohal.{in,out}_period_{ms,count} для своей платформы. OEM - производители могут реализовывать свои собственные аудио HAL путем переопределения аудио связанных переменных в /device/google/trout/aosp_trout_common.mk.

Управление звуком HAL управляет фокусом звука в AAOS. Например, когда система воспроизводит аварийные звуки, может потребоваться отключить фоновую музыку. HAL управления звуком уведомит те приложения, которые воспроизводят музыку, об отключении звука в этой ситуации. В виртуализированной системе звуки могут исходить от других виртуальных машин. В эталонном варианте реализации AAOS гость VM имеет аудио сервер управления запущенно демон, который использует GRPC-vsock получить аудио запросов фокуса от других виртуальных машин. Хост ВМ может использовать device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller для отправки запросов управления аудио на AAOS. В то время как libandroid_audio_controller держит аудио фокус, он будет продолжать посылать сердцебиения в AAOS пока фокус не будет отпущен.

Аудио архитектура
Архитектура Рисунок 4. Аудио

блютуз

Когда AAOS работает как гостевая виртуальная машина вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к контроллеру Bluetooth. В этом случае драйвер VirtIO-Console на гостевой виртуальной машине Android и устройство VirtIO-Console на хост-машине можно использовать для открытия виртуального COM-порта и отправки пакетов HCI на контроллер Bluetooth и получения событий. Эта конструкция позволяет использовать общий и не зависящий от аппаратного обеспечения HAL Bluetooth в стеке Bluetooth Android. Хост-виртуальная машина может обрабатывать задачи, связанные с аппаратным обеспечением, такие как инициализация и загрузка микропрограммного обеспечения контроллера Bluetooth.

Реализация Bluetooth основана на иллюстрации дизайна ниже.

Архитектура Bluetooth
Архитектура Рисунок 5. Bluetooth

Автомобиль HAL

Реализация Vehicle HAL состоит из двух компонентов:

  • Клиент. Предоставляет API, используемые Android в виртуализированном AAOS
  • Сервер. Обменивается данными напрямую с оборудованием, таким как автомобильные автобусы (или эмулятор).

В виртуализации сервер VHAL работает на хост-виртуальной машине. Клиент и сервер VHAL связь через GRPC-vsock (для получения дополнительной информации см device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto ). OEM-производители могут использовать другой транспортный протокол, отличный от GRPC, переопределив коммуникационные API. Примеры см device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .

Расширенная система просмотра

Система расширенного обзора (EVS) используется для отображения видео, снятого камерами заднего и объемного обзора. В виртуализированном AAOS стек EVS может получить доступ к видеопотоку с виртуализированного потокового устройства V4L2, которое использует драйвер VirtIO-video.

Гаражный режим

Для получения дополнительной информации см Что такое Garage Mode? .

Вход и выход Режим гаража инициируется AP_POWER_STATE_REQ свойствами , посланных HAL транспортного средства. В режиме виртуализации режим «Гараж» запускается со стороны хоста. Хост-виртуальная машина должна оставаться включенной, чтобы предоставлять виртуальные устройства для виртуальной машины Android, пока Android не будет отключен. Сервер VHAL на хост-виртуальной машине отправляет сигнал выключения гостевой виртуальной машине AAOS. После получения сигнала VHAL от клиента виртуальная машина AAOS переходит в режим Garage и начинает отправлять контрольные сигналы, чтобы поддерживать активную виртуальную машину хоста.

Dumpstate

При создании отчета об ошибке для виртуализированного AAOS полезно включить информацию о виртуальной машине хоста, чтобы разработчики имели более полное представление о системе. Чтобы достичь этого, 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-blk , virtio-input , virtio-console и virtio-net .

В виртуальной справочной AAOS платформы, Wi-Fi поддерживается с mac80211_hwsim , чтобы позволить VirtWifi беспроводной сети, которая затем использует virtio-net туннель для передачи сетевого трафика на хост VM, который имеет прямой доступ к реальной сети Wi-Fi.