بسیاری از OEM های اندرویدی درایور هسته ION را به دلایل مختلف تغییر می دهند، مانند اضافه کردن انبوه فروشنده و سفارشی کردن مدیریت حافظه پنهان (برای جزئیات بیشتر در مورد این تغییرات، به یکپارچه سازی تخصیص دهنده حافظه ION مراجعه کنید). برای فعال کردن OEM ها برای حفظ چنین تغییراتی در هنگام استفاده از تصویر هسته عمومی (GKI) ، Android Common Kernel نسخه 5.4 چارچوبی را برای مدولار کردن انبوه های یون خاص فروشنده و در عین حال داخلی نگه داشتن درایور هسته ION معرفی می کند. شکل زیر طرح بندی تصویر هسته را نشان می دهد. .
شکل 1. درایور هسته ION مدولار شده
پشته های ION مدولار دارای مزایای زیر هستند.
- درایور هسته ION میتواند بخشی از تصویر GKI باشد و به همه بهینهسازیهای عملکرد مستقل از دستگاه و رفع اشکالها امکان دسترسی به همه دستگاهها را بدهد.
- درایور هسته ION در هسته مشترک می تواند ثبت Heap را انجام دهد و رابط کاربری فضای کاربر و مشتریان هسته را مدیریت کند. ماژول های هیپ فروشنده فقط برای اجرای عملیات هیپ سفارشی مورد نیاز هستند.
- درایور هسته ION (به عنوان بخشی از GKI) میتواند شامل قلابهایی برای ردیابی استفاده آسانتر از حافظه باشد، که وقتی هر OEM نسخه مخصوص به خود را از درایور ION داشت امکانپذیر نبود.
- پشتههای ION فروشنده مدولار باید هر گونه انتقال آینده به پشتههای
dmabuf
را آسانتر کند.
پیاده سازی
ماژول های هیپ ION می توانند عملیات dmabuf
خود را ثبت کنند تا عملیات ثبت شده توسط درایور اصلی ION را لغو کنند. یک عملیات dmabuf
(مانند get_flags()
) که توسط درایور اصلی ION پشتیبانی نمیشود، در صورتی که اجرای heap فاقد ردیابیهای لازم باشد -EOPNOTSUPP
را برمیگرداند.
برای بهبود عملکرد، درایور dmabuf
می تواند نگهداری جزئی کش را انجام دهد (به لیست تغییرات مراجعه کنید). کلاینت های کرنل می توانند از توابع dma_buf_begin_cpu_access_partial
و dma_buf_end_cpu_access_partial
برای انجام نگهداری جزئی کش استفاده کنند.
هسته مشترک Android شامل پیادهسازیهای مدولار سیستم و پشتههای تخصیص دهنده حافظه پیوسته (CMA) برای استفاده به عنوان مرجع برای مدولارسازی پشته است.
تغییرات در هدر ION UAPI
هدر فضای کاربر ION API (UAPI) حاوی یک عدد ion_heap_id
برای استفاده در تعریف طیفی از شناسههای پشته برای استفاده توسط انبوه فروشنده است.
/**
* ion_heap_id - list of heap IDs that Android can use
*
* @ION_HEAP_SYSTEM ID for the ION_HEAP_TYPE_SYSTEM
* @ION_HEAP_DMA_START Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
* @ION_HEAP_DMA_END End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
* @ION_HEAP_CUSTOM_START Start of reserved ID range for heaps of custom type
* @ION_HEAP_CUSTOM_END End of reserved ID range for heaps of custom type
*/
enum ion_heap_id {
ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),
ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),
ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),
ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};
علاوه بر این، یک IOCTL
جدید ( ION_IOC_ABI_VERSION
) میتواند به مشتریان فضای کاربر کمک کند تا تعیین کنند که آیا از پشتههای مدولار استفاده میشود یا خیر.
نادیده گرفتن پشته سیستم عمومی
پشته سیستم ION ساخته شده است و بخشی از تصویر GKI است تا اطمینان حاصل شود که هر ویژگی که نیاز به دسترسی به یک پشته عمومی/مستقل از دستگاه دارد می تواند به وجود آن بستگی داشته باشد. به این ترتیب، نمیتوانید شناسه پشته ION_HEAP_SYSTEM
را لغو کنید. برای ایجاد یک پشته سیستم سفارشی، از شناسه پشته در محدوده سفارشی ( ION_HEAP_CUSTOM_START
تا ION_HEAP_CUSTOM_END
) برای انجام تخصیص ها استفاده کنید.