SDV'yi donanım üzerinde şirket içinde test ederiz. Sanallaştırma için QNX'te QVM'yi kullanırız. Tüm hedefleri, dokümanları ve yapılandırmaları örnek olarak paylaşırız.
Ön koşullar
Bu sayfada, önceden yapılandırılmış bir QNX olduğu varsayılır ve QNX'i donanımda oluşturma, yapılandırma veya yükleme adımları yer almaz.
Bu sayfada, arm64 donanımında QNX'i çalıştırdığınız ve SDV'nin _arm64 hedeflerini oluşturup kullandığınız varsayılır.
Gerekli bileşenler
- Sanal donanımı tanımlamak için bir cihaz ağacı blobu (DTB)
- Kullanılacak bir Linux çekirdeği
- Tüm ramdisk önyükleme özelliklerini içeren birleşik ramdisk
- SDV VM kimlik doğrulaması için DICE zincirinin devredilmesi
- Sistemin tüm disk bölümleri
- Sanal makinenin QVM yapılandırması
Cihaz ağacı blob'u (DTB)
QVM, yapılandırmasına göre cihaz ağacı blob'unun (DTB) büyük bir kısmını oluşturur. Bu nedenle, DTB en aza indirilebilir:
/*
* 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>;
};
};
};
Çekirdek
SDV, Genel Çekirdek Görüntüsü'nü (GKI) kullanır ve derlemeden elde edilen çıktıyı doğrudan kullanabilirsiniz.
Ramdisk
Ramdisk bilgileri, Android'in oluşturduğu farklı ramdiskleri ve önyükleme özelliklerini içermelidir. QNX, önyükleyiciyi varsayılan olarak desteklemediğinden beklenen veri biçiminde bir ramdisk oluşturmanız gerekir.
Bu işlemi, birden fazla ramdisk'i birleştiren ve bootconfig'i (vendor-bootconfig.img dosyası) beklenen biçimde ekleyen aşağıdaki Python komut dosyasıyla yapabilirsiniz:
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 zinciri
Bir üretim sisteminde, ana makine sistemi ve önyükleyici, önyükleme işlemi sırasında DICE zincirini dinamik olarak oluşturur ve görüntünün güvenilir olduğunu doğrulamak için konuğa bir DICE zinciri sağlar. Bu şart, test ve geliştirme akışlarını karmaşık hale getirebileceğinden bunun yerine bir DICE zinciri anlık görüntüsü yüklersiniz.
dice_handover_instance* dosyalarını oluşturmak için herhangi bir SDV Cuttlefish derlemesini kullanın.
Örneğin:
lunch sdv_core_cf-trunk_staging-userdebug
m
cp $OUT/product/etc/dice_handover_instance* <GUEST>/test_dice_handover
Disk
QVM, sanal disk için birden fazla biçimi destekler. Referans yapılandırmamızda tüm bölümleri içeren bir disk görüntüsü dosyası kullanılır. bpttool bu diskleri oluşturabilir ancak Android'de aktif olarak geliştirilmez.
QVM yapılandırması
QVM yapılandırması, yapılandırmayı ayarlar ve farklı dosyalara işaret eder. Aşağıdaki örnek yapılandırmaları sunuyoruz:
Sık sorulan sorular
S: adb, sanal makinemize bağlanamıyor. Ne yapabilirim?
Y: Bu kurulumda adb, sanal makinenize bağlanmak için Ethernet'i kullanır. QNX'te, istekleri 5555 numaralı bağlantı noktasındaki konuklara yönlendiren bir bağlantı noktası yönlendirme yapılandırmasına ihtiyacınız vardır. Ana makine sistemine bağlanmanız gerekir. Alternatif olarak, sanal makineye bir köprü de yapılandırabilir ve doğrudan bağlanabilirsiniz.
S: Sistem günlüğünde IServiceRegistrationAgent'ın eksik olduğu gösteriliyor. Neden?
Y: Hizmet keşfi, tamamen çalışan bir güven ve bağlayıcı kurulumuna dayanır. OpenDICE'ın başarıyla yüklendiğini ve HwBinder'ın başlatma sırasında hata göstermediğini doğrulayın. Bunlar çalışmıyorsa önce bunları düzeltmeniz gerekir.
S: init_open_dice başarısız oluyor. Ne oldu?
Y: Başlatma komut dosyaları, başlatma sırasında güven bilgilerini yükler ve bellek konumunu siler. QVM yapılandırmanızda, komut satırı yapılandırmasının ve bellek konumundaki paylaşılan verilerin birbirine uyduğunu doğrulayın. Ayrıca sürücüdeki, QVM yapılandırmasındaki ve DTB'deki bellek konumunun eşleştiğini ve bellek konumunun yazılabilir olduğunu doğrulayın.