Yanıtlar:
Bu referansın şu sorulara cevapları var gibi görünüyor: Linux Kernel Development Second Edition .
alıntı
printk ()
Çekirdek yazdırma işlevi,
printk()
C kitaplığıprintf()
işleviyle neredeyse aynı şekilde davranır . Gerçekten de, bu kitap boyunca herhangi bir gerçek farktan faydalanmadık. Çoğu niyet için, bu iyi;printk()
sadece çekirdeğin biçimlendirilmiş yazdırma işlevinin adıdır. Bununla birlikte, bazı farklılıkları vardır.Printk sağlamlığı ()
Bir özelliği
printk()
hafife alınan hızla sağlamlığı olduğunu.printk()
Fonksiyon hemen hemen her yerde her zaman çekirdekte gelen çağrılabilir. Kesme veya işlem bağlamından çağrılabilir. Bir kilit basılıyken çağrılabilir. Birden fazla işlemcide aynı anda çağrılabilir, ancak arayan kişinin bir kilit tutmasını gerektirmez.Esnek bir fonksiyondur. Bu önemlidir, çünkü
printk()
her zaman orada olduğu ve her zaman çalıştığı gerçeğine dayanır.Printk'in yanıltıcılığı ()
printk()
' Nin sağlamlık zırhında bir çığlık var. Konsolun başlatılmasından önce çekirdek önyükleme işleminde belirli bir noktadan önce kullanılamaz. Gerçekten de, konsol başlatılmazsa, çıktının nereye gitmesi gerekir?Önyükleme işleminde çok erken hata ayıklamadığınız sürece (örneğin,
setup_arch()
mimariye özgü başlatma işlemini gerçekleştiren ) , bu normalde bir sorun değildir . Bu tür hata ayıklama, başlamak için bir zorluktur ve herhangi bir tür baskı yönteminin olmaması, sorunu sadece bir araya getirir.Biraz umut var, ama çok değil. Hardcore mimari korsanları, dış dünyayla iletişim kurmak için çalışan donanımı (örneğin, bir seri bağlantı noktası) kullanır. Güven bana bu çoğu insan için eğlenceli değil. Bazı desteklenen mimariler aklı başında bir çözüm uygular, ancak diğerlerinde (i386 dahil) günü kurtaran yamalar bulunur.
Solüsyon bir olduğunu
printk()
çok erken önyükleme sürecinde konsola varyant o kutunun çıkışı:early_printk()
. Davranışla aynıdırprintk()
, yalnızca ad ve daha erken çalışma yeteneği değiştirilir. Bununla birlikte, bu taşınabilir bir çözüm değildir, çünkü desteklenen tüm mimarilerde böyle bir yöntem yoktur. Yine de, eğer en iyi arkadaşın olabilir.Önyükleme işleminde konsola çok erken yazmanız gerekmedikçe,
printk()
her zaman çalışmaya güvenebilirsiniz .
İşletim sistemi hala önyükleme yaparken printK nasıl çalışır?
printk()
mümkünse konsola gider ve öncelik yeterince yüksektir; Çekirdeğin hangi noktada bir VT'yi bu mümkün kılmak için başlattığından emin değilim ama oldukça erken.
[src]/kernel/printk/printk.c
oldukça iyi belgelenmiştir. Konsol erişiminin semaforlar aracılığıyla kontrol edildiği görülmektedir. Mesaj ayrıca /dev/dmsg
, önceliğe bakılmaksızın içine eklenir .