Birçok Android OEM'i, satıcı yığınları eklemek ve önbellek yönetimini özelleştirmek gibi çeşitli nedenlerle ION çekirdek sürücüsünü değiştirir (bu değişikliklerle ilgili ayrıntılar için ION bellek ayırıcısını entegre etme bölümüne bakın). OEM'lerin Genel Çekirdek Görüntüsünü (GKI) kullanırken bu tür değişiklikleri korumasını sağlamak için Android Common Kernel v5.4, çekirdek ION sürücüsünü yerleşik tutarken satıcıya özel ION yığınlarını modülerleştirmeye yönelik bir çerçeve sunar. Aşağıdaki şekil çekirdek görüntüsü düzenini gösterir. .
Şekil 1. Modülerleştirilmiş ION çekirdek sürücüsü
Modüler ION yığınları aşağıdaki avantajlara sahiptir.
- ION çekirdek sürücüsü, GKI görüntüsünün bir parçası olabilir ve cihazdan bağımsız performans optimizasyonlarının ve hata düzeltmelerinin tüm cihazlara ulaşmasını sağlar.
- Ortak çekirdekteki ION çekirdek sürücüsü, yığın kaydını yönetebilir ve kullanıcı alanı ile çekirdek istemcilerine yönelik arayüzü yönetebilir. Satıcı yığın modülleri yalnızca özel yığın işlemlerini uygulamak için gereklidir.
- ION çekirdek sürücüsü (GKI'nin bir parçası olarak), daha kolay bellek kullanımı takibi için kancalar içerebilir; bu, her OEM'in kendi ION sürücüsü sürümüne sahip olması durumunda mümkün değildi.
- Modüler satıcı ION yığınları, gelecekte
dmabuf
yığınlarına geçişleri kolaylaştıracaktır.
Uygulama
ION yığın modülleri, çekirdek ION sürücüsü tarafından kaydedilenleri geçersiz kılmak için kendi dmabuf
işlemlerini kaydedebilir. Çekirdek ION sürücüsü tarafından desteklenmeyen bir dmabuf
işlemi ( get_flags()
gibi), yığın uygulamasında gerekli geçersiz kılmalar eksikse -EOPNOTSUPP
değerini döndürür.
Performansı artırmak için dmabuf
sürücüsü kısmi önbellek bakımı gerçekleştirebilir (bkz. değişiklik listesi ). Çekirdek istemcileri, kısmi önbellek bakımı gerçekleştirmek için dma_buf_begin_cpu_access_partial
ve dma_buf_end_cpu_access_partial
işlevlerini kullanabilir.
Android Common Kernel, yığın modülerleştirmesi için referans olarak kullanılmak üzere sistemin modüler uygulamalarını ve bitişik bellek ayırıcı (CMA) yığınlarını içerir.
ION UAPI başlığındaki değişiklikler
ION kullanıcı alanı API'si (UAPI) başlığı, satıcı yığınları tarafından kullanılacak bir dizi yığın kimliği tanımlamakta kullanılacak bir ion_heap_id
numaralandırması içerir.
/**
* 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),
};
Ek olarak yeni bir IOCTL
( ION_IOC_ABI_VERSION
), kullanıcı alanı istemcilerinin modüler yığınların kullanılıp kullanılmadığını belirlemesine yardımcı olabilir.
Genel sistem yığınını geçersiz kılma
ION sistem yığını yerleşiktir ve genel/cihazdan bağımsız bir yığına erişmesi gereken herhangi bir özelliğin varlığına bağlı olabilmesini sağlamak için GKI görüntüsünün bir parçasıdır. Bu nedenle, ION_HEAP_SYSTEM
yığın kimliğini geçersiz kılamazsınız. Özelleştirilmiş bir sistem yığını oluşturmak için, tahsisleri gerçekleştirmek amacıyla özel aralıkta ( ION_HEAP_CUSTOM_START
- ION_HEAP_CUSTOM_END
) bir yığın kimliği kullanın.