Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Demonio de Android Live-LocK (llkd)

Android 10 incluye el Android Live-Lock Daemon ( llkd ), que está diseñado para la captura y mitigar kernel puntos muertos. El llkd componente proporciona una implementación autónomo predeterminado, pero se puede integrar, alternativamente, la llkd código en otro servicio, ya sea como parte del bucle principal o como un hilo separado.

Escenarios de detección

El llkd tiene dos escenarios de detección: D persistente o estatales Z, y firma pila persistente.

Estado D o Z persistente

Si un hilo está en D (sueño ininterrumpido de energía) o el estado Z (zombi) con ningún progreso hacia adelante por más ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms , la llkd mata el proceso (o proceso padre ). Si una muestra de exploración posteriores el mismo proceso sigue existiendo, la llkd confirma una condición vivo-cerradura y el pánico del kernel de manera que proporciona el informe de error detallada de la condición.

El llkd incluye un organismo de control de auto que las alarmas si llkd encierra; watchdog es el doble del tiempo de espera que fluya a través del mainloop y de muestreo es cada ro.llk_sample_ms .

Firma de pila persistente

Para los comunicados de depuración de usuario, la llkd puede detectar núcleo vivo-cerraduras utilizando persistente comprobación de la firma pila. Si un hilo en cualquier estado excepto Z tiene un listado persistente ro.llk.stack símbolo del núcleo que se informó durante más de ro.llk.timeout_ms o ro.llk.stack.timeout_ms , la llkd mata el proceso (incluso si no es hacia adelante Programar el progreso). Si una muestra de exploración posteriores el mismo proceso sigue existiendo, la llkd confirma una condición vivo-cerradura y el pánico del kernel de manera que proporciona el informe de error detallada de la condición.

Los lldk verificación persiste continuamente cuando exista y se ve la condición de bloqueo en vivo para las cadenas compuestas " symbol+0x" o " symbol.cfi+0x" en el /proc/pid/stack de archivos en Linux. La lista de símbolos está en ro.llk.stack y por defecto a la lista separada por comas de " cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable ".

Los símbolos deben ser lo suficientemente raros y de corta duración que en un sistema típico de la función es visto sólo una vez en una muestra durante el período de tiempo de espera de ro.llk.stack.timeout_ms (muestras ocurren cada ro.llk.check_ms ). Debido a la falta de protección ABA, esta es la única forma de evitar un falso disparo. La función de símbolo debe aparecer debajo de la función que llama al candado que podría competir. Si el candado está debajo o en la función de símbolo, el símbolo aparece en todos los procesos afectados, no solo en el que causó el bloqueo.

Cobertura

La implementación predeterminada de llkd no supervisa init , [kthreadd] o [kthreadd] desove. Para el llkd a la cubierta [kthreadd] hilos -spawned:

  • Los conductores no deben permanecer en un estado D persistente,

O

  • Los controladores deben tener mecanismos para recuperar el hilo en caso de que se elimine externamente. Por ejemplo, el uso wait_event_interruptible() en lugar de wait_event() .

Si se cumple una de las condiciones anteriores, la llkd lista negra se puede ajustar a los componentes de la cubierta del núcleo. Pila de cheques símbolo consiste en una lista negra de proceso adicional para evitar violaciónes sepolicy sobre los servicios que bloquean ptrace operaciones.

Propiedades de Android

Los llkd responde a varias propiedades Android (enumerados a continuación).

  • Propiedades con nombre prop_ms están en milisegundos.
  • Las propiedades que usan el separador de coma (,) para las listas usan un separador inicial para preservar la entrada predeterminada, luego agregan o restan entradas con prefijos opcionales más (+) y menos (-) respectivamente. Para estas listas, la cadena "falso" es sinónimo de una lista vacía, y las entradas en blanco o faltantes recurren al valor predeterminado especificado.

ro.config.low_ram

El dispositivo está configurado con memoria limitada.

ro.debuggable

El dispositivo está configurado para userdebug o eng build.

ro.llk.sysrq_t

Si la propiedad es "ing", el defecto no es ro.config.low_ram o ro.debuggable . Si es verdad, volcar todas las discusiones ( sysrq t ).

ro.llk.enable

Permitir que se habilite el demonio de bloqueo en vivo. El valor predeterminado es falso.

llk.enable

Evaluado para construcciones de ingeniería. Por defecto es ro.llk.enable .

ro.khungtask.enable

Permitir [khungtask] demonio para estar habilitado. El valor predeterminado es falso.

khungtask.enable

Evaluado para construcciones de ingeniería. Por defecto es ro.khungtask.enable .

ro.llk.mlockall

Habilitar llamada a mlockall() . El valor predeterminado es falso.

ro.khungtask.timeout

[khungtask] máximo límite de tiempo. El valor predeterminado es 12 minutos.

ro.llk.timeout_ms

Límite de tiempo máximo D o Z. El valor predeterminado es 10 minutos. El doble de este valor para establecer el organismo de control de alarma para llkd .

ro.llk.D.timeout_ms

D tiempo límite máximo. Por defecto es ro.llk.timeout_ms .

ro.llk.Z.timeout_ms

Z límite de tiempo máximo. Por defecto es ro.llk.timeout_ms .

ro.llk.stack.timeout_ms

Comprueba el límite de tiempo máximo de símbolos de pila persistentes. Por defecto es ro.llk.timeout_ms . Activa sólo en depuración de usuario o eng construye.

ro.llk.check_ms

Muestras de subprocesos para D o Z. El valor predeterminado es dos minutos.

ro.llk.stack

Comprueba los símbolos de la pila del kernel que, si están presentes de forma persistente, pueden indicar que un subsistema está bloqueado. El valor predeterminado es cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable lista separada por comas de símbolos del kernel. El cheque no hace ABA programación progresiva, excepto mediante el sondeo cada ro.llk_check_ms más el período ro.llk.stack.timeout_ms , por lo que los símbolos de la pila deben ser excepcionalmente raro y fugaz (es muy poco probable para un símbolo para aparecer de forma persistente en toda muestras de la pila). Comprueba si hay una coincidencia para " symbol+0x" o " symbol.cfi+0x" en la expansión de la pila. Disponible sólo en depuración de usuario o eng construye; Las preocupaciones de seguridad en las compilaciones de los usuarios dan como resultado privilegios limitados que impiden esta verificación.

ro.llk.blacklist.process

El llkd no vigila los procesos especificados. Por defecto es 0,1,2 ( kernel , init , y [kthreadd] ), además de los nombres de proceso init,[kthreadd],[khungtaskd],lmkd,llkd,watchdogd, [watchdogd],[watchdogd/0],...,[watchdogd/get_nprocs-1] . Un proceso puede ser un comm , cmdline , o pid referencia. Un valor predeterminado automático puede ser mayor que el tamaño máximo de propiedad actual de 92.

ro.llk.blacklist.parent

El llkd no vigila los procesos que tienen el padre (s) especificado. Por defecto es 0,2,adbd&[setsid] ( kernel , [kthreadd] , y adbd sólo para zombi setsid ). Un separador ampersand (&) especifica que el padre se ignora solo en combinación con el proceso hijo de destino. Se seleccionó Ampersand porque nunca forma parte de un nombre de proceso; Sin embargo, un setprop en la cáscara requiere que el signo a ser escapado o citado, aunque el init rc archivo donde esto se especifica normalmente no tiene este problema. Un proceso padre o diana puede ser una comm , cmdline , o pid referencia.

ro.llk.blacklist.uid

El llkd no vigila los procesos que coinciden con los especificados UID (s). Lista separada por comas de números uid o nombres. El valor predeterminado es vacío o falso.

ro.llk.blacklist.process.stack

El llkd no supervisa el subconjunto especificado de procesos para firmas pila de bloqueo directo. Por defecto es los nombres de proceso init,lmkd.llkd,llkd,keystore,ueventd,apexd,logd . Previene la violación sepolicy asociado con procesos que bloquean ptrace (ya que estos no se pueden comprobar). Activa sólo en depuración de usuario y construye esp. Para más detalles sobre los tipos de construcción, consulte Edificio Android .

Preocupaciones arquitectónicas

  • Las propiedades se limitan a 92 caracteres (sin embargo, esto es ignorado por los valores definidos en el include/llkd.h archivo en las fuentes).
  • El built-in [khungtask] demonio es demasiado genérico y viajes en código del controlador que se encuentra en el estado alrededor de D demasiado. Cambiar a S haría que las tareas se pudieran eliminar (y que los conductores las resucitaran si fuera necesario).

Interfaz de biblioteca (opcional)

Puede incorporar opcionalmente el llkd en otro daemon privilegiado utilizando la siguiente interfaz C de la libllkd componente:

#include "llkd.h"
bool llkInit(const char* threadname) /* return true if enabled */
unsigned llkCheckMillseconds(void)   /* ms to sleep for next check */

Si se proporciona un threadName, un hilo automáticamente desove, de lo contrario la persona que llama debe llamar llkCheckMilliseconds en su bucle principal. La función devuelve el período de tiempo antes de la próxima llamada esperada a este controlador.