QNX पर SDV

हम एसडीवी की जांच, हार्डवेयर पर करते हैं. हम वर्चुअलाइज़ेशन के लिए, QNX पर QVM का इस्तेमाल करते हैं. हम सभी टारगेट, दस्तावेज़, और कॉन्फ़िगरेशन को सैंपल के तौर पर शेयर करते हैं.

ज़रूरी शर्तें

इस पेज पर, पहले से कॉन्फ़िगर किए गए QNX के बारे में बताया गया है. इसमें हार्डवेयर पर QNX को बनाने, कॉन्फ़िगर करने या फ़्लैश करने के तरीके शामिल नहीं हैं.

इस पेज पर यह माना गया है कि arm64 हार्डवेयर पर QNX का इस्तेमाल किया जा रहा है. साथ ही, SDV के _arm64 टारगेट बनाए जा रहे हैं और उनका इस्तेमाल किया जा रहा है.

ज़रूरी कॉम्पोनेंट

  • वर्चुअल हार्डवेयर तय करने के लिए डिवाइस ट्री ब्लॉब (डीटीबी)
  • इस्तेमाल करने के लिए Linux कर्नेल
  • एक साथ कई रैमडिस्क को बूट करने की सुविधा देने वाला रैमडिस्क, जिसमें रैमडिस्क बूट करने की सभी प्रॉपर्टी शामिल होती हैं
  • SDV VM की पुष्टि करने के लिए, DICE चेन का हैंडऑफ़
  • सिस्टम के सभी डिस्क पार्टीशन
  • वीएम का QVM कॉन्फ़िगरेशन

डिवाइस ट्री ब्लॉब (डीटीबी)

QVM, अपने कॉन्फ़िगरेशन के आधार पर ज़्यादातर डिवाइस ट्री ब्लॉब (डीटीबी) जनरेट करता है. इसलिए, डीटीबी कम से कम हो सकता है:

/*
 * 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, सामान्य कर्नेल इमेज (जीकेआई) का इस्तेमाल करता है. साथ ही, किसी बिल्ड के आउटपुट का सीधे तौर पर इस्तेमाल किया जा सकता है.

रैमडिस्क

रैमडिस्क की जानकारी में, Android के जनरेट किए गए अलग-अलग रैमडिस्क और बूट प्रॉपर्टी शामिल होनी चाहिए. QNX में बूटलोडर डिफ़ॉल्ट रूप से काम नहीं करता. इसलिए, आपको ज़रूरत के मुताबिक डेटा फ़ॉर्मैट में रैमडिस्क जनरेट करना होगा.

इसके लिए, यहां दी गई Python स्क्रिप्ट का इस्तेमाल किया जा सकता है. यह स्क्रिप्ट, एक से ज़्यादा रैमडिस्क को जोड़ती है और बूटकॉन्फ़िग (जो कि 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 Core वीएम कॉन्फ़िगरेशन
  • SDV Media वीएम कॉन्फ़िगरेशन
  • SDV इंटिग्रेशन के साथ IVI VM

अक्सर पूछे जाने वाले सवाल

सवाल: adb, मेरी वीएम से कनेक्ट नहीं हो पा रहा है. ऐसे में, मुझे क्या करना होगा?

जवाब: इस सेटअप में, adb आपके वीएम से कनेक्ट होने के लिए ईथरनेट का इस्तेमाल करता है. आपको QNX पर पोर्ट फ़ॉरवर्डिंग कॉन्फ़िगरेशन की ज़रूरत होगी. इससे मेहमानों के अनुरोध, पोर्ट 5555 पर फ़ॉरवर्ड किए जा सकेंगे. आपको होस्ट सिस्टम से कनेक्ट करना होगा. इसके अलावा, वीएम के लिए ब्रिज कॉन्फ़िगर किया जा सकता है और उससे सीधे कनेक्ट किया जा सकता है.

सवाल: सिस्टम लॉग में दिख रहा है कि IServiceRegistrationAgent मौजूद नहीं है. क्यों?

जवाब: डिवाइस और सेवाओं की अपने-आप पहचान करने के लिए, भरोसेमंद और बाइंडर सेटअप का पूरी तरह से काम करना ज़रूरी है. पुष्टि करें कि OpenDICE को सही तरीके से लोड किया गया है और स्टार्टअप के दौरान HwBinder में गड़बड़ियां नहीं दिख रही हैं. अगर ये काम नहीं कर रहे हैं, तो आपको इन्हें ठीक करना होगा.

Q: init_open_dice फ़ेल हो जाता है. क्या समस्या हो सकती है?

जवाब: स्टार्टअप स्क्रिप्ट, स्टार्टअप के दौरान भरोसेमंद जानकारी लोड करती हैं और मेमोरी लोकेशन को मिटा देती हैं. अपने QVM कॉन्फ़िगरेशन में पुष्टि करें कि cmdline कॉन्फ़िगरेशन और मेमोरी लोकेशन में शेयर किया गया डेटा एक साथ काम करता है. यह भी पुष्टि करें कि ड्राइवर, QVM कॉन्फ़िगरेशन, और DTB में मेमोरी की जगह एक जैसी हो. साथ ही, मेमोरी की जगह पर लिखा जा सकता हो.