Odpowiedzi:
Wydaje się, że to odniesienie zawiera odpowiedzi na twoje pytania, zatytułowane: Linux Kernel Development Second Edition .
fragment
printk ()
Funkcja drukowania jądra
printk()
zachowuje się prawie identycznie jakprintf()
funkcja biblioteki C. Rzeczywiście, w tej książce nie korzystaliśmy z żadnych rzeczywistych różnic. W przypadku większości intencji jest to w porządku;printk()
jest po prostu nazwą sformatowanej funkcji drukowania jądra. Ma jednak pewne różnice.Wytrzymałość printk ()
Jedną z właściwości
printk()
szybko przyjmowanych za pewnik jest jej wytrzymałość.printk()
Funkcja jest wymagalne od prawie wszędzie w jądrze w dowolnym momencie. Można go wywołać z kontekstu przerwań lub procesu. Można go wywołać, gdy zamek jest przytrzymany. Może być wywoływany jednocześnie na wielu procesorach, ale nie wymaga od dzwoniącego blokady.Jest to sprężysta funkcja. Jest to ważne, ponieważ użyteczność
printk()
polega na tym, że zawsze tam jest i zawsze działa.Nonrobustness printk ()
Istnieje szczelina w zbroi
printk()
solidności. Nie można go używać przed określonym momentem w procesie uruchamiania jądra, przed inicjalizacją konsoli. Rzeczywiście, jeśli konsola nie zostanie zainicjowana, gdzie ma iść wyjście?Zwykle nie stanowi to problemu, chyba że debugujesz problemy na bardzo wczesnym etapie procesu rozruchu (na przykład w programie
setup_arch()
, który wykonuje inicjalizację specyficzną dla architektury). Takie debugowanie jest wyzwaniem na początek, a brak jakiejkolwiek metody drukowania tylko komplikuje problem.Jest trochę nadziei, ale niewiele. Hakerzy architektury hardcore wykorzystują sprzęt, który działa (powiedzmy, port szeregowy) do komunikacji ze światem zewnętrznym. Zaufaj mi, to nie jest zabawne dla większości ludzi. Niektóre obsługiwane architektury implementują rozsądne rozwiązanie, jednak inne (w tym i386) mają dostępne łatki, które również oszczędzają dzień.
Rozwiązaniem jest
printk()
wariant, który może wyjście do konsoli na bardzo wczesnym etapie procesu rozruchu:early_printk()
. Zachowanie jest takie samo, jakprintk()
zmienia się tylko nazwa i jej zdolność do wcześniejszej pracy. Nie jest to jednak rozwiązanie przenośne, ponieważ nie wszystkie obsługiwane architektury mają zaimplementowaną taką metodę. Jeśli jednak tak się stanie, może stać się twoim najlepszym przyjacielem.O ile nie musisz pisać na konsoli bardzo wcześnie podczas uruchamiania, możesz polegać na tym,
printk()
aby zawsze działać.
Jak działa printK, kiedy system operacyjny wciąż się uruchamia?
printk()
podchodzi do konsoli, jeśli to możliwe, a priorytet jest wystarczająco wysoki; Nie jestem pewien, w którym momencie jądro inicjuje VT, aby było to możliwe, ale jest oczywiście dość wcześnie.
[src]/kernel/printk/printk.c
jest dość dobrze udokumentowane. Dostęp do konsoli wydaje się być kontrolowany za pomocą semaforów. Wiadomość jest również wstrzykiwana /dev/dmsg
, niezależnie od priorytetu.