কার্নেল মডিউল সমর্থন

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

মডিউল অবস্থান

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

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

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

প্রথম-পর্যায়ে শুরুতে মডিউল লোড হচ্ছে

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

সমর্থন তৈরি করুন, প্রথম পর্যায়ে শুরু করুন

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

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

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

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

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

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

পুনরুদ্ধার

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

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