লোডযোগ্য কার্নেল মডিউল

Android 8.0-এ প্রবর্তিত মডিউল কার্নেলের প্রয়োজনীয়তার অংশ হিসাবে, সমস্ত সিস্টেম-অন-চিপ (SoC) কার্নেলগুলিকে লোডযোগ্য কার্নেল মডিউলগুলিকে সমর্থন করতে হবে৷

কার্নেল কনফিগারেশন বিকল্প

লোডযোগ্য কার্নেল মডিউল সমর্থন করার জন্য, সমস্ত সাধারণ কার্নেলে android-base.config নিম্নলিখিত কার্নেল-কনফিগ বিকল্পগুলি অন্তর্ভুক্ত করে (বা তাদের কার্নেল-সংস্করণ সমতুল্য):

CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y

সমস্ত ডিভাইস কার্নেল এই বিকল্পগুলি সক্রিয় করা আবশ্যক। কার্নেল মডিউলগুলি যখনই সম্ভব আনলোড এবং পুনরায় লোড করা সমর্থন করবে।

মডিউল স্বাক্ষর

GKI ভেন্ডর মডিউলের জন্য মডিউল-সাইনিং সমর্থিত নয়। যাচাইকৃত বুট সমর্থন করার জন্য প্রয়োজনীয় ডিভাইসগুলিতে, অ্যান্ড্রয়েডের জন্য কার্নেল মডিউলগুলি পার্টিশনগুলিতে থাকা প্রয়োজন যেগুলিতে dm-verity সক্ষম রয়েছে৷ এটি তাদের সত্যতার জন্য পৃথক মডিউল স্বাক্ষর করার প্রয়োজনীয়তাকে সরিয়ে দেয়। অ্যান্ড্রয়েড 13 জিকেআই মডিউলের ধারণা চালু করেছে। GKI মডিউলগুলি চলমান সময়ে GKI এবং অন্যান্য মডিউলগুলির মধ্যে পার্থক্য করতে কার্নেলের বিল্ড টাইম সাইনিং অবকাঠামো ব্যবহার করে। স্বাক্ষরবিহীন মডিউলগুলিকে ততক্ষণ লোড করার অনুমতি দেওয়া হয় যতক্ষণ না তারা শুধুমাত্র অনুমোদিত তালিকায় উপস্থিত প্রতীকগুলি ব্যবহার করে বা অন্য স্বাক্ষরবিহীন মডিউলগুলি দ্বারা সরবরাহ করা হয়৷ কার্নেলের বিল্ড টাইম কী পেয়ার ব্যবহার করে GKI বিল্ড চলাকালীন GKI মডিউল সাইন করার সুবিধার জন্য, GKI কার্নেল কনফিগারেশন CONFIG_MODULE_SIG_ALL=y সক্রিয় করেছে। ডিভাইস কার্নেল বিল্ড করার সময় নন-GKI মডিউল সাইন করা এড়াতে, আপনাকে অবশ্যই যোগ করতে হবে # CONFIG_MODULE_SIG_ALL is not set

ফাইল অবস্থান

যদিও অ্যান্ড্রয়েড 7.x এবং নিম্নতর কার্নেল মডিউলগুলির বিরুদ্ধে বাধ্যতামূলক নয় (এবং insmod এবং rmmod এর জন্য সমর্থন অন্তর্ভুক্ত), Android 8.x এবং উচ্চতর ইকোসিস্টেমে কার্নেল মডিউল ব্যবহারের পরামর্শ দেয়। নিম্নলিখিত টেবিলটি তিনটি Android বুট মোড জুড়ে প্রয়োজনীয় সম্ভাব্য বোর্ড-নির্দিষ্ট পেরিফেরাল সমর্থন দেখায়।

বুট মোড স্টোরেজ প্রদর্শন কীপ্যাড ব্যাটারি পিএমআইসি টাচস্ক্রিন NFC, Wi-Fi,
ব্লুটুথ
সেন্সর ক্যামেরা
পুনরুদ্ধার
চার্জার
অ্যান্ড্রয়েড

অ্যান্ড্রয়েড বুট মোডগুলিতে উপলব্ধতা ছাড়াও, কার্নেল মডিউলগুলি কে তাদের মালিকানাধীন (SOC বিক্রেতা বা ODM) দ্বারা শ্রেণীবদ্ধ করা যেতে পারে। কার্নেল মডিউল ব্যবহার করা হলে, ফাইল সিস্টেমে তাদের বসানোর প্রয়োজনীয়তা নিম্নরূপ:

  • সমস্ত কার্নেলে পার্টিশন বুটিং এবং মাউন্ট করার জন্য অন্তর্নির্মিত সমর্থন থাকা উচিত।
  • কার্নেল মডিউল একটি শুধুমাত্র-পঠন পার্টিশন থেকে লোড করা আবশ্যক।
  • যাচাইকৃত বুট করার জন্য প্রয়োজনীয় ডিভাইসগুলির জন্য, যাচাইকৃত পার্টিশন থেকে কার্নেল মডিউলগুলি লোড করা উচিত।
  • কার্নেল মডিউলগুলি /system অবস্থিত হওয়া উচিত নয়।
  • ডিভাইসের জন্য প্রয়োজনীয় GKI মডিউলগুলি /system/lib/modules থেকে লোড করা উচিত যা /system_dlkm/lib/modules এর প্রতীকী লিঙ্ক।
  • সম্পূর্ণ অ্যান্ড্রয়েড বা চার্জার মোডের জন্য প্রয়োজনীয় SoC বিক্রেতার কার্নেল মডিউলগুলি /vendor/lib/modules এ থাকা উচিত।
  • যদি একটি ODM পার্টিশন বিদ্যমান থাকে, ODM থেকে কার্নেল মডিউলগুলি যা সম্পূর্ণ অ্যান্ড্রয়েড বা চার্জার মোডের জন্য প্রয়োজন তা /odm/lib/modules এ অবস্থিত হওয়া উচিত। অন্যথায়, এই মডিউলগুলি /vendor/lib/modules এ অবস্থিত হওয়া উচিত।
  • রিকভারি মোডের জন্য প্রয়োজনীয় SoC ভেন্ডর এবং ODM থেকে কার্নেল মডিউলগুলি /lib/modules এ রিকভারি ramfs এ থাকা উচিত।
  • পুনরুদ্ধার মোড এবং সম্পূর্ণ অ্যান্ড্রয়েড বা চার্জার মোড উভয়ের জন্যই প্রয়োজনীয় কার্নেল মডিউলগুলি পুনরুদ্ধার rootfs এবং /vendor বা /odm পার্টিশন উভয়ই থাকা উচিত (উপরে বর্ণিত)।
  • পুনরুদ্ধার মোডে ব্যবহৃত কার্নেল মডিউলগুলি শুধুমাত্র /vendor বা /odm এ অবস্থিত মডিউলগুলির উপর নির্ভর করবে না, কারণ এই পার্টিশনগুলি পুনরুদ্ধার মোডে মাউন্ট করা হয় না।
  • SoC বিক্রেতা কার্নেল মডিউলগুলি ODM কার্নেল মডিউলগুলির উপর নির্ভর করবে না।

অ্যান্ড্রয়েড 7.x এবং নিম্নতর সংস্করণে, /vendor এবং /odm পার্টিশনগুলি প্রথম দিকে মাউন্ট করা হয় না । অ্যান্ড্রয়েড 8.x এবং উচ্চতর সংস্করণে, এই পার্টিশনগুলি থেকে মডিউল লোড করা সম্ভব করার জন্য, নন-A/B এবং A/B উভয় ডিভাইসের জন্যই পার্টিশনগুলিকে তাড়াতাড়ি মাউন্ট করার বিধান করা হয়েছে। এটি নিশ্চিত করে যে পার্টিশনগুলি Android এবং চার্জার উভয় মোডে মাউন্ট করা হয়েছে।

অ্যান্ড্রয়েড বিল্ড সিস্টেম সমর্থন

BoardConfig.mk এ, অ্যান্ড্রয়েড বিল্ড একটি BOARD_VENDOR_KERNEL_MODULES ভেরিয়েবলকে সংজ্ঞায়িত করে যা ভেন্ডর ইমেজের উদ্দেশ্যে কার্নেল মডিউলগুলির একটি সম্পূর্ণ তালিকা প্রদান করে। এই ভেরিয়েবলে তালিকাভুক্ত মডিউলগুলি /lib/modules/ এ বিক্রেতার ছবিতে অনুলিপি করা হয় এবং, Android এ মাউন্ট করার পরে, /vendor/lib/modules এ উপস্থিত হয় (উপরের প্রয়োজনীয়তা অনুসারে)। বিক্রেতা কার্নেল মডিউলগুলির উদাহরণ কনফিগারেশন:

vendor_lkm_dir := device/$(vendor)/lkm-4.x
BOARD_VENDOR_KERNEL_MODULES := \
  $(vendor_lkm_dir)/vendor_module_a.ko \
  $(vendor_lkm_dir)/vendor_module_b.ko \
  $(vendor_lkm_dir)/vendor_module_c.ko

এই উদাহরণে, একটি বিক্রেতা কার্নেল মডিউল প্রি-বিল্ট রিপোজিটরি উপরে তালিকাভুক্ত অবস্থানে Android বিল্ডে ম্যাপ করা হয়েছে।

পুনরুদ্ধার চিত্রটিতে বিক্রেতা মডিউলগুলির একটি উপসেট থাকতে পারে। Android বিল্ড এই মডিউলগুলির জন্য পরিবর্তনশীল BOARD_RECOVERY_KERNEL_MODULES সংজ্ঞায়িত করে৷ উদাহরণ:

vendor_lkm_dir := device/$(vendor)/lkm-4.x
BOARD_RECOVERY_KERNEL_MODULES := \
  $(vendor_lkm_dir)/vendor_module_a.ko \
  $(vendor_lkm_dir)/vendor_module_b.ko

অ্যান্ড্রয়েড বিল্ড /vendor/lib/modules এবং /lib/modules ( recovery ramfs ) এ প্রয়োজনীয় modules.dep ফাইল তৈরি করতে depmod চালানোর যত্ন নেয়।

মডিউল লোডিং এবং সংস্করণ

modprobe -a ব্যবহার করে init.rc* থেকে একটি পাসে সমস্ত কার্নেল মডিউল লোড করুন। এটি modprobe বাইনারির জন্য বারবার সি রানটাইম পরিবেশ শুরু করার ওভারহেড এড়ায়। modprobe চালু করার জন্য early-init ইভেন্টটি পরিবর্তন করা যেতে পারে:

on early-init
    exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \
        /vendor/lib/modules module_a module_b module_c ...

সাধারণত, একটি কার্নেল মডিউল যে কার্নেলের সাথে মডিউলটি ব্যবহার করা হবে তার সাথে কম্পাইল করা আবশ্যক (অন্যথায় কার্নেল মডিউলটি লোড করতে অস্বীকার করে)। CONFIG_MODVERSIONS অ্যাপ্লিকেশান বাইনারি ইন্টারফেসে (ABI) ব্রেকেজ সনাক্ত করে একটি সমাধান প্রদান করে৷ এই বৈশিষ্ট্যটি কার্নেলের প্রতিটি রপ্তানি করা প্রতীকের প্রোটোটাইপের জন্য একটি চক্রীয় রিডানডেন্সি চেক (CRC) মান গণনা করে এবং কার্নেলের অংশ হিসাবে মানগুলি সংরক্ষণ করে; কার্নেল মডিউল দ্বারা ব্যবহৃত চিহ্নগুলির জন্য, মানগুলি কার্নেল মডিউলেও সংরক্ষণ করা হয়। যখন মডিউল লোড করা হয়, মডিউল দ্বারা ব্যবহৃত চিহ্নগুলির মানগুলি কার্নেলের সাথে তুলনা করা হয়। মান মেলে, মডিউল লোড করা হয়; অন্যথায় লোড ব্যর্থ হয়।

ভেন্ডর ইমেজ থেকে আলাদাভাবে কার্নেল ইমেজ আপডেট করতে, CONFIG_MODVERSIONS সক্রিয় করুন। এটি করার ফলে ভেন্ডর ইমেজে বিদ্যমান কার্নেল মডিউলগুলির সাথে সামঞ্জস্য বজায় রেখে কার্নেলের ছোট আপডেটগুলি (যেমন LTS থেকে বাগ ফিক্স) করা যাবে। যাইহোক, CONFIG_MODVERSIONS নিজেই একটি ABI ব্রেকেজ ঠিক করে না। যদি কার্নেলে রপ্তানি করা প্রতীকের প্রোটোটাইপ পরিবর্তন হয়, হয় উৎসের পরিবর্তনের কারণে বা কার্নেল কনফিগারেশন পরিবর্তিত হওয়ার কারণে, এটি সেই চিহ্নটি ব্যবহার করে এমন কার্নেল মডিউলগুলির সাথে সামঞ্জস্য নষ্ট করে। এই ধরনের ক্ষেত্রে, কার্নেল মডিউল পুনরায় কম্পাইল করা আবশ্যক।

উদাহরণস্বরূপ, কার্নেলের task_struct কাঠামো ( include/linux/sched.h এ সংজ্ঞায়িত) কার্নেল কনফিগারেশনের উপর নির্ভর করে শর্তসাপেক্ষে অন্তর্ভুক্ত অনেক ক্ষেত্র রয়েছে। CONFIG_SCHED_INFO সক্ষম হলেই sched_info ক্ষেত্রটি উপস্থিত থাকে (যা ঘটে যখন CONFIG_SCHEDSTATS বা CONFIG_TASK_DELAY_ACCT সক্ষম করা হয়)। এই কনফিগারেশন বিকল্পগুলির অবস্থা পরিবর্তন হলে, task_struct কাঠামোর বিন্যাস পরিবর্তিত হয় এবং task_struct ব্যবহারকারী কার্নেল থেকে রপ্তানি করা ইন্টারফেসগুলি পরিবর্তন করা হয় (উদাহরণস্বরূপ, kernel/sched/core.cset_cpus_allowed_ptr )। পূর্বে কম্পাইল করা কার্নেল মডিউলগুলির সাথে সামঞ্জস্য যা এই ইন্টারফেসগুলি ব্রেক ব্যবহার করে, সেই মডিউলগুলিকে নতুন কার্নেল কনফিগারেশনের সাথে পুনর্নির্মাণ করতে হবে।

CONFIG_MODVERSIONS সম্পর্কে আরো বিস্তারিত জানার জন্য, Documentation/kbuild/modules.rst এ কার্নেল ট্রি-তে থাকা ডকুমেন্টেশন পড়ুন।