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