Android canlı kilit arka plan programı (llkd)

Android 10, Android Live-lock arka plan programını içerir (llkd), çekirdek kilitlenmelerini yakalamak ve azaltmak için tasarlanmıştır. llkd bileşeni, varsayılan bağımsız bir uygulama sağlar ancak alternatif olarak, llkd kodunu ana döngüde veya ayrı bir ileti dizisinde.

Algılama senaryoları

llkd için iki algılama senaryosu var: Kalıcı D veya Z durumu ve kalıcı. grup imzasını tıklayın.

Kalıcı D veya Z durumu

Bir ileti dizisinin ilerisi olmadan D (kesintisiz uyku) veya Z (zombi) durumundaysa ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms daha uzun sürerse llkd, işlemi (veya üst işlemi) sonlandırır. Sonraki taramada aynı süreç devam ediyorsa llkd, canlı kilit koşulunu onaylar ve bir şekilde paniğe kapılar ve bu sırada en ayrıntılı hata koşul.

llkd, llkd kilitlenirse alarm veren bir kendi kendine güvenlik zamanlayıcısı içerir; güvenlik zamanlayıcısı ana döngüden geçmesi için beklenen sürenin iki katıdır ve örneklemede ise ro.llk_sample_ms.

Kalıcı yığın imzası

llkd, kullanıcı hata ayıklama sürümlerinde çekirdek canlı kilitlerini kalıcı anahtar kelimeleri kullanarak algılayabilir. yığın imza kontrolünü göz önünde bulundurun. Z dışında herhangi bir durumdaki bir ileti dizisinde kalıcı öğe varsa listelenen ro.llk.stack çekirdek simgesi, en az ro.llk.timeout_ms veya ro.llk.stack.timeout_ms, llkd işlemi sonlandırır (ileriye doğru planlama ilerlemesi olsa bile). Sonraki taramada aynı süreç devam ediyorsa llkd, canlı kilit koşulunu onaylar ve bir şekilde paniğe kapılar ve bu sırada en ayrıntılı hata koşul.

Etkin kilitleme koşulu olduğunda lldk kontrolü sürekli olarak devam eder bestelenen symbol+0x veya symbol.cfi+0x dizelerini Linux'ta /proc/pid/stack dosyası. Sembol listesi ro.llk.stack ve varsayılan olarak virgülle ayrılmış cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable.

Semboller nadir ve tipik bir sistemde fonksiyonunun zaman aşımı süresi boyunca bir örnekte yalnızca bir kez ro.llk.stack.timeout_ms (örnekler her ro.llk.check_ms aralığında bir kez gerçekleşir). Eksiklik nedeniyle yanlış tetikleyiciyi önlemenin tek yolu budur. Sembol işlevi, çalışabilecek kilidi çağıran işlevin altında görünmelidir. Eğer kilit varsa veya sembol işlevinde bulunuyorsa, etkilenen tüm tam olarak kilitlemeye yol açan süreci değil,

Kapsam

Varsayılan llkd uygulaması init, [kthreadd] veya [kthreadd] ortaya çıktı. llkd tarafından üretilen [kthreadd] ileti dizilerinin kapsamı için:

  • Sürücüler kalıcı D durumunda kalmamalıdır,

VEYA

  • Sürücülerin, iş parçacığının kapatılması durumunda kurtaracak mekanizmalara sahip olması gerekir kontrol edin. Örneğin, şunun yerine wait_event_interruptible() kullanın: wait_event().

Yukarıdaki koşullardan biri karşılanırsa llkd ret listesi şuna ayarlanabilir: ele alacağız. Yığın simgesi kontrolü ek bir işlem içeriyor ptrace ürününü engelleyen hizmetlerde sepolitika ihlallerini önlemek için ret listesi anlamına gelir.

Android mülkleri

llkd, çeşitli Android özelliklerine (aşağıda listelenmiştir) yanıt verir.

  • prop_ms adlı özellikler milisaniye cinsinden belirtilir.
  • Listeler için virgül (,) ayırıcı kullanan özellikler, varsayılan girişi koruyun, ardından isteğe bağlı artı işaretiyle girişleri ekleyin veya çıkarın Sırasıyla (+) ve eksi (-) ön ekleriyle başlar. Bu listeler için false dizesi boş liste ile eş anlamlıdır ve boş veya eksik girişler belirtilen varsayılan değer.

ro.config.low_ram

Cihaz, sınırlı bellekle yapılandırılmış.

ro.debuggable

Cihaz, userdebug veya eng derlemesi için yapılandırılmış.

ro.llk.sysrq_t

eng ise varsayılan olarak ro.config.low_ram veya ro.debuggable değildir. true ise tüm ileti dizilerinin (sysrq t) dökümünü alın.

ro.llk.etkin

Canlı kilit arka plan programının etkinleştirilmesine izin ver. false varsayılandır.

llk.etkin

Mühendislik derlemeleri için değerlendirildi. ro.llk.enable varsayılandır.

ro.khungtask.enable

[khungtask] arka plan programının etkinleştirilmesine izin ver. false varsayılandır.

khungtask.enable

Mühendislik derlemeleri için değerlendirildi. ro.khungtask.enable varsayılandır.

ro.llk.mlockall

mlockall() çağrısını etkinleştir. false varsayılandır.

ro.khungtask.timeout

Maksimum [khungtask] süre sınırı. Varsayılan değer 12 dakikadır.

ro.llk.timeout_ms.

D veya Z maksimum süre sınırı. Varsayılan değer 10 dakikadır. llkd için alarm güvenlik zamanlayıcısı.

ro.llk.D.zaman aşımı_ms.

Maksimum D zaman sınırı. ro.llk.timeout_ms varsayılandır.

ro.llk.Z.zaman aşımı_ms.

Maksimum Z süre sınırı. ro.llk.timeout_ms varsayılandır.

ro.llk.stack.timeout_ms

Kalıcı yığın simgeleri için maksimum süre sınırı olup olmadığını kontrol eder. Varsayılan değer: ro.llk.timeout_ms Yalnızca userdebug veya eng derlemelerinde etkin.

ro.llk.check_ms

D veya Z için ileti dizisi örnekleri. Varsayılan değer iki dakikadır.

ro.llk.stack

Sürekli mevcut olması durumunda bir sorunun işaret edebileceği çekirdek yığını sembolleri olup olmadığını kontrol eder. alt sistem kilitlendi. Varsayılan değer: cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable. çekirdek simgelerinin virgülle ayrılmış listesi. Bu kontrolde yönlendirme planlaması yapılmaz. Dönem boyunca her ro.llk_check_ms anket yoluyla ABA ro.llk.stack.timeout_ms, bu nedenle yığın simgeleri son derece nadir ve (bir sembolün her yerde ısrarla görünmesi pek olası değildir) örnek grupları oluşturabilirsiniz). symbol+0x veya Yığın genişletmede symbol.cfi+0x. Yalnızca userdebug veya eng'de kullanılabilir derlemeler; Kullanıcı derlemelerindeki güvenlik endişesi, bu kontrolü önleyin.

ro.llk.karaliste.süreç

llkd, belirtilen işlemleri izlemiyor. Varsayılan değer: 0,1,2 (kernel, init ve [kthreadd]) ve işlem adları init,[kthreadd],[khungtaskd],lmkd,llkd,watchdogd, [watchdogd],[watchdogd/0],...,[watchdogd/get_nprocs-1]. Bir işlem; comm, cmdline veya pid referansı olabilir. Otomatik varsayılan ayar 92 olan geçerli maksimum mülk boyutundan daha büyük olabilir.

ro.llk.Blacklist.parent

llkd, belirtilen üst öğelere sahip işlemleri izlemez. Varsayılan 0,2,adbd&[setsid] (yalnızca zombi için kernel, [kthreadd] ve adbd) setsid) tıklayın. Ve işareti (&) ayırıcısı, yalnızca üst öğenin yalnızca yoksayıldığını belirtir. uygun olması gerekir. Ve işareti, Hiçbir zaman bir işlem adının parçası olmadığını; ancak, kabuktaki bir setprop için ve işareti kaçar veya tırnak içine alınır, ancak bu init rc dosyasında belirtildiğinde bu sorun yok. Bir üst ya da hedef süreç comm, cmdline veya pid referansı.

ro.llk.karalist.uid

llkd, belirtilen UID'lerle eşleşen işlemleri izlemez. UIS numaralarının veya adlarının virgülle ayrılmış listesi. Varsayılan değer boş veya false değeridir.

ro.llk.karaliste.süreç.stack

llkd, canlı kilit yığını için belirtilen işlem alt kümesini izlemiyor imzalar. Varsayılan değer işlem adlarıdır init,lmkd.llkd,llkd,keystore,ueventd,apexd,logd Sepolicy'i engeller (bunlar mümkün olmadığı için ptrace ile ilişkili süreçlerle ilişkili ihlal) işaretli değildir). Yalnızca userdebug ve eng derlemelerinde etkin. Derleme hakkında ayrıntılı bilgi için Android Oluşturma bölümüne bakın.

Mimari sorunlar

  • Özellikler 92 karakterle sınırlıdır (ancak varsayılan değerler için yoksayılır) kaynaklardaki include/llkd.h dosyasında tanımlanmıştır).
  • Yerleşik [khungtask] arka plan programı çok genel ve durumunda olduğunu gösterir. S'ye geçerseniz görevler tamamlanabilir (ve gerektiğinde şoförler tarafından yeniden yaratılabilirler).

Kitaplık arayüzü (isteğe bağlı)

İsterseniz llkd öğesini başka bir ayrıcalıklı arka plan programına dahil edebilirsiniz: libllkd bileşeninde yer alan aşağıdaki C arayüzü:

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

İleti dizisi adı sağlanırsa otomatik olarak bir ileti dizisi oluşturulur. Aksi durumda arayan llkCheckMilliseconds, ana döngüsünde çağrılmalıdır. Fonksiyon, bu işleyiciye yönlendirmesi beklenen bir sonraki çağrıdan önce geçen süreyi ifade eder.