ION ABI değişiklikleri

4.14 ve üzeri çekirdekleri taşıyan cihazlar, ION çekirdek modülünün önemli bir yeniden düzenlenmesinden etkilenmektedir. Bu değişikliklerden çoğu tedarikçi grafik ayırıcı (gralloc) donanım soyutlama katmanı (HAL) uygulaması tarafından paylaşılan bellek arabelleklerinin ayrılması için çağrı yapılır. Bu sayfada, eski tedarikçi kodunu ION'un yeni sürümüne taşımayla ilgili yol gösterici bilgiler verilmektedir ve gelecekte uygulama ikili program arayüzünde (ABI) yaşanabilecek olası kesintiler ele alınmaktadır.

ION hakkında

ION, yayın öncesi çekirdeğin devam eden çalışmaları kapsamındaki hazırlık ağacının bir parçasıdır. Hazırlık sırasında ION'ın kullanıcı alanı-çekirdek ABI'si, ana çekirdek sürümleri arasında kesilebilir. ION ABI'deki kesintiler, sıradan uygulamaları veya kullanıma sunulmuş cihazları doğrudan etkilemez. Ancak yeni ana çekirdek sürümlerine geçen tedarikçiler, ION'u çağıran tedarikçi kodunu etkileyen değişikliklerle karşılaşabilir. Ayrıca, Android sistemleri ekibi ION'ı hazırlık ağacından taşımak için yukarı akışla birlikte çalışırken ileride ABI araları yaşanabilir.

android-4.14'teki değişiklikler

Çekirdek 4.12, ION çekirdek kodunu büyük ölçüde yeniden yapılandırdı ve ION'un diğer çekirdek çerçeveleriyle örtüşen bölümlerini temizleyip kaldırdı. Bu nedenle, birçok eski ION ioctl artık alakalı değildir ve kaldırılmıştır.

ION istemcilerinin ve herkese açık kullanıcı adlarının kaldırılması

Çekirdek 4.12'den önce /dev/ion açıldığında bir ION istemcisi ayrılırdı. ION_IOC_ALLOC ioctl yeni bir arabelleğe ayırdı ve bunu ION handle (yalnızca onu ayıran ION istemcisi için anlamlı olan opak bir tam sayı) olarak kullanıcı alanına döndürdü. Tamponları kullanıcı alanıyla eşlemek veya diğer işlemlerle paylaşmak için ION tutma yerleri, ION_IOC_SHARE ioctl kullanılarak dma-buf fD olarak yeniden dışa aktarıldı.

4.12 çekirdeğinde ION_IOC_ALLOC ioctl, dma-buf fd'lerini doğrudan çıkışa aktarır. ION tutamaçlarını kullanan veya üreten tüm ioctl'larla birlikte ara ION tutamaç durumu kaldırıldı. dma-buf fd'leri belirli ION istemcilerine bağlı olmadığından ION_IOC_SHARE ioctl artık gerekli değildir ve tüm ION istemci altyapısı kaldırılmıştır.

Önbellek tutarlılığı ioctl'lerinin eklenmesi

4.12 çekirdeğinden önce ION, dosya tanımlayıcısını hafızayla senkronize etmek için bir ION_IOC_SYNC ioctl sağladı. Bu ioctl, yetersiz dokümante edilmiş ve esnek değildi. Sonuç olarak, birçok tedarikçi firma önbellek bakımını gerçekleştirmek için özel ioctl'lar uyguladı.

Kernel 4.12, ION_IOC_SYNC öğesini linux/dma-buf.h içinde tanımlanan DMA_BUF_IOCTL_SYNC ioctl ile değiştirdi. Her CPU erişiminin başında ve sonunda, bu erişimlerin okuma ve/veya yazma olup olmadığını belirten işaretlerle DMA_BUF_IOCTL_SYNC işlevini çağırın. DMA_BUF_IOCTL_SYNC, ION_IOC_SYNC ürününden daha ayrıntılı olsa da kullanıcı alanına temel önbellek bakım işlemleri üzerinde daha fazla kontrol sağlar.

DMA_BUF_IOCTL_SYNC, çekirdeğin kararlı ABI'sinin bir parçasıdır ve ION tarafından ayrılmış olup olmamalarına bakılmaksızın tüm dma-buf fd'leriyle kullanılabilir.

Tedarikçi firma kodunu android-4.12 ve sonraki sürümlere taşıma

Android sistem ekibi, kullanıcı alanı istemcileri için ioctl() çağrılarını açık kodlamak yerine libion kullanmanızı önemle tavsiye eder. libion, Android 9'dan itibaren çalışma zamanında ION ABI'yı otomatik olarak tespit edip çekirdekler arasındaki farklılıkları maskelemeye çalışır. Ancak ion_user_handle_t işleyicilerini üreten veya tüketen libion işlevleri artık çekirdek 4.12'den sonra çalışmamaktadır. Bu işlevleri, dma-buf fd'lerde çekirdeğin bugüne kadar tüm sürümlerinde çalışan aşağıdaki eşdeğer işlemlerle değiştirebilirsiniz.

Eski ion_user_handle_t çağrısı Eşdeğer dma-buf fd çağrısı
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) Yok (bu çağrı, dma-buf fds için gerekli değildir)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) Yok (dma-buf fds ile bu çağrıya gerek yoktur)
ion_sync_fd(ion_fd, buf_fd)
If (ion_is_legacy(ion_fd))
    ion_sync_fd(ion_fd, buf_fd);
else
    ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

Çekirdek içi istemciler için ION artık çekirdeğe yönelik API'leri dışa aktarmadığından, daha önce ion_import_dma_buf_fd() ile çekirdek içi ION çekirdek API'sini kullanan sürücüler, dma_buf_get() ile çekirdek içi dma-buf API'sini kullanacak şekilde dönüştürülmelidir.

Gelecekteki ION ABI araları

ION'un hazırlık ağacından çıkarılabilmesi için gelecekteki çekirdek sürümlerinde ION ABI'nin tekrar kaldırılması gerekebilir. Android sistem ekibi, bu değişikliklerin bir sonraki Android sürümüyle kullanıma sunulan cihazları etkileyeceğini beklemiyor ancak bu tür değişiklikler sonraki Android sürümleriyle kullanıma sunulan cihazları etkileyebilir.

Örneğin yukarı akış topluluğu, cihazların her bir yığına farklı SELinux politikaları uygulayabilmesi için tek /dev/ion düğümünü yığın başına birden fazla düğüme (örneğin, /dev/ion/heap0) bölmeyi önermiştir. Bu değişiklik gelecekteki bir çekirdek sürümünde uygulanırsa ION ABI'yı bozar.