GKI için ION yığınlarını modüler hale getir

Birçok Android OEM, ION çekirdek sürücüsünü çeşitli nedenlerle değiştirir. Örneğin: satıcı yığınlarını ekleme ve önbellek yönetimini özelleştirme (bununla ilgili ayrıntılı bilgi daha fazla bilgi için ION belleğini entegre etme ayırıcı) olduğunu unutmayın. OEM'lerin aşağıdakileri yapmasına izin vermek için: Genel Çekirdek Görüntüyü kullanırken bu tür (GKI), Android Common Kernel v5.4, satıcıya özgü ION'ı modüler hale getirmek için bir çerçeve sunuyor yığınlar oluşturur. Aşağıdaki şekilde gösterilen Çekirdek görüntüsü düzenine sahiptir.

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 temel sürücüsü, GKI görüntüsünün bir parçası olabilir ve tüm erişmek için cihazdan bağımsız performans optimizasyonları ve hata düzeltmeleri cihazlar.
  • Ortak çekirdekteki ION çekirdek sürücüsü, yığın kaydını yönetebilir ve kullanıcı alanı ve çekirdek istemcilerinin arayüzünü yönetmek için kullanır. Tedarikçi yığını modülleri yalnızca özel yığın işlemlerini uygulamak için gereklidir.
  • ION çekirdek sürücüsü (GKI'nın bir parçası olarak) daha kolay bellek için kancalar içerebilir Bu imkan, her OEM kendi sürümüne sahip olduğunda mümkün değildi. ION sürücüsü.
  • Modüler tedarikçi ION yığınları, gelecekteki tüm geçişleri dmabuf yığınlarına yapmalıdır. daha kolay olur.
ziyaret edin.

Uygulama

ION yığın modülleri, kendi dmabuf işlemlerini kaydederek bunları geçersiz kılabilir çekirdek ION sürücüsü tarafından kaydedildi. dmabuf işlemi (ör. get_flags()) temel ION sürücüsü tarafından desteklenmeyen bir -EOPNOTSUPP gerekli geçersiz kılmalara sahip olmadığını fark ediyor.

dmabuf sürücüsü, performansı artırmak için kısmi önbellek gerçekleştirebilir. (bkz. değişiklik listesi) belirtin. Kernel istemcileri, dma_buf_begin_cpu_access_partial ve Kısmi önbellek bakımı gerçekleştirmek için dma_buf_end_cpu_access_partial işlevleri.

Android Common Kernel'da sistemin modüler uygulamalarını ve yığın için referans olarak kullanılacak bitişik bellek ayırıcı (CMA) yığınları bir yöntem de var.

ION UAPI başlığındaki değişiklikler

ION kullanıcı alanı API (UAPI) başlığı, şurada kullanılmak üzere bir ion_heap_id sıralaması içerir: tedarikçi firma yığınları tarafından kullanılacak bir dizi yığın kimliği tanımlamalıdır.

 /**
 * 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),
};

Ayrıca, yeni bir IOCTL (ION_IOC_ABI_VERSION), kullanıcı alanı istemcilerine yardımcı olabilir kullanılıp kullanılmadığını belirler.

Genel sistem yığınını geçersiz kılma

ION sistem yığını yerleşiktir ve GKI görüntüsünün bir parçasıdır. işlevi, genel/cihazdan bağımsız yığına erişmesi gereken varlık. Bu nedenle, ION_HEAP_SYSTEM yığın kimliğini geçersiz kılamazsınız. Alıcı: özelleştirilmiş bir sistem yığını oluşturma, özel aralıktaki yığın kimliği kullanma ayırmalar gerçekleştirmek için (ION_HEAP_CUSTOM_START - ION_HEAP_CUSTOM_END).