it-swarm-eu.dev

Jaký je rozdíl mezi ovladači jádra a moduly jádra?

Když udělám lspci -k na mém Kubuntu s generickým jádrem 3.2.0-29 vidím něco takového:

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

K dispozici je ovladač jádra nvidia a moduly jádra nvidia_current, nouveau, nvidiafb.

Teď jsem přemýšlel, jaký by mohl být rozdíl mezi ovladači jádra a moduly jádra?

68
JohnnyFromBF

Modul jádra je kousek kompilovaného kódu, který lze vložit do jádra za běhu, například s insmod nebo modprobe =.

Ovladač je kousek kódu, který běží v jádru a mluví s nějakým hardwarovým zařízením. To „řídí“ hardware. Většina každého hardwaru v počítači má přidružený ovladač.¹ Velká část běžícího jádra je kód ovladače.²

Ovladač může být zabudován staticky do souboru jádra na disku.³ Ovladač může být také vytvořen jako modul jádra, takže jej lze dynamicky načíst později. (A pak možná vyloženo.)

Standardní praxí je budovat ovladače jako moduly jádra, pokud je to možné, spíše než je spojovat staticky s jádrem, protože to poskytuje větší flexibilitu. Existují však dobré důvody, proč:

  • Někdy je daný ovladač nezbytně nutný, aby pomohl systému nastartovat. To se nestane tak často, jak si dokážete představit, díky funkci initrd .

  • Staticky vytvořené ovladače mohou být přesně to, co chcete v systému, který je staticky upraven, například vestavěný systém . To znamená, že pokud předem víte, které ovladače budou vždy potřeba a že se to nikdy nezmění, máte dobrý důvod, abyste se neobtěžovali s dynamickými moduly jádra.

  • Pokud stavíte jádro staticky a deaktivujete funkci načítání dynamického modulu Linuxu, zabráníte běhové úpravě kódu jádra. To poskytuje další zabezpečení a stabilitu na úkor flexibility.

Ne všechny moduly jádra jsou ovladače. Například relativně novinkou v linuxovém jádru je to, že můžete načíst jiný plánovač procesů . Dalším příkladem je to, že složitější typy hardwaru mají často více obecných vrstev, které sedí mezi nízkoúrovňovým hardwarovým ovladačem a uživatelskou oblastí, jako je ovladač USB HID , který implementuje konkrétní prvek) zásobníku USB , nezávisle na základním hardwaru.


Kromě:

  1. Výjimkou z tohoto širokého příkazu je čip CPU, který nemá „ovladač“ per se. Váš počítač může také obsahovat hardware, pro který nemáte žádný ovladač.

  2. Zbytek kódu v jádru OS poskytuje obecné služby jako správa paměti , IPC , plánování atd. Tyto služby mohou sloužit především aplikacím serland , jako v příkladech, které byly dříve spojeny, nebo se mohou jednat o interní služby používané řidiči nebo jinou infrastrukturou uvnitř jádra.

  3. Ten v /boot, načteno do RAM v době bootování pomocí boot loader na začátku bootovací proces .

79
Warren Young

Chcete-li odpovědět na konkrétní otázku týkající se výstupu lspci, označuje řádek "ovladač jádra", který ovladač je aktuálně vázán na kartu, v tomto případě proprietární ovladač nvidia. Řádek "moduly jádra" uvádí všechny ovladače známé jako schopné vázat se na tuto kartu. Zde proprietární ovladač zobrazí jiné jméno, pravděpodobně kvůli tomu, jak lspci našel ovladač a jeho název souboru versus jméno zakódované do samotného ovladače.

19
Jim Paris

Modul jádra nemusí být vůbec ovladačem zařízení

„Ovladač jádra“ není dobře definovaný pojem, ale pojďme ho zastřelit.

Jde o modul jádra, který nevede žádný hardware, a proto jej nelze rozumně považovat za „ovladač zařízení“:

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

Po sestavení můžete použít s:

insmod hello.ko

a vytiskne hello initdmesg.

Existují však moduly jádra, které nejsou ovladači zařízení, ale jsou skutečně užitečné, např. Moduly, které vystavují informace o ladění/výkonu jádra.

Ovladače zařízení jsou obvykle také moduly jádra.

Příkladem něčeho, co je „ovladač zařízení“, je vygenerování o něco těžší, protože vyžaduje hardware k řízení a popisy hardwaru bývají komplikovanější.

Pomocí QEMU nebo jiných emulátorů však můžeme konstruovat softwarové modely skutečného nebo zjednodušeného hardwaru, což je skvělý způsob, jak se naučit, jak mluvit s hardwarem. Zde je jednoduchý příklad minimálního ovladače zařízení PCI: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c

Uvidíme, že v roce x86, mluvit s hardwarem přijde na:

Tyto operace nemohou být obecně prováděny z userland, jak je vysvětleno na: Jaký je rozdíl mezi uživatelským prostorem a jádrem? Existují však některé výjimky: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .

Jádro pak nabízí API vyšší úrovně pro usnadnění a přenositelnost takové hardwarové interakce:

  • request_irq k řešení přerušení
  • ioreadX a IO mapování paměti
  • ještě vyšší úrovně rozhraní pro populární protokoly jako PCI a USB

Podle tohoto Nice tutoriál :

... jedním typem modulu je ovladač zařízení, který umožňuje jádru přístup k hardwaru připojenému k systému.

Takže pokud se pokusíme nakreslit strom, budeme mít "Ovladač zařízení", který zdědí (rozšiřuje) modul a který má konkrétnější vlastnosti, mezi nimiž najdeme "přístup k hardwaru" ...

5
user1847726

Všechny ovladače jsou moduly. Ne všechny moduly jsou ovladače.

Moduly lze vkládat za běhu. Moduly/ovladače lze také staticky kompilovat spolu s jádrem.

Typický modul init má

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

Stejný modul lze vyrobit jako řidič

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

Moje odpověď půjde s Jimem. Ovladač jádra je program (modul jádra), který je určen k řízení hardwaru. Výstup lspci říká, že nvidia je ovladač jádra, protože se jedná o modul loaded pro zařízení. Spolu s tím přichází i další dostupné moduly jádra.

Dodám, že příkazy v linuxu k vypsání a odebrání ovladačů jsou lsmod respektive rmmod. Což říká modul seznamu a odstranit modul.

0
paintbox