Saya belajar driver perangkat dan pemrograman Kernel. Menurut buku Jonathan Corbet, tidak ada main()
fungsi di driver perangkat.
Jadi saya dua pertanyaan:
- Mengapa kita tidak memerlukan
main()
fungsi di driver perangkat? - Apakah kernel itu sendiri memiliki
main()
fungsi?
Adakah yang bisa menjelaskan hal ini kepada saya?
linux-kernel
drivers
some one
sumber
sumber
Jawaban:
Dalam program ruang pengguna,
main()
adalah titik masuk ke program yang dipanggil oleh kode inisialisasi libc ketika biner dijalankan. Kode kernel tidak memiliki kemewahan untuk bergantung pada libc, karena libc sendiri bergantung pada antarmuka syscall kernel untuk alokasi memori, I / O, manajemen proses dll.Yang mengatakan, setara dengan
main()
dalam kode kernel adalahstart_kernel()
, yang dipanggil oleh bootloader setelah memuat gambar kernel, mendekompresinya ke dalam memori dan mengatur perangkat keras penting dan paging memori.start_kernel()
melakukan sebagian besar pengaturan sistem dan akhirnya memunculkan proses init.Titik masuk ke modul kernel Linux adalah fungsi init yang terdaftar dengan kernel dengan memanggil
module_init()
makro. Fungsi init modul terdaftar kemudian dipanggil oleh kode kernel melaluido_initcalls()
fungsi tersebut saat startup kernel.sumber
main
metode dalam C. (Ini adalah kesalahpahaman yang terlalu umum bahwa OS membuat panggilan langsung kemain
, yang bukan kasusnya dan bahkan lebih sedikit kasus dalam misalnya C ++.) I ' Aku akan memberimu upvote lagi jika aku bisa melakukannya.Kernel tidak memiliki
main
fungsi.main
adalah konsep bahasa C. Kernel ditulis dalam C dan assembly. Kode entri kernel ditulis oleh majelis.Urutan boot diatur sebagai berikut:
initrd
). Kemudian kode di beberapa alamat dieksekusi.init
proses), mengalihkan konteks CPU dari dering 0 ke dering 3, dan memulai proses init (id proses adalah 1). Sekarang boot kernel sudah selesai!init
Program berjalan semua skrip init. Semua layanan dimulai. Shell disebut. Pengguna bisa masuk.The
main
fungsi adalah fungsi C. Sebenarnya metode utama bukanlah titik masuk dari program C. C runtime memanggil banyak fungsi sebelumnyamain
. GCC memiliki fitur perluasan: konstruktor. Fungsi yang dinyatakan "konstruktor" dipanggil sebelumnyamain
.Sebagai contoh:
Makro ini dari proyek qemu.
sumber
initrd.img
BUKAN gambar kernel. Ini adalah satu set modul yang dimuat oleh kernel saat boot. Gambar kernel biasanya memiliki nama yang dimulai dengan "vmlinuz" tetapi berbeda dari distro ke distro.Ada misalnya fungsi utama () di arch / x86 / boot / main.c untuk mempersiapkan sistem untuk beralih dari mode real ke mode yang dilindungi tetapi arsitektur lain tidak memiliki kode seperti itu. Ada gambaran bagus tentang cara mem-boot kernel Linux 2.6.x pada platform x86. Sangat berharga untuk membacanya.
Menurut dokumen HOWTO melakukan pengembangan kernel Linux , kernel Linux adalah
apa yang menurut standar C BTW artinya
sumber