SDV на QNX

Мы проводим внутреннее тестирование SDV на оборудовании. Для виртуализации мы используем QVM на QNX. В качестве примеров мы предоставляем все целевые платформы, документацию и конфигурации.

Предварительные требования

На этой странице предполагается наличие предварительно настроенной системы QNX и не приводятся шаги по сборке, настройке или прошивке QNX на оборудовании.

На этой странице предполагается, что вы используете QNX на оборудовании arm64, а также собираете и используете целевые объекты _arm64 из SDV.

Необходимые компоненты

  • Блок дерева устройств (DTB) для определения виртуального оборудования.
  • Ядро Linux для использования
  • Объединенный образ оперативной памяти, включающий все свойства загрузки этого образа.
  • Передача цепочки DICE для аутентификации виртуальной машины SDV.
  • Все разделы диска системы
  • Конфигурация виртуальной машины в QVM.

Блок дерева устройств (DTB)

QVM генерирует большую часть двоичных данных дерева устройств (DTB) на основе своей конфигурации. Поэтому DTB может быть минимальным:

/*
 * Copyright (C) 2026 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/dts-v1/;

/ {
    model = "Virtual Machine";
    #address-cells = <2>;
    #size-cells = <2>;

    // This reserved-memory node specifies for the open-dice driver which memory region(s) to
    // expose as /dev/open-dice<n> device(s)
    reserved-memory {
        // The number of u32 cells to represent the address of a memory region
        #address-cells = <2>;
        // The number of u32 cells to represent the size of a memory region
        #size-cells = <2>;
        ranges;
        // The unit address (after the @) must match the address in the reg property
        dice@D1C30000 {
            // The open-dice driver receives this device tree node based on this
            // property.
            compatible = "google,open-dice";
            no-map;
            // The address and the size of the memory region that is passed to the
            // open-dice driver.
            // First two hex numbers (cells) represent the address of the memory region,
            // the last two represent its size (4K, in this case).
            reg = <0x0 0xD1C30000 0x0 0x1000>;
        };
    };
};

Ядро

SDV использует универсальный образ ядра (GKI), и вы можете использовать результаты сборки напрямую.

Ramdisk

Информация о ramdisk должна включать различные ramdisk, создаваемые Android, и свойства загрузки. Поскольку QNX по умолчанию не поддерживает загрузчик, необходимо создать ramdisk с ожидаемым форматом данных .

Это можно сделать с помощью следующего скрипта на Python, который объединяет несколько образов ramdisk и добавляет bootconfig (файл vendor-bootconfig.img ) в ожидаемом формате:

def create_qnx_ramdisk(output: io.BytesIO,
                       ramdisks: Sequence[io.BytesIO],
                       bootconfig: Optional[io.BytesIO]):
  BUFFER_SIZE = 4096

  for ramdisk in ramdisks:
    while buf := ramdisk.read(BUFFER_SIZE):
      output.write(buf)

  # Kernel looks for bootconfig at the end of ramdisk.

  if bootconfig:
    bootconfig_checksum = 0
    bootconfig_size = 0
    while buf := bootconfig.read(BUFFER_SIZE):
      bootconfig_checksum = (bootconfig_checksum + sum(buf)) & 0xFFFFFFFF
      bootconfig_size += len(buf)
      output.write(buf)

    output.write(struct.pack('II', bootconfig_size, bootconfig_checksum))
    output.write(b'#BOOTCONFIG\n')

Цепочка DICE

В производственной системе хост-система и загрузчик динамически формируют цепочку DICE в процессе загрузки и предоставляют гостевой системе цепочку DICE для проверки достоверности образа. Поскольку это требование может усложнить процессы тестирования и разработки, вместо этого загружается снимок цепочки DICE.

Для генерации файлов dice_handover_instance* используйте любую сборку SDV Cuttlefish. Например:

lunch sdv_core_cf-trunk_staging-userdebug
m
cp $OUT/product/etc/dice_handover_instance* <GUEST>/test_dice_handover

Диск

QVM поддерживает несколько форматов виртуальных дисков; в нашей эталонной конфигурации используется файл образа диска, содержащий все разделы. bpttool может генерировать такие диски, но в Android он активно не разрабатывается.

Конфигурация QVM

Конфигурация QVM задаёт параметры и указывает на различные файлы. Мы предоставляем следующие примеры конфигураций:

  • Конфигурация виртуальной машины ядра SDV
  • Конфигурация виртуальной машины SDV Media
  • Виртуальная машина IVI с интеграцией SDV

Часто задаваемые вопросы

В: adb не может подключиться к моей виртуальной машине. Что я могу сделать?

A: В этой конфигурации adb использует Ethernet для подключения к вашей виртуальной машине. Вам потребуется настроить переадресацию портов на QNX, которая будет перенаправлять запросы гостевым системам на порт 5555. Вам необходимо подключиться к хост-системе. В качестве альтернативы вы также можете настроить мост к виртуальной машине и подключиться к ней напрямую.

В: В системном журнале указано, что отсутствует объект IServiceRegistrationAgent. Почему?

A: Обнаружение сервисов зависит от полностью работоспособной настройки доверия и привязки. Убедитесь, что OpenDICE успешно загружен, и HwBinder не выдает ошибок при запуске. Если это не работает, сначала необходимо это исправить.

В: init_open_dice завершилась с ошибкой. Что произошло?

A: Скрипты запуска загружают информацию о доверительных отношениях во время запуска и очищают область памяти. Убедитесь в конфигурации QVM, что конфигурация командной строки и общие данные в области памяти совпадают. Также убедитесь, что область памяти в драйвере, конфигурации QVM и DTB совпадает, и что эта область памяти доступна для записи.