Printk dahili olarak nasıl çalışır?


10

printfİşini yapmak için işletim sisteminin yardımına ihtiyacı olduğunu biliyorum .

Ayrıca printfkütüphane olmadığı için Linux kaynak kodunda çalışmadığını biliyorum . Ve böylece printkhata ayıklamak için var .

printkİşletim sistemi hala önyükleme yaparken nasıl çalışır?

Yanıtlar:


11

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ır printk(), 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 .


4

İş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.coldukç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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.