আমরা অভ্যন্তরীণভাবে হার্ডওয়্যারে SDV পরীক্ষা করি। ভার্চুয়ালাইজেশনের জন্য আমরা QNX-এ QVM ব্যবহার করি। আমরা নমুনা হিসেবে সমস্ত টার্গেট, ডকুমেন্টেশন এবং কনফিগারেশন শেয়ার করি।
পূর্বশর্ত
এই পৃষ্ঠাটি একটি পূর্ব-কনফিগার করা QNX ধরে নেয় এবং এতে হার্ডওয়্যারে QNX বিল্ড, কনফিগার বা ফ্ল্যাশ করার ধাপগুলি অন্তর্ভুক্ত নেই।
এই পৃষ্ঠাটি ধরে নেয় যে আপনি arm64 হার্ডওয়্যারে QNX চালাচ্ছেন এবং SDV-এর _arm64 টার্গেটগুলো বিল্ড ও ব্যবহার করছেন।
প্রয়োজনীয় উপাদান
- ভার্চুয়াল হার্ডওয়্যার সংজ্ঞায়িত করার জন্য একটি ডিভাইস ট্রি ব্লব (DTB)।
- ব্যবহারের জন্য একটি লিনাক্স কার্নেল
- একটি সমন্বিত র্যামডিস্ক যাতে র্যামডিস্কের সমস্ত বুট বৈশিষ্ট্য অন্তর্ভুক্ত থাকে
- SDV VM প্রমাণীকরণের জন্য একটি DICE চেইনের হস্তান্তর
- সিস্টেমের সমস্ত ডিস্ক পার্টিশন
- ভিএম-এর একটি QVM কনফিগারেশন
ডিভাইস ট্রি ব্লব (ডিটিবি)
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) ব্যবহার করে, এবং আপনি বিল্ডের আউটপুট সরাসরি ব্যবহার করতে পারেন।
রামডিস্ক
র্যামডিস্কের তথ্যে অ্যান্ড্রয়েড দ্বারা তৈরি বিভিন্ন র্যামডিস্ক এবং বুট প্রোপার্টি অন্তর্ভুক্ত থাকা উচিত। যেহেতু QNX ডিফল্টরূপে কোনো বুটলোডার সমর্থন করে না, তাই আপনাকে প্রত্যাশিত ডেটা ফরম্যাট অনুযায়ী একটি র্যামডিস্ক তৈরি করতে হবে।
আপনি নিম্নলিখিত পাইথন স্ক্রিপ্টটির সাহায্যে এটি করতে পারেন, যা একাধিক র্যামডিস্ক একত্রিত করে এবং প্রত্যাশিত বিন্যাসে বুটকনফিগ (যা হলো 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_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 সেই ডিস্কগুলো তৈরি করতে পারে, কিন্তু অ্যান্ড্রয়েডের মধ্যে এর সক্রিয়ভাবে উন্নয়ন করা হয় না।
QVM কনফিগারেশন
QVM কনফিগারেশনটি কনফিগারেশন নির্ধারণ করে এবং বিভিন্ন ফাইলকে নির্দেশ করে। আমরা নিম্নলিখিত নমুনা কনফিগারেশনগুলো প্রদান করছি:
- এসডিভি কোর ভিএম কনফিগারেশন
- এসডিভি মিডিয়া ভিএম কনফিগারেশন
- এসডিভি ইন্টিগ্রেশন সহ আইভিআই ভিএম
প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী
প্রশ্ন: adb আমার VM-এর সাথে সংযোগ করতে পারছে না। আমি কী করতে পারি?
এই সেটআপে, adb আপনার VM-এর সাথে সংযোগ করার জন্য ইথারনেট ব্যবহার করে। আপনার QNX-এ একটি পোর্ট ফরওয়ার্ডিং কনফিগারেশন প্রয়োজন, যা পোর্ট 5555-এ গেস্টদের কাছে রিকোয়েস্ট ফরওয়ার্ড করবে। আপনাকে হোস্ট সিস্টেমের সাথে সংযোগ করতে হবে। বিকল্প হিসেবে, আপনি VM-এর সাথে একটি ব্রিজ কনফিগার করে সরাসরি এর সাথে সংযোগ করতে পারেন।
সিস্টেম লগ দেখাচ্ছে যে IServiceRegistrationAgent অনুপস্থিত। কেন?
সার্ভিস ডিসকভারি একটি সম্পূর্ণ কার্যকর ট্রাস্ট এবং বাইন্ডার সেটআপের উপর নির্ভর করে। যাচাই করুন যে OpenDICE সফলভাবে লোড হয়েছে এবং HwBinder চালু হওয়ার সময় কোনো ত্রুটি দেখাচ্ছে না। যদি এগুলি কাজ না করে, তবে আপনাকে প্রথমে সেগুলি ঠিক করতে হবে।
প্রশ্ন: init_open_dice ব্যর্থ হয়েছে। কী ঘটেছে?
এ: স্টার্টআপ স্ক্রিপ্টগুলো চালু হওয়ার সময় ট্রাস্ট ইনফরমেশন লোড করে এবং মেমোরি লোকেশন মুছে ফেলে। আপনার QVM কনফিগে যাচাই করুন যে cmdline কনফিগারেশন এবং মেমোরি লোকেশনের শেয়ার্ড ডেটা সামঞ্জস্যপূর্ণ কিনা। এছাড়াও যাচাই করুন যে ড্রাইভার, QVM কনফিগ এবং DTB-তে থাকা মেমোরি লোকেশনগুলো এক এবং মেমোরি লোকেশনটি রাইটেবল (লেখার যোগ্য)।