Wewnętrznie testujemy SDV na sprzęcie. Do wirtualizacji używamy QVM w systemie QNX. Wszystkie cele, dokumentację i konfiguracje udostępniamy jako przykłady.
Wymagania wstępne
Ta strona zakłada, że system QNX jest wstępnie skonfigurowany. Nie zawiera ona instrukcji dotyczących kompilowania, konfigurowania ani flashowania systemu QNX na sprzęcie.
Ta strona zakłada, że używasz systemu QNX na sprzęcie arm64 oraz że kompilujesz i używasz celów _arm64 SDV.
Wymagane komponenty
- Blob drzewa urządzeń (DTB) do zdefiniowania sprzętu wirtualnego
- Jądro systemu Linux do użycia
- Połączony dysk RAM zawierający wszystkie właściwości rozruchu dysku RAM
- Przekazanie łańcucha DICE na potrzeby uwierzytelniania maszyny wirtualnej SDV
- Wszystkie partycje dysku systemu
- Konfiguracja QVM maszyny wirtualnej
Blob drzewa urządzeń (DTB)
QVM generuje większość bloba drzewa urządzeń (DTB) na podstawie swojej konfiguracji. Dlatego DTB może być minimalny:
/*
* 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>;
};
};
};
Jądro
SDV używa ogólnego obrazu jądra (GKI) i możesz bezpośrednio użyć danych wyjściowych kompilacji.
Dysk RAM
Informacje o dysku RAM powinny zawierać różne dyski RAM generowane przez Androida oraz właściwości rozruchu. Ponieważ system QNX domyślnie nie obsługuje programu rozruchowego, musisz wygenerować dysk RAM w oczekiwanym formacie danych.
Możesz to zrobić za pomocą tego skryptu w języku Python, który łączy kilka dysków RAM i dodaje konfigurację rozruchu (czyli plik vendor-bootconfig.img) w oczekiwanym formacie:
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')
Łańcuch DICE
sdv_core_cf
W systemie produkcyjnym system hosta i program rozruchowy dynamicznie tworzą łańcuch DICE podczas procesu rozruchu i udostępniają go gościowi, aby sprawdzić, czy obraz jest zaufany. Ponieważ to wymaganie może skomplikować testowanie i procesy programowania, zamiast tego wczytujesz migawkę łańcucha DICE.
Aby wygenerować pliki dice_handover_instance*, użyj dowolnej kompilacji SDV Cuttlefish.
Przykład:
lunch sdv_core_cf-trunk_staging-userdebug
m
cp $OUT/product/etc/dice_handover_instance* <GUEST>/test_dice_handover
Dysk
QVM obsługuje wiele formatów dysku wirtualnego. Nasza konfiguracja referencyjna używa pliku obrazu dysku, który zawiera wszystkie partycje. bpttool może generować te dyski, ale nie jest aktywnie rozwijane w Androidzie.
Konfiguracja QVM
Konfiguracja QVM ustawia konfigurację i wskazuje różne pliki. Udostępniamy te przykładowe konfiguracje:
- Konfiguracja maszyny wirtualnej SDV Core
- Konfiguracja maszyny wirtualnej SDV Media
- Maszyna wirtualna IVI z integracją SDV
Najczęstsze pytania
P: adb nie może połączyć się z moją maszyną wirtualną. Co mogę zrobić?
O: w tej konfiguracji adb używa Ethernetu do łączenia się z maszyną wirtualną. W systemie QNX musisz skonfigurować przekierowanie portów, które przekierowuje żądania do gości na porcie 5555. Musisz połączyć się z systemem hosta. Możesz też skonfigurować most do maszyny wirtualnej i połączyć się z nią bezpośrednio.
P: w dzienniku systemowym widać, że brakuje IServiceRegistrationAgent. Dlaczego?
O: wykrywanie usług opiera się na w pełni działającej konfiguracji zaufania i bindera. Sprawdź, czy OpenDICE został wczytany, a HwBinder nie wyświetla błędów podczas uruchamiania. Jeśli te elementy nie działają, musisz je najpierw naprawić.
P: init_open_dice kończy się niepowodzeniem. Co się stało?
O: skrypty uruchamiania wczytują informacje o zaufaniu podczas uruchamiania i czyszczą lokalizację pamięci. Sprawdź w konfiguracji QVM, czy konfiguracja cmdline i udostępnione dane w lokalizacji pamięci pasują do siebie. Sprawdź też, czy lokalizacja pamięci w sterowniku, konfiguracji QVM i DTB jest zgodna oraz czy lokalizacja pamięci jest zapisywalna.