modularyzować sterty ION dla GKI;

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.

Modułowe sterty ION

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.