Configurazione del kernel

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

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

  • android-base base Android abilitano le funzionalità di base di Android e dovrebbero essere configurate come specificato da tutti i dispositivi.
  • android-base- ARCH abilitano le funzionalità di base di Android e devono essere configurate come specificato da tutti i dispositivi dell'architettura ARCH . Non tutte le architetture hanno un file corrispondente di opzioni richieste specifiche dell'architettura. Se la tua architettura non ha un file, non ha requisiti di configurazione del kernel specifici dell'architettura aggiuntivi per Android.
  • android-recommended . Queste opzioni abilitano funzionalità Android avanzate e sono opzionali per i dispositivi.

Questi file di configurazione si trovano nel repository kernel/configs . Usa il set di file di configurazione che corrisponde alla versione del kernel che stai usando.

Per i dettagli sui controlli già effettuati per rafforzare il kernel sui tuoi dispositivi, consulta Sicurezza del sistema e del kernel . Per i dettagli sulle impostazioni richieste, vedere il documento di definizione della compatibilità Android (CDD) .

Genera configurazione 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 usare per salvare un nuovo file defconfig o compilare un nuovo kernel con le funzionalità Android abilitate.

Requisiti di configurazione del kernel aggiuntivi

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

  • 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= CONFIG_MEMCG=y che CONFIG_MEMCG_SWAP 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

Secondo 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 funzione di sincronizzazione dei thread (TSYNC) consente l'utilizzo di Seccomp BPF da programmi multithread. Questa capacità è limitata alle architetture che supportano Seccomp a monte (ARM, ARM64, x86 e x86_64).

Demone Android Live-Lock

Android 10 include Android Live-Lock Daemon ( llkd ), progettato per rilevare e mitigare i deadlock del kernel. Per i dettagli 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 utilizzata e configurata correttamente, può ridurre i costi del ciclo. Android 10 aggiunge il supporto per vDSO32 su kernel a 64 bit (Android supporta già vDSO64 su kernel a 64 bit e vDSO32 su kernel a 32 bit). L'utilizzo di vDSO32 ( CONFIG_VDSO_COMPAT ) sull'architettura ARM64 fornisce un aumento dello 0,4% della durata della batteria e altri miglioramenti delle prestazioni.

La comunità Linux sta lavorando attivamente per unificare i vDSO tra le architetture . È possibile configurare vDSO nel kernel Linux abilitando vDSO32 con CONFIG_COMPAT e CONFIG_CROSS_COMPILE_COMPAT_VDSO con il tripletto 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

Ottimizza kernel/ActivityManager per ridurre il recupero diretto

Il reclaim diretto si verifica quando un processo o il kernel tenta di allocare una pagina di memoria (direttamente oa causa di errori 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. Questo, a sua volta, richiede spesso l'I/O del disco per svuotare una pagina sporca con il backup di file o attendere che lowmemorykiller arresti un processo. Ciò può comportare un I/O aggiuntivo 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 le pagine in modo che la prossima volta che un thread reale alloca, può avere successo 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 in background. Ciò significa che qualsiasi processo che alloca rapidamente più di pochi megabyte raggiungerà rapidamente il recupero diretto.

Il supporto per un sintonizzabile del kernel è 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 ad 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 Low MemoryKiller

ActivityManager configura le soglie di LowMemoryKiller in modo che corrispondano alle aspettative del working set di pagine supportate da file (pagine memorizzate nella cache) necessarie per eseguire i processi in ciascun bucket 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, è possibile aumentare le soglie.

Le soglie possono essere ridotte se viene riservata troppa memoria alle pagine supportate da file, in modo che i processi in background vengano uccisi molto prima che si verifichi un thrashing del disco a causa della cache 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>