Jawaban:
Referensi ini tampaknya memiliki jawaban untuk pertanyaan Anda, berjudul: Linux Kernel Development Second Edition .
kutipan
printk ()
Fungsi cetak kernel
printk()
,, berperilaku hampir identik dengan fungsi C libraryprintf()
. Memang, sepanjang buku ini kami belum memanfaatkan perbedaan nyata. Untuk sebagian besar niat, ini baik-baik saja;printk()
hanyalah nama fungsi cetak yang diformat kernel. Namun ada beberapa perbedaan.The Robustness of printk ()
Salah satu properti yang
printk()
cepat diterima begitu saja adalah kekokohannya. Theprintk()
fungsi callable dari mana saja di kernel setiap saat. Ini dapat dipanggil dari interupsi atau konteks proses. Itu bisa dipanggil saat kunci dipegang. Itu dapat dipanggil secara bersamaan pada banyak prosesor, namun itu tidak mengharuskan pemanggil untuk memegang kunci.Ini adalah fungsi tangguh. Ini penting karena kegunaan dari
printk()
bertumpu pada kenyataan bahwa ia selalu ada dan selalu berfungsi.The Nonrobustness of printk ()
Celah dalam
printk()
kekuatan kekokohan memang ada. Ini tidak dapat digunakan sebelum titik tertentu dalam proses boot kernel, sebelum inisialisasi konsol. Memang, jika konsol tidak diinisialisasi, ke mana output seharusnya pergi?Ini biasanya bukan masalah, kecuali Anda men-debug masalah sangat awal dalam proses boot (misalnya, in
setup_arch()
, yang melakukan inisialisasi spesifik arsitektur). Awalnya debugging seperti itu merupakan tantangan, dan tidak adanya metode cetak apa pun hanya menambah masalah.Ada beberapa harapan, tetapi tidak banyak. Peretas arsitektur hardcore menggunakan perangkat keras yang berfungsi (katakanlah, port serial) untuk berkomunikasi dengan dunia luar. Percayalah, ini tidak menyenangkan bagi kebanyakan orang. Beberapa arsitektur yang didukung memang mengimplementasikan solusi yang waras, namun yang lain (termasuk i386) memiliki tambalan yang tersedia yang juga menghemat waktu.
Solusinya adalah
printk()
varian yang bisa output ke konsol sangat awal dalam proses boot:early_printk()
. Perilaku ini sama denganprintk()
, hanya nama dan kemampuannya untuk bekerja lebih awal yang diubah. Namun ini bukan solusi portabel, karena tidak semua arsitektur yang didukung menerapkan metode seperti itu. Namun, itu bisa menjadi teman terbaik Anda, jika ya.Kecuali jika Anda perlu menulis ke konsol sangat awal dalam proses boot, Anda dapat mengandalkan
printk()
untuk selalu bekerja.
Bagaimana cara kerja printK saat OS masih booting?
printk()
pergi ke konsol jika memungkinkan dan prioritasnya cukup tinggi; Saya tidak yakin pada titik mana kernel menginisialisasi VT untuk membuatnya layak tetapi jelas cukup awal.
[src]/kernel/printk/printk.c
didokumentasikan dengan cukup baik. Akses konsol tampaknya dikendalikan melalui semafor. Pesan itu juga disuntikkan /dev/dmsg
, terlepas dari prioritas.