GKI için ION Yığınlarının Modülerleştirilmesi

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. .

Modüler ION Yığınları

Ş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.