GNU/Linux >> Znalost Linux >  >> Linux

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

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

Ovladač je kousek kódu, který běží v jádře, aby mohl komunikovat s nějakým hardwarovým zařízením. "Pohání" hardware. Většina každého hardwaru ve vašem počítači má přidružený ovladač.¹ Velkou část běžícího jádra tvoří kód ovladače.²

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

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

  • Někdy je daný ovladač naprosto nezbytný, aby pomohl nastartovat systém. To se díky funkci initrd nestává tak často, jak byste si představovali.

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

  • Pokud své jádro sestavíte staticky a zakážete funkci dynamického načítání modulů Linuxu, zabráníte modifikaci kódu jádra za běhu. To poskytuje další zabezpečení a stabilitu na úkor flexibility.

Ne všechny moduly jádra jsou ovladače. Například relativně nedávnou funkcí v jádře Linuxu je, že můžete načíst jiný plánovač procesů. Dalším příkladem je, že složitější typy hardwaru mají často více generických vrstev, které jsou umístěny mezi nízkoúrovňovým hardwarovým ovladačem a uživatelskou zemí, jako je například ovladač USB HID, který implementuje konkrétní prvek zásobníku USB, nezávisle na základním hardwaru.

Kromě:

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

  2. Zbytek kódu v jádře operačního systému poskytuje obecné služby, jako je správa paměti, IPC, plánování atd. Tyto služby mohou sloužit primárně uživatelským aplikacím, jako je tomu v příkladech propojených dříve, nebo to mohou být interní služby používané ovladači nebo jinými intra- infrastruktura jádra.

  3. Ten v /boot , načtený do RAM při bootování zavaděčem na začátku procesu bootování.


Odpověď na vaši konkrétní otázku týkající se lspci výstup, řádek "ovladač jádra" odkazuje na ovladač, který je aktuálně navázán na kartu, v tomto případě proprietární nvidia Řidič. Řádek "moduly jádra" obsahuje seznam všech ovladačů známých schopné vazby na tuto kartu. Zde proprietární ovladač zobrazuje jiný název, pravděpodobně kvůli lspci našel ovladač a jeho název souboru oproti názvu zakódovanému do samotného ovladače.


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

"Ovladač jádra" není dobře definovaný pojem, ale zkusme to.

Toto je modul jádra, který nepohání žá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í jej můžete použít s:

insmod hello.ko

a vypíše hello initdmesg .

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

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

Příklad něčeho, co je "ovladač zařízení", je o něco těžší vygenerovat, protože k řízení vyžaduje hardware a popisy hardwaru bývají komplikované.

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

Pak vidíme, že v x86 se mluví s hardwarem takto:

  • in a out pokyny, např. https://stackoverflow.com/questions/3215878/what-are-in-out-instructions-in-x86-used-for/33444273#33444273
  • zpracování přerušení registrací obslužných rutin v CPU

Tyto operace nelze obecně provádět z uživatelské země, jak je vysvětleno v:Jaký je rozdíl mezi uživatelským prostorem a prostorem jádra? 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ě, aby byla taková interakce s hardwarem jednodušší a přenosnější:

  • request_irq zvládnout přerušení
  • ioreadX a mapování IO paměti
  • rozhraní ještě vyšší úrovně pro oblíbené protokoly jako PCI a USB

Linux
  1. Jaký je rozdíl mezi InnoDB a MyISAM?

  2. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  3. Jaký je rozdíl mezi ovladačem platformy Linux a normálním ovladačem zařízení?

  1. Jaký je rozdíl mezi fsck a e2fsck?

  2. Jaký je rozdíl mezi adduser a useradd?

  3. Jaký je rozdíl mezi ls a l?

  1. Jaký je rozdíl mezi Nepreemptivním, Preemptivním a Selektivním Preemptivním jádrem?

  2. Jaký je rozdíl mezi pravděpodobnými a nepravděpodobnými voláními v jádře?

  3. Jaký je rozdíl mezi partx a kpartx?