Большинство изменений, необходимых для поддержки VirtIO в AAOS, касаются уровня реализации HAL и ниже в общем ядре Android. Платформа Android взаимодействует с универсальным аппаратно-независимым HAL, используя драйверы VirtIO в ядре гостевой виртуальной машины AAOS, которое взаимодействует с устройствами VirtIO на стороне хоста, используя протоколы VirtIO. Устройства VirtIO на стороне хоста могут получать доступ к физическому оборудованию, используя драйверы устройств, специфичные для SoC.
Обмен данными между драйвером VirtIO и устройством VirtIO осуществляется с помощью virtqueue , представляющих собой кольцевые буферы, подобные DMA, содержащие списки разбросанных данных. Для обмена сообщениями VirtIO между виртуальными машинами можно использовать несколько транспортных протоколов, таких как MMIO или PCI .
В некоторых случаях vsock используется для связи между виртуальными машинами. Поддерживается связь через Vehicle HAL (VHAL), Audio Control и Dumpstate с использованием соединения с одноранговым агентом на отдельной виртуальной машине через интерфейс vsock . Для доступа к этим нестандартизированным подсистемам используется gRPC поверх vsock . gRPC в исходном коде Android модифицирован для работы с vsock с форматом адреса vsock:CID:PORT_NUMBER .

Рисунок 1. Архитектура виртуализации.
Аудио
В виртуализированной AAOS гостевая виртуальная машина Android может использовать virtio-snd для доступа к аудио. virtio-snd предоставляет виртуальной машине Android виртуализированные PCM-устройства, чтобы реализация аудио HAL могла взаимодействовать с виртуализированными звуковыми устройствами с помощью библиотеки TinyALSA.
Реализация HAL для аудио по умолчанию находится в AOSP по адресу /device/google/trout/hal/audio/6.0 . Производители оборудования могут изменить ro.vendor.trout.audiohal.{in,out}_period_{ms,count} для своей платформы. Производители оборудования также могут реализовать свой собственный HAL для аудио, переопределив переменные, связанные с аудио, в файле /device/google/trout/aosp_trout_common.mk.
HAL управления звуком управляет фокусом звука в AAOS. Например, когда система воспроизводит звуки экстренной ситуации, фоновую музыку может потребоваться отключить. HAL управления звуком уведомляет приложения, воспроизводящие музыку, о необходимости отключить звук в этой ситуации. В виртуализированной системе звуки могут поступать из других виртуальных машин. В эталонной реализации гостевая виртуальная машина AAOS имеет запущенный демон сервера управления звуком, который использует gRPC через vsock для приема запросов на фокусировку звука от других виртуальных машин. Хост-виртуальная машина может использовать device/google/trout/hal/audiocontrol/2.0/libandroid_audio_controller для отправки запросов на управление звуком в AAOS. Пока libandroid_audio_controller удерживает фокус звука, он продолжает отправлять сигналы подтверждения в AAOS до тех пор, пока фокус не будет освобожден.

Рисунок 2. Аудиоархитектура.
Bluetooth
Реализация Bluetooth показана на следующем рисунке:

Рисунок 3. Архитектура Bluetooth.
Профиль громкой связи Bluetooth
Для включения профиля Bluetooth Hands-Free Profile (HFP) в trout , спецификация звукового устройства VirtIO была расширена для поддержки управления звуком. Используя этот подход, звуковое устройство VirtIO на стороне хоста/гипервизора предоставляет три элемента управления звуком, связанные с HFP:
-
hfp_enable -
hfp_set_sampling_rate -
hfp_volume
Когда AAOS работает в качестве гостевой виртуальной машины, AAOS использует TinyALSA для настройки параметров звука. Для реализации сценария использования HFP хост/гипервизор выполняет маршрутизацию и калибровку в соответствии со спецификациями производителя.
Реализация Bluetooth основана на следующем эскизном проекте:

Рисунок 4. Архитектура Bluetooth.
Дампстейт
При создании отчета об ошибке для виртуализированной AAOS важно включать информацию о виртуальной машине хоста, чтобы разработчики имели более полное представление о системе. Для этого в эталонной реализации trout используется HAL IDumpstateDevice , который собирает информацию о виртуальной машине хоста через gRPC по vsock . Информация о виртуальной машине хоста, упакованная в tar архив, называется dumpstate_board.bin в отчете об ошибке, а журналы дампа находятся в dumpstate_board.txt .
Чтобы настроить команды для выполнения:
- Скопируйте данные конфигурации из следующего файла в 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> - При запуске передайте серверу dumpstate путь к новому XML-файлу, например:
--config_file my_config.xml
Система расширенного обзора
Система расширенного обзора (EVS) отображает видео, захваченное камерами заднего и кругового обзора. В виртуализированной AAOS стек EVS может получить доступ к видеопотоку с виртуализированного потокового устройства V4L2, использующего видеодрайвер VirtIO.
Режим гаража
Вход и выход из режима «Гараж» запускаются свойствами AP_POWER_STATE_REQ , отправляемыми VHAL. В режиме виртуализации режим «Гараж» запускается со стороны хоста. Виртуальная машина хоста должна оставаться включенной, чтобы предоставлять виртуальные устройства для виртуальной машины Android, пока Android не будет выключен. Сервер VHAL на виртуальной машине хоста отправляет сигнал выключения гостевой виртуальной машине AAOS. После получения сигнала от клиента VHAL виртуальная машина AAOS переходит в режим «Гараж» и начинает отправлять сигналы пульса для поддержания активности виртуальной машины хоста. Для получения дополнительной информации см. раздел «Режим «Гараж»» .
Глобальная навигационная спутниковая система (GNSS)
В trout 1.0 добавлена поддержка виртуализации GNSS через virtio-console . Реализация поддерживает обмен необработанными измерениями и данными о местоположении между хостом и гостевой системой.
Формат обмена данными — CSV, используемый приложением GNSSLogger. В эталонной реализации собственный драйвер GNSS недоступен, поэтому используются фиктивные данные. Вы можете реализовать собственный драйвер без каких-либо изменений на стороне гостевой системы. Пример фиктивного агента хоста предоставляется в составе исходного кода trout .
Предполагается, что инициализация GNSS и поддержка вспомогательной GNSS (AGNSS) будут обрабатываться операционной системой хоста.

Рисунок 5. Архитектура GNSS.
Графика
Когда AAOS работает в качестве гостевой виртуальной машины вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к графическому процессору или контроллеру дисплея. В этом случае вы можете получить доступ к графическому процессору, используя Mesa или goldfish-opengl и драйвер virtio-gpu на гостевой виртуальной машине Android и устройстве virtio-gpu .
На гостевой виртуальной машине Android Mesa или goldfish-opengl кодируют команды OpenGLES либо в поток Gallium, либо в автоматически сгенерированный поток GLES соответственно. В качестве транспортного протокола используется драйвер ядра virtio-gpu . На стороне хоста virglrenderer (для Mesa) и vulkan-cereal (для goldfish-opengl ) воспроизводят декодированный поток команд поверх существующего драйвера GPU. Эталонная платформа AAOS trout поддерживает OpenGL ES только с поддержкой Vulkan, которая ожидается в будущем релизе.

Рисунок 6. Графическая архитектура.
Датчики
Когда AAOS работает в качестве гостевой виртуальной машины вместе с другими автомобильными операционными системами, Android может не иметь прямого доступа к датчикам. В этом случае вы можете получить доступ к датчикам, используя драйвер Virtio-SCMI на гостевой виртуальной машине Android и устройство VirtIO-SCMI на хост-машине. Эталонная платформа виртуализации AAOS предоставляет универсальный и независимый от оборудования интерфейс HAL для датчиков, который можно использовать для доступа к датчикам на базе ARM-процессоров.
Sensor HAL взаимодействует с драйвером IIO SCMI в подсистеме IIO ядра Linux, который использует протокол управления датчиками SCMI, предоставляемый спецификацией интерфейса управления и контроля системы ARM (SCMI), для обнаружения и настройки датчиков, чтения данных с датчиков и получения уведомлений об изменении значений датчиков.
Драйвер IIO SCMI использует драйвер VirtIO SCMI, который применяет транспортный протокол VirtIO из спецификации virtio-scmi для обмена сообщениями SCMI с устройством VirtIO SCMI на хост-машине. Устройство VirtIO SCMI имеет прямой доступ к датчикам через драйверы датчиков, специфичные для SoC.

Рисунок 7. Архитектура датчика.
Местоположение датчика 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/ . Пример конфигурации датчика приведен ниже:
<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 (VHAL) состоит из двух компонентов:
- Клиент. Предоставляет API, используемые Android в виртуализированной AAOS.
- Сервер. Осуществляет прямую связь с оборудованием, например, с автомобильными шинами (или эмулятором).
В виртуализации сервер VHAL работает на хост-машине. Клиент и сервер VHAL взаимодействуют через gRPC по vsock . Дополнительную информацию см. в файле device/google/trout/hal/vehicle/2.0/proto/VehicleServer.proto . Производители оборудования могут использовать другой транспортный протокол, отличный от gRPC, переопределив API связи. Примеры см. в файле device/google/trout/hal/vehicle/2.0/GrpcVehicle{Client,Server}.cpp .
Другие подсистемы
VirtIO уже предоставляет четко определенный интерфейс для таких компонентов, как блочное хранилище, сеть, консоль, ввод, сокет и энтропия. Для этих подсистем AAOS использует драйвер в неизменном виде, например, virtio-blk , virtio-input , virtio-console и virtio-net .
В виртуализированной эталонной платформе AAOS поддержка Wi-Fi осуществляется с помощью mac80211_hwsim , что позволяет создать беспроводную сеть VirtWifi , которая затем использует туннель virtio-net для отправки сетевого трафика на виртуальную машину хоста, имеющую прямой доступ к реальной сети Wi-Fi.