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.