دو نوع واحد هسته وجود دارد: مستقل از سختافزار واحدهای GKI و وابسته به سختافزار واحدهای فروشنده. این صفحه نمای کلی از هر دو نوع ماژول را ارائه میدهد.
واحدهای GKI
از واحدهای تصویر هسته عمومی (GKI) برای ارائه قابلیتهای هسته غیرضروری برای راهاندازی جدا از هسته اصلی عمومی استفاده میشود. با واحدهای GKI، میتوانید قابلیتهای هسته خاصی را برای استفاده انتخاب کنید، که اغلب باعث کاهش اندازه تصویر هسته و مصرف حافظه زمان اجرا میشود. کاهش اندازه باعث میشود GKI برای دستگاههای Android Go و دیگر ضریبهای شکل با منابع محدود بسیار مناسب باشد.
واحدهای GKI همچنین سازوکاری را فراهم میکنند که به فروشندگان امکان میدهد ویژگیهای جدید بالادستی را پساز نقطه عطف ثابت شدن KMI اضافه کنند. کد داخلی را نمیتوان بدون ساختن تصویری دیگر جایگزین کرد، درحالیکه کد ارائهشده بهعنوان یک ماژول را میتوان با ماژول دیگری جایگزین کرد.
واحدهای GKI از زیرساخت امضای زمان ساخت هسته برای تمایز بین GKI و سایر واحدها در زمان اجرا استفاده میکنند. بار کردن ماژولهای امضانشده مجاز است بهشرطی که فقط از نمادهایی استفاده کنند که در فهرست مجازها وجود دارد یا توسط دیگر ماژولهای امضانشده ارائه شده است.
دو نوع منطقی واحد GKI وجود دارد: واحد GKI محافظتشده و واحد GKI محافظتنشده.
پیمانه GKI محافظتشده
یک ماژول GKI محافظتشده توسط Google ارائه میشود، به هیچ وجه محدود نیست، و پساز بارگیری، طوری رفتار میکند که گویی با هسته ساخته شده است. علاوهبراین، واحدهای GKI حفاظتشده ویژگیهای زیر را دارند:
- واحدهای GKI محافظتشده به نمادهای هسته غیر KMI که برای واحدهای فروشنده یا واحدهای GKI محافظتنشده دردسترس نیستند دسترسی دارند.
- واحدهای GKI محافظتشده میتوانند نمادهایی را صادر کنند که بخشی از سطح KMI میشوند بهشرطی که آن نمادها در فهرست نمادها ذکر شده باشند.
- واحدهای GKI محافظتشده نمیتوانند توسط واحدهای فروشنده ملغی شوند.
واحد GKI محافظتشده کلاس پیشفرض واحدهای GKI است. همه واحدهای GKI در زمان توقف KMI محافظتشده درنظر گرفته میشوند.
واحد GKI محافظتنشده
یک ماژول GKI محافظتنشده میتواند توسط یک ماژول فروشنده لغو شود. پساز توقف KMI، اگر تیم GKI تصمیم بگیرد که فروشندگان باید پیادهسازی پیشفرض را با نسخهای که شامل ویژگیهای جدید از Linux بالادستی است لغو کنند، ممکن است یک ماژول GKI محافظتشده بهعنوان محافظتنشده طبقهبندی شود. در نسخه بعدی GKI، واحدهای محافظتنشده پساز اینکه کد بالادستی در «هسته مشترک Android» (ACK) قرار گرفت، دوباره بهعنوان محافظتشده طبقهبندی میشوند. واحدهای GKI محافظتنشده ویژگیهای زیر را دارند:
- ماژولهای GKI محافظتنشده همان دسترسی به نمادهای صادرشده را دارند که ماژولهای فروشنده دارند.
- واحدهای GKI محافظتنشده نمیتوانند نمادهای صادرشده توسط واحدهای GKI محافظتشده را صادر کنند.
- واحدهای GKI محافظتنشده باید همه میاناهای KMI را بهگونهای حفظ کنند که انگار بخشی از هسته اصلی هستند.
- واحدهای GKI محافظتنشده میتوانند توسط واحدهای فروشنده ملغی شوند.
واحدهای فروشنده
واحد فروشنده توسط شرکا برای پیادهسازی قابلیتهای SoC و مختص دستگاه ارائه میشود. هر واحد هسته موجودی که بهعنوان بخشی از هسته GKI ارائه نشده باشد، میتواند بهعنوان واحد فروشنده ارائه شود.
ازآنجاییکه یکی از اهداف اصلی پروژه GKI به حداقل رساندن کد سختافزار ویژه در هسته اصلی است، فروشندگان میتوانند انتظار داشته باشند که هسته GKI شامل واحدهایی که بهوضوح سختافزار خودشان را مدیریت میکنند نباشد. برای مثال، شرکت فروشنده ABC میتواند انتظار داشته باشد که پیکربندیهایی مثل
CONFIG_ABC_SOC_SUPPORT بدون پشتیبانی آن شرکت، بهعنوان ماژولهای GKI داخلی یا بارشدنی فعال نشوند.
اگر یک چارچوب یا درایور هسته در ACK وجود داشته باشد، اما بهعنوان بخشی از هسته GKI ارائه نشود، فروشندگان میتوانند درایور را تغییر دهند و آن را بهعنوان واحد فروشنده ارائه دهند. اینگونه تغییرات برای واحدهای غیرخاص فروشنده توصیه نمیشود
زیرا قابلیتهای مشابه ممکن است در نسخه آینده با هسته GKI ارائه شود. وقتی هسته GKI حاوی قابلیتهای ارائهشده توسط واحد
تأمینکننده باشد، واحد تأمینکننده بار نمیشود. برای مثال،
CONFIG_GREYBUS برای GKI در Android 11 تنظیم نشده است، بنابراین
فروشندگان ممکن است واحدهای فروشنده greybus ارائه دهند. بااینحال، CONFIG_GREYBUS ممکن است بهعنوان GKI داخلی یا واحد در Android 12 فعال باشد، در این صورت واحدهای فروشنده greybus بار نخواهد شد. روال مطلوب این است که از نسخه بالادستی درایورهای غیرخاص فروشنده استفاده شود، اگر بهعنوان واحدهای فروشنده ارائه شده باشند.
میتوانید واحدهای فروشنده را در vendor یا
vendor_boot
تصویر ارائه دهید. واحدهای موردنیاز در مراحل اولیه فرایند راهاندازی باید در vendor_boot باشند.
هزینه زمان راهاندازی مرتبط با بار کردن ماژولها از vendor_boot وجود دارد.