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.