Modularisierung von ION Heaps für GKI

Viele Android OEMs die Treiber Kernel ION ändern aus verschiedenen Gründen, wie zum Beispiel Anbieter Haufen Hinzufügen und Cache - Management - Customizing (für Details zu diesen Änderungen finden Sie in den ION Speicherzuordner Integration ). So aktivieren OEMs auf solche Änderungen beibehalten , wenn die Verwendung von Generika Kernel - Image (GKI) , Android gemeinsamen Kernel v5.4 stellt ein Framework für die Modularisierung von herstellerspezifischen ION Haufen , während der Kern ION Treiber halten eingebaut. Die folgende Abbildung zeigt das Kernel - Image - Layout .

Modulare ION Heaps

Abbildung 1. Modularisierte ION Kerneltreiber

Modulare ION-Heaps haben die folgenden Vorteile.

  • Der ION-Core-Treiber kann Teil des GKI-Images sein, sodass alle geräteunabhängigen Leistungsoptimierungen und Fehlerbehebungen alle Geräte erreichen.
  • Der ION-Core-Treiber im gemeinsamen Kernel kann die Heap-Registrierung handhaben und die Schnittstelle zu Userspace und Kernel-Clients verwalten. Die Heap-Module des Anbieters werden nur benötigt, um die benutzerdefinierten Heap-Operationen zu implementieren.
  • Der ION-Core-Treiber (als Teil der GKI) kann Hooks zur einfacheren Verfolgung der Speichernutzung enthalten, was nicht möglich war, als jeder OEM seine eigene Version des ION-Treibers hatte.
  • Modular Anbieter ION Haufen sollten alle zukünftigen Übergänge machen dmabuf Haufen einfacher.

Implementieren

ION Heap - Module können ihre eigenen Register dmabuf Operationen diejenigen durch den Kern ION Treiber registriert außer Kraft zu setzen. Ein dmabuf Betrieb (wie get_flags() ) , die nicht von dem Kern ION Treiber gibt unterstützt wird -EOPNOTSUPP wenn die Heap Implementierung der notwendigen Überschreibungen fehlt.

Zur Verbesserung der Leistung der dmabuf kann Treibers Teil - Cache - Wartung (siehe Änderungsliste ). Kernel - Clients können die Verwendung dma_buf_begin_cpu_access_partial und dma_buf_end_cpu_access_partial Funktionen Teil - Cache - Wartung durchführen.

Der Android Common Kernel enthält modulare Implementierungen des Systems und Contiguous Memory Allocator (CMA)-Heaps zur Verwendung als Referenz für die Heap-Modularisierung.

Änderungen am ION UAPI-Header

Der ION Benutzerraum API (UAPI) -Header enthält eine ion_heap_id ENUM für die Verwendung einer Reihe von Haufen IDs für die Verwendung durch Kreditoren Heaps in definieren.

 /**
 * 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),
};

Darüber hinaus wird eine neue IOCTL ( ION_IOC_ABI_VERSION kann) User - Space - Kunden helfen , festzustellen , ob modular Haufen verwendet werden.

Überschreiben des generischen Systemheaps

Der Heap des ION-Systems ist integriert und Teil des GKI-Image, um sicherzustellen, dass jede Funktion, die Zugriff auf einen generischen/geräteunabhängigen Heap benötigt, von seiner Existenz abhängen kann. Als solche können Sie die Heap - ID nicht außer Kraft setzen ION_HEAP_SYSTEM . Ein maßgeschneidertes System Heap, verwenden Sie eine Heap - ID im benutzerdefinierten Bereich (zum Erstellen ION_HEAP_CUSTOM_START zu ION_HEAP_CUSTOM_END ) Zuweisungen vorzunehmen.