İyon ABI Değişiklikleri

Çekirdek 4.14 ve üzerini gönderen cihazlar, birçok satıcı grafik bellek ayırıcı (gralloc) donanım soyutlama katmanı (HAL) uygulamasının paylaşılan bellek arabelleklerini tahsis etmek için çağırdığı Ion çekirdek modülünün büyük bir yeniden düzenlenmesinden etkilenir. Bu makale, eski satıcı kodunun Ion'un yeni sürümüne geçirilmesi konusunda rehberlik sağlar ve gelecekteki olası uygulama ikili arayüzü (ABI) kesintilerini tartışır.

İyon Hakkında

Ion, yukarı akış çekirdeğinin devam eden çalışma hazırlama ağacının bir parçasıdır. Hazırlama sırasında Ion'un kullanıcı alanından çekirdeğe ABI'si ana çekirdek sürümleri arasında kesintiye uğrayabilir. Ion ABI kesintileri sıradan uygulamaları veya halihazırda başlatılan cihazları doğrudan etkilemezken , yeni ana çekirdek sürümlerine geçiş yapan satıcılar, Ion'a çağrılan satıcı kodunu etkileyen değişikliklerle karşılaşabilir. Ek olarak, Android sistem ekibi Ion'u hazırlama ağacından çıkarmak için yukarı akışla birlikte çalışırken gelecekte ABI kesintileri meydana gelebilir.

Android-4.14'teki değişiklikler

Çekirdek 4.12, Ion çekirdek kodunu büyük ölçüde yeniden düzenleyerek Ion'un diğer çekirdek çerçeveleriyle örtüşen kısımlarını temizleyip kaldırdı. Sonuç olarak, birçok eski İon ioctl'si artık geçerli değildir ve kaldırılmıştır.

Ion istemcilerinin ve tanıtıcılarının kaldırılması

Çekirdek 4.12'den önce, /dev/ion açılması bir Ion istemcisi ayırdı. ION_IOC_ALLOC ioctl yeni bir arabellek tahsis etti ve onu bir Ion tanıtıcısı (yalnızca onu tahsis eden Ion istemcisi için anlamlı olan opak bir tamsayı) olarak kullanıcı alanına geri döndürdü. Tamponları kullanıcı alanına eşlemek veya bunları diğer işlemlerle paylaşmak için Ion tutamaçları, ION_IOC_SHARE ioctl kullanılarak dma-buf fds olarak yeniden dışa aktarıldı.

Çekirdek 4.12'de, ION_IOC_ALLOC ioctl doğrudan dma-buf fds'nin çıktısını verir. İyon tutamaçlarını tüketen veya üreten tüm ioctl'lerle birlikte ara İyon tutamacı durumu da kaldırıldı. Dma-buf fd'leri belirli Ion istemcilerine bağlı olmadığından, ION_IOC_SHARE ioctl'ye artık gerek yoktur ve tüm Ion istemci altyapısı kaldırılmıştır.

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

Çekirdek 4.12'den önce Ion, dosya tanımlayıcıyı bellekle senkronize etmek için bir ION_IOC_SYNC ioctl sağlıyordu. Bu ioctl yeterince belgelenmemiş ve esnek değildi. Sonuç olarak birçok satıcı, önbellek bakımı gerçekleştirmek için özel ioctl'ler uyguladı.

Çekirdek 4.12, ION_IOC_SYNC linux/dma-buf.h'de tanımlanan DMA_BUF_IOCTL_SYNC ioctl ile değiştirdi. Her CPU erişiminin başında ve sonunda DMA_BUF_IOCTL_SYNC , bu erişimlerin okuma ve/veya yazma olup olmadığını belirten bayraklarla birlikte çağırın. DMA_BUF_IOCTL_SYNC , ION_IOC_SYNC daha ayrıntılı olmasına rağmen, kullanıcıya 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 tahsis edilmiş olsun veya olmasın tüm dma-buf fd'leriyle kullanılabilir.

Satıcı kodunu Android-4.12+ sürümüne geçirme

Kullanıcı alanı istemcileri için, Android sistem ekibi, açık kodlu ioctl() çağrıları yerine libion ​​kullanılmasını şiddetle tavsiye eder. Android 9'dan itibaren libion, Ion ABI'yi çalışma zamanında otomatik olarak algılar ve çekirdekler arasındaki farkları maskelemeye çalışır. Ancak ion_user_handle_t tanıtıcılarını üreten veya tüketen libion ​​işlevleri artık çekirdek 4.12'den sonra çalışmıyor. Bu işlevleri, bugüne kadar çekirdeğin tüm sürümlerinde çalışan dma-buf fds üzerinde 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 (dma-buf fds ile bu çağrıya gerek yoktur)
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 herhangi bir API'yi dışa aktarmadığından, daha önce ion_import_dma_buf_fd() ile çekirdek içi Ion çekirdek API'sini kullanan sürücülerin dma_buf_get() ile çekirdek içi dma-buf API'sini kullanacak şekilde dönüştürülmesi gerekir.

Gelecekteki İyon ABI kırılmaları

Ion'un hazırlama ağacından çıkarılmadan önce gelecekteki çekirdek sürümlerinin Ion ABI'yi tekrar kırması gerekebilir. Android sistemleri ekibi, bu değişikliklerin bir sonraki Android sürümüyle başlatılan cihazları etkilemesini beklemiyor ancak bu tür değişiklikler, sonraki Android sürümleriyle başlatılan cihazları etkileyebilir.

Örneğin, yukarı akış topluluğu, aygıtların her bir yığına farklı SELinux ilkeleri uygulamasını sağlamak için tek /dev/ion düğümünü yığın başına birden fazla düğüme (örneğin, /dev/ion/heap0 ) bölmeyi önerdi. Bu değişiklik gelecekteki bir çekirdek sürümünde uygulanırsa Ion ABI'yi bozacaktır.