কার্নেল মডিউল সংক্রান্ত সহায়তা

একটি জেনেরিক কার্নেল ইমেজে (GKI) পার্টিশন মাউন্ট করার জন্য ডিভাইস চালু করতে প্রয়োজনীয় ড্রাইভার সাপোর্ট নাও থাকতে পারে। পার্টিশন মাউন্ট করতে এবং বুটিং চালিয়ে যেতে কোনও ডিভাইসকে সক্ষম করতে, ফার্স্ট-স্টেজ init-কে প্রথমে একটি র‍্যামডিস্কে উপস্থিত কার্নেল মডিউল লোড করার জন্য উন্নত করা হয়। ramdisk-কে জেনেরিক ও ভেন্ডর ramdisk-এ ভাগ করা হয়েছে। ভেন্ডর কার্নেল মডিউল ভেন্ডর র‍্যামডিস্কে স্টোর করা থাকে। যে ক্রম অনুসারে কার্নেল মডিউল লোড করা হয় তা কনফিগার করা যায়।

মডিউলের লোকেশন

রামডিস্ক হল ফার্স্ট-স্টেজ init, এবং A/B ও ভার্চুয়াল A/B ডিভাইসে রিকভারি/ফাস্টবুটড ইমেজের ফাইলসিস্টেম। এটি হল একটি initramfs যা দুটি cpio আর্কাইভ দিয়ে তৈরি এবং বুটলোডার দ্বারা কনক্যাটিনেট করা হয়। প্রথম cpio আর্কাইভ, যা vendor-boot পার্টিশনে vendor ramdisk হিসেবে সেভ করা থাকে, এতে এইসব কম্পোনেন্ট থাকে:

  • ফার্স্ট-স্টেজ init ভেন্ডর কার্নেল মডিউল, যা /lib/modules/-এ আছে।
  • modprobe কনফিগারেশন ফাইল, /lib/modules/-এ অবস্থিত: modules.dep, modules.softdep, modules.alias, modules.options.
  • modules.load ফাইল যা প্রথম স্টেজ ইনিটের সময় কোন মডিউল লোড করতে হবে এবং কোন ক্রমে তা /lib/modules/-এ উল্লেখ করা থাকে।
  • A/B ও ভার্চুয়াল A/B ডিভাইসের জন্য ভেন্ডর রিকভারি-কার্নেল মডিউল, in /lib/modules/
  • modules.load.recovery যা নির্দেশ করে যে কোন মডিউল লোড করতে হবে এবং কোন ক্রমে, A/B এবং ভার্চুয়াল A/B ডিভাইসের জন্য, /lib/modules-এ।

দ্বিতীয় cpio আর্কাইভ, যা GKI-এর সাথে boot.img-এর র‍্যামডিস্ক হিসেবে প্রদান করা হয় এবং প্রথমটির উপরে প্রয়োগ করা হয়, তাতে first_stage_init এবং এটি যে লাইব্রেরির উপর নির্ভর করে তা থাকে।

প্রথম-পর্যায়ের ইনিশিয়ালাইজেশনে মডিউল লোড হচ্ছে

ফার্স্ট-স্টেজ init ramdisk-এ /lib/modules/ থেকে modprobe কনফিগারেশন ফাইল পড়ে শুরু হয়। এরপর, এটি /lib/modules/modules.load-এ (অথবা রিকভারির ক্ষেত্রে, /lib/modules/modules.load.recovery-এ) উল্লেখ করা মডিউলের তালিকা পড়ে এবং আগে লোড করা ফাইলে উল্লেখ করা কনফিগারেশন অনুসরণ করে সেইসব মডিউলের প্রত্যেকটি ক্রমানুসারে লোড করার চেষ্টা করে। হার্ড বা সফট ডিপেন্ডেন্সি পূরণ করার জন্য অনুরোধ করা অর্ডার পরিবর্তন করা হতে পারে।

বিল্ড সাপোর্ট, প্রথম-পর্যায়ের init

ভেন্ডর ramdisk cpio-তে কপি করার জন্য কার্নেল মডিউল নির্দিষ্ট করতে, BOARD_VENDOR_RAMDISK_KERNEL_MODULES-এ সেগুলির তালিকা দিন। বিল্ড রান depmod এই মডিউলগুলিতে চলে এবং এর ফলে প্রাপ্ত modprobe কনফিগারেশন ফাইলগুলি ভেন্ডর ramdisk cpio-তে রাখা হয়।

এছাড়াও, বিল্ডটি একটি modules.load ফাইল তৈরি করে এবং এটি ভেন্ডর ramdisk cpio-তে স্টোর করে। ডিফল্ট হিসেবে, এতে BOARD_VENDOR_RAMDISK_KERNEL_MODULES-এ তালিকাভুক্ত সব মডিউল থাকে। সেই ফাইলের কন্টেন্ট ওভাররাইড করতে, এই উদাহরণে দেখানো BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD ব্যবহার করুন:

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

বিল্ড সাপোর্ট, সম্পূর্ণ Android

Android 10 এবং তার আগের ভার্সনের ক্ষেত্রে, BOARD_VENDOR_KERNEL_MODULES-এ তালিকাভুক্ত কার্নেল মডিউলগুলি Android প্ল্যাটফর্ম বিল্ডের মাধ্যমে /vendor/lib/modules-এ ভেন্ডর পার্টিশনে কপি করা হয়। প্ল্যাটফর্ম বিল্ড depmod এই মডিউলগুলিতে রান করে এবং depmod আউটপুট ফাইলগুলিকে একই লোকেশন থেকে ভেন্ডর পার্টিশনে কপি করে। /vendor থেকে কার্নেল মডিউল লোড করার মেকানিজম Android-এর আগের রিলিজের মতোই আছে। এইসব মডিউল কীভাবে ও কখন লোড করবেন তা আপনার সিদ্ধান্ত যদিও সাধারণত এটি init.rc স্ক্রিপ্ট ব্যবহার করে করা হয়।

ওয়াইল্ডকার্ড ও ইন্টিগ্রেটেড কার্নেল বিল্ড

যেসব ভেন্ডর তাদের ডিভাইসের কার্নেল বিল্ডকে Android প্ল্যাটফর্ম বিল্ডের সাথে একত্রিত করেন তারা ডিভাইসে কপি করার জন্য কার্নেল মডিউল নির্দিষ্ট করতে উপরে উল্লিখিত BOARD ম্যাক্রো ব্যবহার করার সময় সমস্যার সম্মুখীন হতে পারেন। ডিভাইসের প্ল্যাটফর্ম বিল্ড ফাইলে ভেন্ডর যদি কার্নেল মডিউল তালিকাভুক্ত করা এড়াতে চান, তাহলে তিনি ওয়াইল্ডকার্ড ($(wildcard device/vendor/mydevice/*.ko) ব্যবহার করতে পারেন। মনে রাখবেন, ইন্টিগ্রেটেড কার্নেল বিল্ডের ক্ষেত্রে ওয়াইল্ডকার্ড কাজ করে না, কারণ মেক ইনভোক করা হলে এবং মেকফাইলে ম্যাক্রো এক্সপ্যান্ড করা হলে, কার্নেল মডিউল বিল্ড করা হয় না, তাই ম্যাক্রো খালি থাকে।

এই সমস্যার সমাধান করতে, ভেন্ডর তার কার্নেল বিল্ডে এমন একটি zip আর্কাইভ তৈরি করতে পারে যাতে প্রতিটি পার্টিশনে কপি করার জন্য কার্নেল মডিউল থাকে। BOARD_*_KERNEL_MODULES_ARCHIVE-এ সেই জিপ আর্কাইভের পাথ সেট করুন যেখানে * হল পার্টিশনের নাম (যেমন BOARD_VENDOR_KERNEL_MODULES_ARCHIVE)। Android প্ল্যাটফর্ম বিল্ড এই জিপ আর্কাইভকে উপযুক্ত লোকেশনে এক্সট্র্যাক্ট করে এবং মডিউলে depmod রান করে।

কার্নেল মডিউল zip আর্কাইভে এমন একটি মেক রুল থাকতে হবে যা নিশ্চিত করে যে প্ল্যাটফর্ম বিল্ড প্রয়োজন হলে আর্কাইভ তৈরি করতে পারবে।

রিকভারি

আগের Android রিলিজগুলিতে, রিকভারির জন্য প্রয়োজনীয় কার্নেল মডিউলগুলি BOARD_RECOVERY_KERNEL_MODULES-এ নির্দিষ্ট করা ছিল। Android 12-এ, রিকভারির জন্য প্রয়োজনীয় কার্নেল মডিউল এখনও এই ম্যাক্রো ব্যবহার করে নির্দিষ্ট করা হয়। তবে, রিকভারি কার্নেল মডিউলগুলি জেনেরিক র‍্যামডিস্ক cpio-এর পরিবর্তে ভেন্ডর র‍্যামডিস্ক cpio-তে কপি করা হয়। ডিফল্ট হিসেবে, BOARD_RECOVERY_KERNEL_MODULES-এ তালিকাভুক্ত সব কার্নেল মডিউল প্রথম-স্টেজ init-এর সময় লোড করা হয়। আপনি যদি শুধুমাত্র এইসব মডিউলের সাবসেট লোড করতে চান, তাহলে BOARD_RECOVERY_KERNEL_MODULES_LOAD-এ সেই সাবসেটের কন্টেন্ট নির্দিষ্ট করুন।

ভেন্ডর বুট পার্টিশন (যেখানে এই পৃষ্ঠায় উল্লেখ করা ভেন্ডর ramdisk থাকে) তৈরি করা সম্পর্কে জানতে, বুট পার্টিশন দেখুন।