Çekirdek sürücüleri ve çekirdek modülleri arasındaki fark nedir?


67

Ben yaptığınızda lspci -kbir 3.2.0-29-jenerik çekirdek ile benim Kubuntu'da böyle bir şey görebilirsiniz:

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

Bir çekirdek sürücüsü yoktur nvidiave çekirdek modülleri nvidia_current, nouveau, nvidiafb.

Şimdi Kernel sürücüleri ve Kernel modülleri arasındaki farkın ne olacağını merak ettim.

Yanıtlar:


78

Bir çekirdek modülü, insmodya da gibi, çalışma zamanında çekirdeğe eklenebilecek bir derlenmiş kod parçasıdır modprobe.

Bir sürücü, bazı donanım aygıtlarıyla konuşmak için çekirdekte çalışan bir kod parçasıdır. Donanımı "sürer". Bilgisayarınızdaki donanımın her bir parçasının ilişkili bir sürücüsü var. Running Çalışan bir çekirdeğin büyük bir kısmı sürücü kodudur.

Bir sürücü, diskteki çekirdek dosyaya statik olarak yerleştirilebilir. Bir sürücü, daha sonra dinamik olarak yüklenebilmesi için bir çekirdek modülü olarak da oluşturulabilir. (Ve sonra belki boş.)

Standart uygulama, sürücüleri daha fazla esneklik sağladığından, onları çekirdeğe statik olarak bağlamak yerine, mümkün olduğunda çekirdek modülleri olarak oluşturmaktır. Ancak yapmamak için iyi nedenler var:

  • Bazen sistemin başlatılmasına yardımcı olmak için belirli bir sürücü mutlaka gereklidir. İnitrd özelliği nedeniyle hayal edebileceğiniz kadar sık ​​olmaz .

  • Statik olarak oluşturulmuş sürücüler, gömülü bir sistem gibi statik olarak kapsamlı bir sistemde tam olarak istediğiniz şey olabilir . Başka bir deyişle, hangi sürücülere her zaman ihtiyaç duyulacağını ve bunun asla değişmeyeceğini önceden biliyorsanız, dinamik çekirdek modülleriyle uğraşmamanız için iyi bir nedeniniz vardır.

  • Çekirdeğinizi statik olarak kurar ve Linux'un dinamik modül yükleme özelliğini devre dışı bırakırsanız, çekirdek kodunun çalışma zamanı değişikliğini önlersiniz. Bu esneklik pahasına ek güvenlik ve istikrar sağlar.

Tüm çekirdek modülleri sürücü değildir. Örneğin, Linux çekirdeğindeki nispeten yeni bir özellik, farklı bir işlem zamanlayıcısı yükleyebilmenizdir . Başka bir örnek, daha karmaşık donanım türlerinin , altta donanım donanımından bağımsız olarak, USB yığınının belirli bir elemanını uygulayan USB HID sürücüsü gibi düşük seviye donanım sürücüsü ile kullanıcı alanı arasında oturan çoklu genel katmanlara sahip olmasıdır .


asides:

  1. Bu geniş ifadenin bir istisnası, kendi başına "sürücüsü" olmayan CPU yongasıdır . Bilgisayarınızda ayrıca sürücünüz olmayan bir donanım da bulunabilir.

  2. Bir işletim sistemi çekirdeğindeki kodun geri kalanı, bellek yönetimi , IPC , zamanlama vb. Gibi genel servisler sağlar . Bu servisler, daha önce bağlantılı örneklerde olduğu gibi öncelikle kullanıcı uygulamaları için hizmet verebilir veya sürücüler veya diğer kullanıcılar tarafından kullanılan dahili servisler olabilir. çekirdek altyapısı.

  3. Biri , önyükleme işleminin başında önyükleyici/boot tarafından önyükleme sırasında RAM'e yüklendi .


1
Modüller dosya sistemleri, ağ protokolleri, güvenlik duvarı işlevleri ve daha fazlası olabilir. Bazı donanımlar (örneğin WiFi kartlar) bazı modüller destekliyor, bazıları ise genel altyapıyı sunarken, diğerleri donanımı kendisi idare ediyor.
vonrand

1
Bu iyi bir genel taslak, ancak OP ile tam olarak aynı soruyu sordum, sonra bu cevaba rastladım ve hala "kullanılan sürücünün" neden "modüllerden" farklı olduğunu bilmiyordum. Buna karşılık, @Jim Paris'in cevabı doğrudur. Kimden man lspci: "-k Her bir aygıtı yöneten çekirdek sürücülerini ve ayrıca onunla çalışabilen çekirdek modüllerini göster ." Bunu şu şekilde okuyabilirsiniz: " Aygıtı şu anda / fiilen kullanan sürücüyü ve ayrıca kullanması gereken / kullanması gereken tüm modülleri göster ".
Binarus

Windows biliyorsanız: Bir modül bir DLL dosyasına çok benzer. Unix'te, bir modül paylaşılan bir nesneye benzer, ancak bir modül yalnızca çekirdek içindir. Dinamik olarak bağlanmış bir modül sürücüleri içerebilir. Bir çekirdek statik olarak bağlı sürücüler içerebilir. Bir modül bir DLL'den (ya da .so'dan) farklıdır, çünkü çekirdeğin işlerin nasıl dinamik olarak yükleneceği konusunda özel gereksinimleri vardır.
robocat

18

lspciÇıktı hakkındaki özel sorunuza cevap vermek için , "çekirdek sürücü" satırı, hangi sürücünün o anda karta bağlı olduğunu belirtir, bu durumda özel nvidiasürücü. "Çekirdek modülleri" satırı, bu karta bağlayabildiği bilinen tüm sürücüleri listeler . Burada, özel sürücü, muhtemelen lspcisürücüyü ve dosya adını, sürücünün kendisine kodlanan adla karşılaştırmasından dolayı farklı bir ad gösterir .


Teşekkürler - bu yardımcı oldu. Sadece yayınlamış olsaydım man lspci- tam olarak ne yazdığını söylüyor.
Binarus

5

Bu güzel eğiticiye göre :

... bir tür modül, çekirdeğin sisteme bağlı donanıma erişmesini sağlayan aygıt sürücüsüdür.

Yani, bir ağaç çizmeye çalışırsak, Modül'den miras alan ve aralarında "donanıma erişimi" bulduğumuz daha belirgin özelliklere sahip "Aygıt sürücüsü" olacak ...


Bu sadece kısmen doğrudur. Sürücü, hiyerarşideki bir sınıfın nesnesidir (evet, çoğu işletim sistemi gibi Linux'un iç tasarımı nesne yönelimlidir). Ancak, söz konusu sürücü bir modül (çalışma zamanında yüklenebilir) veya çekirdeğin içinde derlenmiş olabilir. Akıllıca, alternatifler arasında (veya çok az) bir fark yoktur.
vonrand

4

Bir çekirdek modülü hiç bir aygıt sürücüsü olmayabilir.

"Çekirdek sürücüsü" iyi tanımlanmış bir terim değildir, ancak hadi bir şans verelim.

Bu, herhangi bir donanıma sahip olmayan ve dolayısıyla bir "aygıt sürücüsü" olarak kabul edilemeyecek bir çekirdek modülüdür:

#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)

İnşa ettikten sonra şu şekilde kullanabilirsiniz:

insmod hello.ko

ve yazdırır hello initiçin dmesg.

Bununla birlikte, aygıt sürücüsü olmayan çekirdek modülleri vardır, ancak bunlar gerçekten yararlıdır, örneğin, çekirdek hata ayıklama / performans bilgisini ortaya çıkaran modüller.

Aygıt sürücüleri genellikle çekirdek modüllerdir.

Bir "aygıt sürücüsü" olan bir şeye örnek olarak, üretilmesi biraz zordur, çünkü sürülmesi gereken bir donanım gerektirir ve donanım açıklamaları karmaşık olma eğilimindedir.

Bununla birlikte, QEMU veya diğer emülatörleri kullanarak, gerçek veya basitleştirilmiş donanımın yazılım modellerini oluşturabiliriz; bu, donanımla nasıl konuşulacağını öğrenmenin harika bir yoludur. İşte basit bir PCI aygıt sürücüsü örneği: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c

Daha sonra x86'da donanıma göre konuşmanın aşağı indiğini görüyoruz:

Bu işlemler genel olarak kullanıcı alanından yapılamaz: Açıklandığı gibi: Kullanıcı alanı ve Çekirdek alanı arasındaki fark nedir? Bununla birlikte, bazı istisnalar vardır: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .

Daha sonra çekirdek, bu tür donanım etkileşimini daha kolay ve daha taşınabilir hale getirmek için daha yüksek seviyeli API'ler sunar:

  • request_irq kesintileri idare etmek
  • ioreadX ve IO hafıza eşlemesi
  • PCI ve USB gibi popüler protokoller için daha da yüksek arayüzler

0

Cevabım Jim ile gidecek. Çekirdek sürücüsü, bir donanım parçasını sürmek için tasarlanmış bir programdır (çekirdek modülü). Lspci çıktısı, nvidia'nın loadedcihazın modülü olduğu gibi çekirdek sürücü olduğunu da söylüyor . Bununla birlikte mevcut diğer çekirdek modülleri de geliyor.

Ben linux komutlar listelemek ve sürücüler vardır kaldırmak için ekleyeceğiz lsmodve rmmodsırasıyla. Hangi liste modülü diyor ve modülü kaldır.


0

Tüm Sürücüler modüllerdir. Tüm modüller sürücü değildir.

Modüller çalışma zamanında eklenebilir. Modüller / Sürücüler de çekirdekle birlikte statik olarak derlenebilir.

Tipik modül init var

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

Aynı modül sürücü yapılabilir

module_init(init_fn);
init_fn()
{
   device_register(&device);
   /* some code */
}

8
Sürücüler her zaman modül değildir, ana çekirdek görüntüsüne dahil edilebilirler.
Gilles

3
@Prabagaran: "Tüm Sürücüler modüldür. Tüm modüller sürücü değildir." Bu çelişkilidir. Matematiksel olarak söylediğiniz şey D -> M ve M ->! D. Bu D ve! D için izin verir.
Francesco Turco

2
Bence "Tüm sürücüler modüllerdir. Tüm modüller sürücüler değildir" anlamına gelir.
Renan,

4
@Renan: Bu doğru olurdu, ancak bu cevabın düzenleme geçmişine bakarsanız, biri zaten hatayı düzeltmeye çalıştı ve yazar bunu geri aldı. Normalde sadece hatayı düzeltmek ve devam etmek için düzenlerdim, ama bu durumda -1'' oldum çünkü bu sadece yanlış ve konuyu karıştırmak.
Caleb

Hatırladığım kadarıyla (bir süredir kandırılmadım), yüklenebilir modüller olarak yapılamayacak bazı sürücüler var. Sadece modül olarak kullanılabilecek başkalarını hatırlıyor gibiyim.
vonbrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.