Wielu producentów OEM z Androidem modyfikuje sterownik jądra ION z różnych powodów, na przykład: dodawania stosu dostawców i dostosowania zarządzania pamięcią podręczną (szczegółowe informacje na temat tych na temat wprowadzania modyfikacji, zapoznaj się z sekcją na temat integrowania pamięci ION ). Aby umożliwić producentom OEM zachowywanie takich modyfikacji przy korzystaniu z ogólnego obrazu jądra systemu (GKI), Android System Common Jądro w wersji 5.4 wprowadza platformę do modularyzacji ION dla konkretnego dostawcy przy jednoczesnym zachowaniu głównego sterownika ION. Na rysunku poniżej przedstawiono wartości i układu obrazu jądra.
Rysunek 1. Modułowy sterownik jądra ION
Modułowe sterty ION mają następujące zalety.
- Główny sterownik ION może być częścią obrazu GKI, co umożliwia korzystanie ze wszystkich optymalizacje wydajności niezależnie od urządzenia i poprawki błędów, urządzenia.
- Główny sterownik ION we wspólnym jądrze obsługuje rejestrację sterty i do zarządzania interfejsem przestrzeni użytkownika i klientów jądra systemu operacyjnego. Moduły sterty dostawcy są wymagane tylko do implementacji niestandardowych operacji stosu.
- Główny sterownik ION (w ramach GKI) może zawierać haczyki, które ułatwiają korzystanie z pamięci śledzenia użytkowania, co nie było możliwe, gdy każdy OEM miał własną wersję sterownika ION.
- Modułowe sterty ION dostawcy powinny w przyszłości przenosić się na sterty
dmabuf
.
Implementacja
Moduły sterty ION mogą rejestrować własne operacje dmabuf
, aby zastąpić te
zarejestrowany przez podstawowy sterownik ION. Operacja dmabuf
(np. get_flags()
)
nieobsługiwany przez podstawowy sterownik ION zwraca wartość -EOPNOTSUPP
, jeśli sterta
w implementacji nie ma wymaganych zastąpień.
Aby zwiększyć wydajność, sterownik dmabuf
może częściowo korzystać z pamięci podręcznej
konserwacji (zobacz
lista zmian).
Klienty jądra mogą używać interfejsów dma_buf_begin_cpu_access_partial
oraz
dma_buf_end_cpu_access_partial
wykonuje częściową konserwację pamięci podręcznej.
Wspólne jądro Androida zawiera modułowe implementacje systemu sterty przydziału pamięci (CMA) do użycia jako odniesienie do stosu modularyzację.
Zmiany w nagłówku ION UAPI
Nagłówek interfejsu użytkownika ION (UAPI) zawiera wyliczenie ion_heap_id
do wykorzystania w
zdefiniowanie zakresu identyfikatorów stosu do użycia przez sterty dostawców.
/**
* 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),
};
Ponadto nowy IOCTL
(ION_IOC_ABI_VERSION
) może pomóc klientom przestrzeni użytkownika
określać, czy używane są sterty modułowe.
Zastąpienie ogólnej sterty systemu
Stos systemu ION jest wbudowany i stanowi część obrazu GKI, dzięki czemu
funkcja wymagająca dostępu do stosu ogólnej/zależnej od urządzenia może zależeć od
swojego istnienia. Dlatego nie można zastąpić identyfikatora stosu ION_HEAP_SYSTEM
. Do
Utwórz niestandardową stertę systemową, użyj identyfikatora stosu z zakresu niestandardowego
(od ION_HEAP_CUSTOM_START
do ION_HEAP_CUSTOM_END
), by przeprowadzić alokacje.