Kernel-Konfiguration

Verwenden Sie die folgenden Konfigurationseinstellungen als Grundlage für einen Android-Kernel Konfiguration. Die Einstellungen für android-base sind in .cfg Dateien organisiert. android-base-ARCH und android-recommended:

  • android-base-Optionen aktivieren Android-Kernfunktionen und so konfiguriert werden, wie für alle Geräte angegeben.
  • android-base-ARCH-Optionen aktivieren Kern Android-Funktionen und sollten von allen Geräten mit Architektur ARCH. Nicht alle Architekturen haben eine entsprechende Datei der architekturspezifischen, erforderlichen Optionen. Wenn Ihre Architektur nicht in einer Datei ist, hat sie keine zusätzliche architekturspezifische Kernel-Konfiguration. für Android.
  • android-recommended Diese Optionen ermöglichen erweiterte Android-Funktionen und sind für Geräte optional.

Diese Konfigurationsdateien befinden sich im kernel/configs Repository. Verwenden Sie die Konfigurationsdateien, die der Version von den Kernel, den Sie verwenden.

Weitere Informationen zu bereits ergriffenen Kontrollen zur Stärkung des Kernels auf Ihrem finden Sie unter System- und Kernel-Sicherheit. Details zu erforderlichen Einstellungen finden Sie in der Dokument zur Android-Kompatibilitätsdefinition (CDD).

Kernel-Konfiguration generieren

Verwende für Geräte mit einem minimalistischen defconfig-Format die merge_config.sh im Kernel-Baum, um Optionen zu aktivieren:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Dadurch wird eine .config-Datei erstellt, in der Sie ein neues defconfig-Datei oder kompilieren Sie einen neuen Kernel mit Android-Funktionen aktiviert.

Zusätzliche Kernel-Konfigurationsanforderungen

In einigen Fällen kann der Plattform-Betreuer aus mehreren Kernel- um eine Android-Abhängigkeit zu erfüllen. Solche Abhängigkeiten können in den Kernel-Konfigurationsfragmentdateien (wie oben beschrieben) dargestellt wird, unterstützt keine logischen Ausdrücke. In Android 9 und Kompatibilitätstest-Suite (CTS) und Die Vendor Test Suite (VTS) prüft, ob die folgende Anforderungen erfüllt werden:

  • CONFIG_OF=y oder CONFIG_ACPI=y
  • 4.4- und 4.9-Kernel haben CONFIG_ANDROID_LOW_MEMORY_KILLER=y ODER sowohl CONFIG_MEMCG=y als auch CONFIG_MEMCG_SWAP=y haben
  • CONFIG_DEBUG_RODATA=y oder CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y oder CONFIG_STRICT_MODULE_RWX=y
  • Nur für ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y oder CONFIG_ARM64_PAN=y

Darüber hinaus muss die Option CONFIG_INET_UDP_DIAG auf y für 4.9-Kernel in Android 9 und höher.

Optionen für den USB-Hostmodus aktivieren

Aktivieren Sie für Audio im USB-Hostmodus die folgenden Optionen:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Aktivieren Sie für MIDI im USB-Hostmodus die folgende Option:

CONFIG_SND_USB_MIDI=y

Seccomp BPF mit TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) ist eine Kernel-Sicherheit, die die Erstellung von Sandboxes ermöglicht, die den Kontext in ein Prozess kann Systemaufrufe durchführen. Thread-Synchronisierung (TSYNC) ermöglicht die Verwendung von Seccomp BPF aus Multithread-Programmen. Dieses Die Fähigkeit ist auf Architekturen beschränkt, die Seccomp-Upstream (ARM, ARM64, x86 und x86_64).

Android-Livelock-Daemon

Android 10 enthält den Android Live Lock-Daemon (llkd), die zum Erkennen und Beheben von Kernel-Deadlocks entwickelt wurde. Weitere Informationen zur Verwendung von llkd finden Sie unter Android-Livelock-Daemon.

vDSO32 auf ARM64

Virtual Dynamic Shared Object (vDSO) ist eine Alternative zu Systemaufrufen, bei richtiger Verwendung und Konfiguration können die Zykluskosten reduzieren. Android-Geräte Version 10 unterstützt vDSO32 auf 64-Bit-Kerneln (Android unterstützt bereits vDSO64 auf 64-Bit-Kernels und vDSO32 auf 32-Bit-Kerneln. Mit vDSO32 (CONFIG_VDSO_COMPAT) auf der ARM64-Architektur bietet eine 0,4 % längere Akkulaufzeit und andere Leistungsverbesserungen.

Die Linux-Community arbeitet aktiv vDSOs vereinheitlichen in verschiedenen Architekturen. Sie können vDSO in Ihrem Linux-Kernel einrichten, indem Sie vDSO32 mit CONFIG_COMPAT und CONFIG_CROSS_COMPILE_COMPAT_VDSO mit dem arm32-Compiler-Triplet. Das Android-Kernel-Team hat ältere Versionen der vDSO-Patch-Serie zurückportiert in Pixel-Geräte importieren. So finden Sie Beispiele in den (LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN Pfad, Referenz CROSS_COMPILE_ARM32 und CONFIG_CROSS_COMPILE_ARM32-Konfiguration).

Konfiguration mit wenig RAM

Kernel und ActivityManager abstimmen, um die direkte Rückforderung zu verringern

Die direkte Rückforderung erfolgt, wenn ein Prozess oder der Kernel versucht, eine Seite zuzuweisen (entweder direkt oder aufgrund eines Fehlers auf einer neuen Seite) und der Kernel hat den gesamten verfügbaren Arbeitsspeicher verwendet. Dies erfordert, dass der Kernel die Zuweisung blockiert. während eine Seite frei wird. Dies wiederum erfordert häufig Laufwerks-E/A, um einen schmutzige dateigestützte Seite oder warten Sie, bis lowmemorykiller eine . Dies kann zu zusätzlichen E/A-Vorgängen in jedem Thread führen, einschließlich eines UI-Threads.

Um eine direkte Rückforderung zu vermeiden, hat der Kernel Wasserzeichen, die kswapd oder Reaktivierung im Hintergrund. In diesem Thread wird versucht, Seiten freigeben, sodass ein echter Thread das nächste Mal schnell erfolgreich sein kann.

Der Standardgrenzwert für die Rückforderung des Hintergrunds ist relativ niedrig, etwa 2 MB auf einem 2 GB-Gerät und 636 KB auf einem 512 MB-Gerät. Die Kernel gibt nur wenige Megabyte Arbeitsspeicher im Hintergrund zurück. Das bedeutet, kann jeder Prozess, der schnell mehr als ein paar Megabyte zuweist, und dann auf direkte Rückforderung.

Unterstützung für eine abstimmbare Kernel-Einstellung wird im Kernel-Zweig von Android-3.4 wie folgt hinzugefügt: patch 92189d47f66c67e5fd92eafaa287e153197a454f ("Zusätzliche kostenlose KB hinzufügen" abstimmbar“). Wenn Sie diesen Patch im Kernel eines Geräts auswählen, ActivityManager, um den Kernel anzuweisen, drei Vollbildanzeigen zu erhalten 32 bpp Puffer kostenloser.

Diese Schwellenwerte können mit dem config.xml konfiguriert werden Framework.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value increases the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value increases the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller einstellen

ActivityManager konfiguriert die Schwellenwerte der LowMemoryKiller entsprechend den Erwartungen an die Arbeitsgruppe dateigestützten Seiten (im Cache gespeicherten Seiten), die zum Ausführen der Prozesse mit jeder Priorität erforderlich sind auf Ebene des Buckets. Wenn ein Gerät hohe Anforderungen an den Arbeitsbereich stellt, z. B. wenn die Anbieter-UI mehr Speicher benötigt oder weitere Dienste hinzugefügt wurden, können erhöht werden.

Die Grenzwerte können reduziert werden, wenn zu viel Arbeitsspeicher für dateigestützten Seiten, sodass Hintergrundprozesse lange vor dem dass der Cache zu klein wird, um das Laufwerk zu fälschen.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value keeps more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value causes the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value
keeps more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>