Configurazione del kernel

Utilizzare le seguenti impostazioni di configurazione come base per la configurazione del kernel Android. Le impostazioni sono organizzate in file .cfg per android-base , android-base- ARCH e android-recommended :

  • Le opzioni android-base abilitano le funzionalità principali di Android e devono essere configurate come specificato da tutti i dispositivi.
  • Le opzioni android-base- ARCH abilitano le funzionalità principali di Android e devono essere configurate come specificato da tutti i dispositivi con architettura ARCH . Non tutte le architetture dispongono di un file corrispondente di opzioni richieste specifiche dell'architettura. Se la tua architettura non dispone di un file, non prevede ulteriori requisiti di configurazione del kernel specifici dell'architettura per Android.
  • android-recommended . Queste opzioni abilitano funzionalità Android avanzate e sono facoltative per i dispositivi.

Questi file di configurazione si trovano nel repository kernel/configs . Utilizza l'insieme di file di configurazione che corrisponde alla versione del kernel che stai utilizzando.

Per dettagli sui controlli già intrapresi per rafforzare il kernel sui tuoi dispositivi, vedi Sicurezza del sistema e del kernel . Per informazioni dettagliate sulle impostazioni richieste, consultare il documento CDD (Android Compatibility Definition Document) .

Genera la configurazione del kernel

Per i dispositivi che hanno un formato defconfig minimalista, utilizzare lo script merge_config.sh nell'albero del kernel per abilitare le opzioni:

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

Questo genera un file .config che puoi utilizzare per salvare un nuovo file defconfig o compilare un nuovo kernel con le funzionalità Android abilitate.

Requisiti aggiuntivi di configurazione del kernel

In alcuni casi, il manutentore della piattaforma può scegliere tra più funzionalità del kernel per soddisfare una dipendenza Android. Tali dipendenze non possono essere espresse nei file di frammento di configurazione del kernel (descritti sopra) perché il formato di tali file non supporta le espressioni logiche. In Android 9 e versioni successive, Compatibility Test Suite (CTS) e Vendor Test Suite (VTS) verificano che siano soddisfatti i seguenti requisiti:

  • CONFIG_OF=y o CONFIG_ACPI=y
  • I kernel 4.4 e 4.9 hanno CONFIG_ANDROID_LOW_MEMORY_KILLER=y OPPURE hanno sia CONFIG_MEMCG=y che CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y o CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y o CONFIG_STRICT_MODULE_RWX=y
  • Solo per ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y o CONFIG_ARM64_PAN=y

Inoltre, l'opzione CONFIG_INET_UDP_DIAG deve essere impostata su y per i kernel 4.9 in Android 9 e versioni successive.

Abilita le opzioni della modalità host USB

Per l'audio in modalità host USB, abilitare le seguenti opzioni:

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

Per la modalità host USB MIDI, abilitare la seguente opzione:

CONFIG_SND_USB_MIDI=y

Seccomp BPF con TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) è una tecnologia di sicurezza del kernel che consente la creazione di sandbox che definiscono il contesto in cui un processo può effettuare chiamate di sistema. La funzionalità di sincronizzazione dei thread (TSYNC) consente l'uso di Seccomp BPF da programmi multithread. Questa capacità è limitata alle architetture che dispongono del supporto Seccomp a monte (ARM, ARM64, x86 e x86_64).

Demone Android Live-Lock

Android 10 include Android Live-Lock Daemon ( llkd ), progettato per individuare e mitigare i deadlock del kernel. Per informazioni dettagliate sull'utilizzo di llkd , fare riferimento a Android Live-Lock Daemon .

vDSO32 su ARM64

L'oggetto condiviso dinamico virtuale (vDSO) è un'alternativa alle chiamate di sistema che, se utilizzate e configurate correttamente, possono ridurre i costi del ciclo. Android 10 aggiunge il supporto per vDSO32 sui kernel a 64 bit (Android supporta già vDSO64 sui kernel a 64 bit e vDSO32 sui kernel a 32 bit). L'utilizzo di vDSO32 ( CONFIG_VDSO_COMPAT ) sull'architettura ARM64 fornisce un aumento dello 0,4% nella durata della batteria e altri miglioramenti delle prestazioni.

La comunità Linux sta lavorando attivamente per unificare i vDSO attraverso le architetture . Puoi configurare vDSO nel tuo kernel Linux abilitando vDSO32 con CONFIG_COMPAT e CONFIG_CROSS_COMPILE_COMPAT_VDSO con la tripletta del compilatore arm32. Il team del kernel Android ha eseguito il backport delle versioni precedenti della serie di patch vDSO nei dispositivi Pixel, quindi puoi trovare esempi nelle build del kernel Pixel (percorso LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , riferimento CROSS_COMPILE_ARM32 e configurazione CONFIG_CROSS_COMPILE_ARM32 ).

Configurazione RAM bassa

Ottimizzare kernel/ActivityManager per ridurre il recupero diretto

Il recupero diretto avviene quando un processo o il kernel tenta di allocare una pagina di memoria (direttamente o a causa di un errore in una nuova pagina) e il kernel ha utilizzato tutta la memoria libera disponibile. Ciò richiede che il kernel blocchi l'allocazione mentre libera una pagina. Ciò a sua volta richiede spesso che l'I/O del disco elimini una pagina sporca supportata da file o attenda che lowmemorykiller interrompa un processo. Ciò può comportare I/O aggiuntivi in ​​qualsiasi thread, incluso un thread dell'interfaccia utente.

Per evitare il recupero diretto, il kernel ha filigrane che attivano kswapd o il recupero in background. Questo è un thread che tenta di liberare pagine in modo che la prossima volta che un thread reale alloca, possa riuscire rapidamente.

La soglia predefinita per attivare il recupero in background è piuttosto bassa, circa 2 MB su un dispositivo da 2 GB e 636 KB su un dispositivo da 512 MB. Il kernel recupera solo pochi megabyte di memoria nel recupero in background. Ciò significa che qualsiasi processo che alloca rapidamente più di pochi megabyte raggiungerà rapidamente il recupero diretto.

Il supporto per un kernel sintonizzabile è stato aggiunto nel ramo del kernel Android-3.4 come patch 92189d47f66c67e5fd92eafaa287e153197a454f ("aggiungi kbyte extra gratuiti sintonizzabili"). La selezione di questa patch per il kernel di un dispositivo consente ActivityManager di dire al kernel di provare a mantenere liberi tre buffer di memoria da 32 bpp a schermo intero.

Queste soglie possono essere configurate con il framework config.xml .

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value will increase 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 will increase 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>

Sintonizza LowMemoryKiller

ActivityManager configura le soglie di LowMemoryKiller in modo che corrispondano alle aspettative del set di lavoro di pagine supportate da file (pagine memorizzate nella cache) necessarie per eseguire i processi in ciascun intervallo di livello di priorità. Se un dispositivo ha requisiti elevati per il working set, ad esempio se l'interfaccia utente del fornitore richiede più memoria o se sono stati aggiunti più servizi, le soglie possono essere aumentate.

Le soglie possono essere ridotte se viene riservata troppa memoria per le pagine supportate da file, in modo che i processi in background vengano terminati molto prima che si verifichi un esaurimento del disco a causa della cache che diventa troppo piccola.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value will cause 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 will keep 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 will cause 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 will
keep 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>