Modul kernel adalah sedikit kode yang dikompilasi yang dapat dimasukkan ke dalam kernel saat run-time, seperti dengan insmod
atau modprobe
.
Driver adalah sedikit kode yang berjalan di kernel untuk berkomunikasi dengan beberapa perangkat keras. Ini "menggerakkan" perangkat keras. Hampir semua perangkat keras di komputer Anda memiliki driver terkait.¹ Sebagian besar kernel yang berjalan adalah kode driver.²
Sebuah driver dapat dibangun secara statis ke dalam file kernel pada disk.³ Sebuah driver juga dapat dibangun sebagai modul kernel sehingga nanti dapat dimuat secara dinamis. (Dan kemudian mungkin diturunkan.)
Praktik standarnya adalah membangun driver sebagai modul kernel jika memungkinkan, daripada menautkannya secara statis ke kernel, karena hal itu memberikan lebih banyak fleksibilitas. Namun, ada alasan bagus untuk tidak melakukannya:
-
Terkadang driver yang diberikan benar-benar diperlukan untuk membantu sistem melakukan booting. Itu tidak terjadi sesering yang Anda bayangkan, karena fitur initrd.
-
Driver yang dibuat secara statis mungkin persis seperti yang Anda inginkan dalam sistem yang tercakup secara statis, seperti sistem tertanam. Dengan kata lain, jika Anda tahu sebelumnya driver mana yang akan selalu dibutuhkan dan ini tidak akan pernah berubah, Anda memiliki alasan yang baik untuk tidak repot dengan modul kernel dinamis.
-
Jika Anda membangun kernel secara statis dan menonaktifkan fitur pemuatan modul dinamis Linux, Anda mencegah modifikasi waktu proses dari kode kernel. Ini memberikan keamanan dan stabilitas tambahan dengan mengorbankan fleksibilitas.
Tidak semua modul kernel adalah driver. Misalnya, fitur yang relatif baru di kernel Linux adalah Anda dapat memuat penjadwal proses yang berbeda. Contoh lain adalah bahwa jenis perangkat keras yang lebih kompleks sering kali memiliki banyak lapisan generik yang berada di antara driver perangkat keras tingkat rendah dan area pengguna, seperti driver USB HID, yang mengimplementasikan elemen tertentu dari tumpukan USB, terlepas dari perangkat keras yang mendasarinya.
Selain itu:
-
Satu pengecualian untuk pernyataan luas ini adalah chip CPU, yang tidak memiliki "driver" per se . Komputer Anda mungkin juga berisi perangkat keras yang drivernya tidak Anda miliki.
-
Sisa kode dalam kernel OS menyediakan layanan umum seperti manajemen memori, IPC, penjadwalan, dll. Layanan ini terutama dapat melayani aplikasi pengguna, seperti contoh yang ditautkan sebelumnya, atau mereka mungkin layanan internal yang digunakan oleh driver atau intra- infrastruktur kernel.
-
Yang ada di
/boot
, dimuat ke dalam RAM saat boot oleh boot loader di awal proses boot.
Untuk menjawab pertanyaan spesifik Anda tentang lspci
keluaran, baris "driver kernel" mengacu pada driver mana yang saat ini terikat ke kartu, dalam hal ini nvidia
berpemilik pengemudi. Baris "modul kernel" mencantumkan semua driver yang diketahui mampu mengikat kartu ini. Di sini, driver berpemilik menampilkannya dengan nama yang berbeda, mungkin karena caranya lspci
menemukan driver dan nama filenya versus nama yang dikodekan ke dalam driver itu sendiri.
Modul kernel mungkin bukan driver perangkat sama sekali
"Kernel driver" bukanlah istilah yang didefinisikan dengan baik, tapi mari kita coba.
Ini adalah modul kernel yang tidak menjalankan perangkat keras apa pun, sehingga tidak dapat dianggap sebagai "driver perangkat":
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "hello exit\n");
}
module_init(myinit)
module_exit(myexit)
Setelah dibuat, Anda dapat menggunakannya dengan:
insmod hello.ko
dan mencetak hello init
ke dmesg
.
Akan tetapi, ada modul kernel yang bukan merupakan driver perangkat, tetapi sebenarnya berguna, misalnya, modul yang menampilkan informasi kinerja/debug kernel.
Driver perangkat biasanya juga merupakan modul kernel.
Contoh dari sesuatu yang merupakan "driver perangkat" sedikit lebih sulit dibuat, karena memerlukan perangkat keras untuk mengemudi, dan deskripsi perangkat keras cenderung rumit.
Namun, dengan menggunakan QEMU atau emulator lain, kami dapat membuat model perangkat lunak dari perangkat keras nyata atau yang disederhanakan, yang merupakan cara yang bagus untuk mempelajari cara berbicara dengan perangkat keras. Berikut adalah contoh sederhana driver perangkat PCI minimal:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Kami kemudian melihat bahwa di x86, berbicara dengan perangkat keras menjadi:
in
danout
petunjuk, misalnya, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273- menangani interupsi dengan mendaftarkan penangan ke CPU
Operasi tersebut secara umum tidak dapat dilakukan dari userland, seperti yang dijelaskan di:Apa perbedaan antara ruang Pengguna dan ruang Kernel? Namun ada beberapa pengecualian:https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space.
Kernel kemudian menawarkan API tingkat yang lebih tinggi untuk membuat interaksi perangkat keras lebih mudah dan lebih portabel:
request_irq
untuk menangani interupsiioreadX
dan pemetaan memori IO- antarmuka tingkat yang lebih tinggi untuk protokol populer seperti PCI dan USB