Modul kernel adalah sedikit kode yang dikompilasi yang dapat dimasukkan ke dalam kernel pada saat run-time, seperti dengan insmod
atau modprobe
.
Driver adalah sedikit kode yang berjalan di kernel untuk berbicara dengan beberapa perangkat keras. Ini "mendorong" perangkat keras. Hampir setiap bit perangkat keras di komputer Anda memiliki driver yang terkait. Part Sebagian besar kernel yang sedang berjalan adalah kode driver .²
Driver dapat dibuat secara statis ke dalam file kernel pada disk.³ Driver juga dapat dibuat sebagai modul kernel sehingga dapat dimuat secara dinamis nanti. (Dan kemudian mungkin diturunkan.)
Praktik standar adalah membangun driver sebagai modul kernel jika memungkinkan, daripada menautkannya secara statis ke kernel, karena itu memberikan lebih banyak fleksibilitas. Namun, ada alasan bagus untuk tidak:
Terkadang driver yang diberikan mutlak diperlukan untuk membantu sistem boot. Itu tidak terjadi sesering yang Anda bayangkan, karena fitur initrd .
Driver yang dibuat secara statis mungkin persis seperti yang Anda inginkan dalam sistem yang dibatasi 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 punya alasan kuat untuk tidak repot dengan modul kernel dinamis.
Jika Anda membangun kernel secara statis dan menonaktifkan fitur pemuatan modul dinamis Linux, Anda mencegah modifikasi run-time dari kode kernel. Ini memberikan keamanan dan stabilitas tambahan dengan mengorbankan fleksibilitas.
Tidak semua modul kernel adalah driver. Sebagai contoh, 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 memiliki beberapa lapisan generik yang berada di antara driver perangkat keras tingkat rendah dan lahan 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 juga dapat berisi perangkat keras yang tidak Anda miliki drivernya.
Sisa kode dalam kernel OS menyediakan layanan umum seperti manajemen memori , IPC , penjadwalan , dll. Layanan ini terutama dapat melayani aplikasi pengguna tanah , seperti dengan contoh-contoh yang ditautkan sebelumnya, atau mereka mungkin merupakan layanan internal yang digunakan oleh driver atau perangkat internal lainnya. infrastruktur kernel.
Yang masuk /boot
, dimasukkan ke dalam RAM saat boot oleh boot loader di awal proses boot .
man lspci
: "-k Tampilkan driver kernel yang menangani setiap perangkat dan juga modul kernel yang mampu menanganinya ." Anda dapat membacanya sebagai: "Tunjukkan driver saat ini / benar-benar memegang perangkat dan juga semua modul yang dapat / dimaksudkan untuk menanganinya ".Untuk menjawab pertanyaan spesifik Anda tentang
lspci
output, baris "driver kernel" merujuk ke driver mana yang saat ini terikat pada kartu, dalam hal ininvidia
driver berpemilik . Baris "modul kernel" mencantumkan semua driver yang dikenal mampu mengikat ke kartu ini. Di sini, driver berpemilik memperlihatkan nama yang berbeda, mungkin karena caralspci
menemukan driver dan nama file versus nama yang dikodekan ke dalam driver itu sendiri.sumber
man lspci
- itu mengatakan persis apa yang Anda tulis.Menurut tutorial yang bagus ini :
Jadi, jika kita mencoba menggambar pohon, kita akan memiliki "Device driver" yang mewarisi dari (meluas) Modul, dan yang memiliki karakteristik lebih spesifik, di antaranya kita menemukan "mengakses ke perangkat keras" ...
sumber
Modul kernel mungkin bukan driver perangkat sama sekali.
"Driver kernel" bukan istilah yang didefinisikan dengan baik, tetapi mari kita coba.
Ini adalah modul kernel yang tidak menggerakkan perangkat keras apa pun, dan dengan demikian tidak dapat dianggap sebagai "driver perangkat":
Setelah membangun, Anda dapat menggunakannya dengan:
dan itu mencetak
hello init
kedmesg
.Namun, ada modul kernel yang bukan driver perangkat, tetapi sebenarnya berguna, misalnya modul yang mengekspos informasi kinerja / debugging kernel.
Driver perangkat biasanya juga merupakan modul kernel.
Contoh dari sesuatu yang merupakan "driver perangkat" sedikit lebih sulit untuk dihasilkan, karena memerlukan perangkat keras untuk dikendarai, dan deskripsi perangkat keras cenderung rumit.
Namun, dengan menggunakan QEMU atau emulator lain, kita dapat membuat model perangkat lunak dari perangkat keras yang nyata atau yang disederhanakan, yang merupakan cara yang bagus untuk mempelajari cara berbicara dengan perangkat keras. Berikut adalah contoh sederhana dari pengandar perangkat PCI minimal: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
Kita kemudian melihat bahwa di x86, berbicara dengan perangkat keras turun ke:
in
danout
instruksi, misalnya, https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273Operasi-operasi itu 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 lebih tinggi untuk membuat interaksi perangkat keras seperti itu lebih mudah dan lebih portabel:
request_irq
untuk menangani interupsiioreadX
dan pemetaan memori IOsumber
Jawaban saya akan sesuai dengan Jim. Driver kernel adalah program (modul kernel) yang dirancang untuk menggerakkan perangkat keras. Output lspci mengatakan nvidia adalah driver kernel karena itu adalah
loaded
modul untuk perangkat. Bersamaan dengan itu hadir modul kernel lain yang tersedia.Saya akan menambahkan bahwa perintah di linux untuk membuat daftar dan menghapus driver masing
lsmod
-rmmod
masing. Yang mengatakan daftar modul dan hapus modul.sumber
Semua Driver adalah modul. Tidak semua modul adalah driver.
Modul dapat dimasukkan saat runtime. Modul / Driver dapat dikompilasi secara statis bersama dengan kernel juga.
Modul init tipikal telah
Modul yang sama bisa dijadikan driver
sumber