printk ()
Fungsi cetak kernel printk()
,, berperilaku hampir identik dengan fungsi C library printf()
. 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. The printk()
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 dengan printk()
, 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.