ماژولهای GKI و GKI میتوانند مستقل از بقیه پارتیشن بهروزرسانی شوند، زیرا ماژولهای GKI در یک پارتیشن پویای جداگانه در ابرتصویر به نام system_dlkm قرار دارند. ماژولهای GKI توسط گوگل با استفاده از جفت کلید زمان ساخت هسته امضا میشوند و فقط با GKI که با آن ساخته شدهاند سازگار هستند. هیچ پایداری ABI بین ماژولهای GKI و GKI وجود ندارد؛ برای اینکه ماژولها در زمان اجرا به درستی بارگذاری شوند، ماژولهای GKI و GKI باید با هم ساخته و بهروزرسانی شوند.
پیادهسازی پشتیبانی از پارتیشن system_dklm
پارتیشن system_dlkm به عنوان یک پارتیشن پویای دیگر در پارتیشن super قرار دارد. این پارتیشن میتواند شامل موارد زیر باشد:
- ماژولهای کرنل امضا شده در زمان ساخت گوگل
- مصنوعات
depmod
ساخت system_dlkm
ساخت system_dlkm فرآیندی مشابه ساخت سایر پارتیشنهای پویا است. برای افزودن system_dlkm به سیستم خود، مراحل زیر را انجام دهید:
در
BoardConfig.mk، ورودیهای زیر را اضافه کنید:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkmدر لیست پارتیشنها،
system_dlkmرا اضافه کنید:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm(اختیاری) برای دستگاههای A/B و A/B مجازی، خط زیر را در فایل
device.mkدستگاه خود اضافه کنید:AB_OTA_PARTITIONS += system_dlkm
شناسایی ماژولهای هسته برای کپی کردن در system_dlkm
برای اینکه ماژولها در زمان اجرا با موفقیت بارگذاری شوند، ماژولهای GKI و GKI باید با هم ساخته شوند. بنابراین شما باید ماژولهای هسته را در ساخت GKI برای معماری هدف شناسایی کنید و آن را به عنوان منبع برای پارتیشن system_dlkm در طول ساخت پلتفرم ارائه دهید.
برای اندروید ۱۳
BOARD_SYSTEM_DLKM_SRC را به پوشهای حاوی فایلهای شیء هسته ماژولهای GKI مورد نیاز برای دستگاه، به عنوان ورودی به سیستم ساخت برای تولید پارتیشن system_dlkm ارجاع دهید. برای مثال:
منبع ماژولهای GKI را در یک پوشه قرار دهید و BOARD_SYSTEM_DLKM_SRC را به آن پوشه ارجاع دهید. برای مثال:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
در زمان ساخت، ماژولهای فهرستشده در BOARD_SYSTEM_DLKM_SRC در $ANDROID_PRODUCT_OUT/system_dlkm نصب شدهاند.
برای اندروید ۱۴
ما پیادهسازی را با استفاده از ماکروهای ( BOARD_*_KERNEL_MODULES ) که برای سایر پارتیشنهای *_dlkm استفاده میشوند، ساده کردهایم. لیست ماژولهای GKI مورد نیاز برای دستگاه باید توسط ماکروی BOARD_SYSTEM_KERNEL_MODULES ارجاع داده شود. در زمان ساخت، این ماژولها در $ANDROID_PRODUCT_OUT/system_dlkm نصب میشوند. هر ماژولی در پارتیشن vendor_dlkm که به ماژولهای موجود در پارتیشن system_dlkm وابستگی دارد، ارجاعهای صحیحی را در فایل modules.dep برای پارتیشن vendor_dlkm ایجاد میکند. به دلیل وابستگیهای بین پارتیشنی که توسط modules.dep نشان داده میشوند، هنگامی که یک ماژول vendor بارگذاری میشود، هر ماژول GKI مورد نیاز به طور خودکار بارگذاری میشود.
برای مثال، برای نصب تمام ماژولهای GKI روی پارتیشن system_dlkm برای GKI arm64 kernel 5.15 از فایلهای از پیش ساخته شده:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
مونت کردن system_dlkm در زمان اجرا
بسته به سیستم فایلی که به عنوان یک سیستم فایل فقط خواندنی استفاده میشود، دستور زیر را در fstab خود اضافه کنید تا پارتیشن system_dlkm در زمان اجرا mount شود:
ext4 به عنوان یک سیستم فایل فقط خواندنی
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs به عنوان سیستم فایل فقط خواندنی
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
نصب پارتیشن و بارگذاری ماژول
در طول first_stage_init ، پارتیشن system_dlkm در مسیر /system_dlkm به عنوان یک سیستم فایل فقط خواندنی mount میشود. در یک mount موفق، لینکهای نمادین در /system/lib/modules که به /system_dlkm/lib/modules اشاره میکنند، در دسترس هستند.
یک فرآیند فروشنده، مانند یک اسکریپت .rc ، میتواند ماژولهای هسته را بر اساس ترتیب مشخص شده در modules.load بارگذاری کند. فرآیند فروشنده باید از پیوند نمادین /system/lib/modules برای بارگذاری ماژولها استفاده کند. در صورت لزوم، فرآیند فروشنده میتواند ماژولها را در زمان دیگری نیز بارگذاری کند.
SELinux
هر فایل در پارتیشن system_dlkm با چارچوب فایل system_dlkm_file برچسبگذاری شده است. برای بارگذاری فایل ماژولهای GKI در پارتیشن system_dlkm ، فرآیند فروشنده که مسئول بارگذاری ماژولها است، به یک sepolicy در دامنه فروشنده نیاز دارد.
برای مثال، dlkm_loader که توسط Cuttlefish برای بارگذاری ماژولهای GKI استفاده میشود، مجوزهای زیر را در فایل سیاست در shared/sepolicy/vendor/dlkm_loader.te دارد:
allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;
پارتیشن system-dlkm را اعتبارسنجی کنید
گوگل یک نمونه آزمایشی GKI VTS برای تأیید پارتیشن system_dlkm ارائه میدهد. برای فراخوانی دستی این آزمایش، از دستور atest زیر استفاده کنید:
atest -c vts_dlkm_partition_test