Jak dokładnie działa printk wewnętrznie?

10

Wiem, że printfpotrzebuje pomocy systemu operacyjnego, aby wykonać swoją pracę.

Wiem też, printfże nie działa w kodzie źródłowym Linuksa, ponieważ nie ma biblioteki. I tak mamy printkdo debugowania.

Jak printkdziała wtedy, gdy system operacyjny wciąż się uruchamia?

gpuguy
źródło

Odpowiedzi:

11

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 jak printf()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, jak printk()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ć.

slm
źródło
4

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.cjest 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.

Złotowłosa
źródło