Apa perbedaan antara driver kernel dan modul kernel?

67

Ketika saya melakukan lspci -kdi Kubuntu saya dengan kernel generik 3.2.0-29, saya bisa melihat sesuatu seperti ini:

01:00.0 VGA compatible controller: NVIDIA Corporation G86 [Quadro NVS 290] (rev a1)
    Subsystem: NVIDIA Corporation Device 0492
    Kernel driver in use: nvidia
    Kernel modules: nvidia_current, nouveau, nvidiafb

Ada driver kernel nvidiadan modul kernel nvidia_current, nouveau, nvidiafb.

Sekarang saya bertanya-tanya apa perbedaan antara driver Kernel dan modul Kernel?

JohnnyFromBF
sumber

Jawaban:

78

Modul kernel adalah sedikit kode yang dikompilasi yang dapat dimasukkan ke dalam kernel pada saat run-time, seperti dengan insmodatau 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:

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

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

  3. Yang masuk /boot, dimasukkan ke dalam RAM saat boot oleh boot loader di awal proses boot .

Warren Young
sumber
1
Modul dapat berupa sistem file, protokol jaringan, fungsi firewall, dan banyak lagi. Beberapa perangkat keras (misalnya kartu WiFi) memerlukan setumpuk modul, beberapa menawarkan infrastruktur umum sementara yang lain menangani perangkat keras itu sendiri.
vonbrand
1
Ini adalah garis besar umum yang baik, tetapi saya memiliki pertanyaan yang sama persis dengan OP, kemudian menemukan jawaban ini dan masih tidak tahu mengapa "driver yang digunakan" berbeda dari "modul". Sebaliknya, jawaban Jim Paris benar. Dari 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 ".
Binarus
Jika Anda tahu windows: Modul ini sangat mirip dengan DLL. Pada unix, modul mirip dengan objek bersama, tetapi modul hanya untuk kernel. Modul yang terhubung secara dinamis dapat berisi driver. Kernel dapat berisi driver yang terhubung secara statis. Modul berbeda dari DLL (atau .so) karena kernel memiliki persyaratan khusus untuk bagaimana hal-hal dimuat secara dinamis.
robocat
18

Untuk menjawab pertanyaan spesifik Anda tentang lspcioutput, baris "driver kernel" merujuk ke driver mana yang saat ini terikat pada kartu, dalam hal ini nvidiadriver berpemilik . Baris "modul kernel" mencantumkan semua driver yang dikenal mampu mengikat ke kartu ini. Di sini, driver berpemilik memperlihatkan nama yang berbeda, mungkin karena cara lspcimenemukan driver dan nama file versus nama yang dikodekan ke dalam driver itu sendiri.

Jim Paris
sumber
Terima kasih - itu membantu. Jika saya hanya mengeluarkan man lspci- itu mengatakan persis apa yang Anda tulis.
Binarus
5

Menurut tutorial yang bagus ini :

... satu jenis modul adalah driver perangkat, yang memungkinkan kernel untuk mengakses perangkat keras yang terhubung ke sistem.

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

pengguna1847726
sumber
Ini hanya sebagian benar. Driver adalah objek kelas dalam hierarki (ya, desain internal Linux, karena kebanyakan sistem operasi saat ini, berorientasi objek). Tetapi kata driver mungkin modul (loadable saat runtime) atau dikompilasi ke dalam kernel. Tidak ada (atau sangat sedikit) perbedaan antara alternatif, kode bijaksana.
vonbrand
4

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":

#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 membangun, Anda dapat menggunakannya dengan:

insmod hello.ko

dan itu mencetak hello initke dmesg.

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:

Operasi-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 interupsi
  • ioreadX dan pemetaan memori IO
  • antarmuka tingkat lebih tinggi untuk protokol populer seperti PCI dan USB
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
0

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 loadedmodul 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- rmmodmasing. Yang mengatakan daftar modul dan hapus modul.

kotak cat
sumber
0

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

module_init(init_fn);
init_fn()
{
   /* some code */
}

Modul yang sama bisa dijadikan driver

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}
Prabagaran
sumber
8
Driver tidak selalu modul, mereka dapat dimasukkan dalam gambar kernel utama.
Gilles 'SO- stop being evil'
3
@ Prabagaran: "Semua Driver adalah modul. Semua modul bukan driver." Ini bertentangan. Dalam istilah matematika, apa yang Anda katakan adalah D -> M dan M ->! D. Ini memungkinkan untuk D dan! D.
Francesco Turco
2
Saya pikir maksudnya "Semua driver adalah modul. Tidak semua modul adalah driver".
Renan
4
@Renan: Itu benar, tetapi jika Anda melihat riwayat edit untuk jawaban ini seseorang sudah mencoba untuk memperbaiki kesalahan dan penulis mengembalikannya. Biasanya saya hanya mengedit untuk memperbaiki kesalahan dan melanjutkan, tetapi dalam kasus ini saya telah -1'ed karena itu hanya salah dan membingungkan masalah.
Caleb
Seperti yang saya ingat (tidak pernah bermain-main dalam beberapa saat) ada beberapa driver yang tidak dapat dibangun sebagai modul yang dapat di-load. Saya ingat orang lain yang hanya bisa ditangani sebagai modul.
vonbrand