Bagaimana tepatnya cara kerja printk secara internal?

10

Saya tahu printfbutuh bantuan dari OS untuk melakukan tugasnya.

Saya juga tahu printftidak bekerja di kode sumber Linux karena tidak ada perpustakaan. Dan kita punya printkuntuk debugging.

Bagaimana cara printkkerjanya saat OS masih booting?

gpuguy
sumber

Jawaban:

11

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

slm
sumber
4

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.cdidokumentasikan dengan cukup baik. Akses konsol tampaknya dikendalikan melalui semafor. Pesan itu juga disuntikkan /dev/dmsg, terlepas dari prioritas.

goldilocks
sumber