TakéDriver, Ovladač, Systémový ovladačPokročilý
Definice
Ovladač zařízení je programová vrstva, která překládá obecné požadavky operačního systému na konkrétní registry, přerušení a datové přenosy daného hardwaru. Díky ovladači může aplikace zapsat do souboru nebo vykreslit obraz, aniž by znala model disku či grafické karty. Ovladače běží nejčastěji v jádře, část jich pracuje i v uživatelském prostoru.
Proč mezi hardwarem a programem musí být překladatel
Každý kus hardwaru má vlastní rozhraní: jinou sadu registrů, jiný formát příkazů, jiné časování. Kdyby s ním musela komunikovat každá aplikace přímo, znamenala by výměna tiskárny přepsání textového editoru. Ovladač zařízení tuhle závislost odstíní. Operační systém definuje obecné operace (otevři, čti, zapiš, nastav parametr) a ovladač je převede na to, čemu rozumí konkrétní čip.
Co se odehraje při jednom zápisu na disk
Aplikace zavolá systémové volání, jádro ho předá souborovému systému a ten blokové vrstvě. Blokový ovladač sestaví příkaz podle protokolu sběrnice (NVMe, SATA, USB), zapíše ho do registrů řadiče nebo do fronty v paměti a řekne zařízení, ať začne pracovat. Přenos dat obvykle obstará DMA, takže procesor mezitím dělá něco jiného. Po dokončení vyvolá zařízení přerušení, obsluha přerušení v ovladači potvrdí dokončení a probudí čekající proces. Celý řetěz trvá desítky mikrosekund a aplikace z něj nevidí nic.
Kernel space versus user space
Klasické ovladače běží v režimu jádra, kde mají přímý přístup k paměti i k instrukcím pro práci s hardwarem. Výhodou je rychlost, nevýhodou to, že chyba v ovladači shodí celý systém: modrá obrazovka i kernel panic mají v drtivé většině původ právě tam. Proto se část ovladačů přesouvá do uživatelského prostoru. Linux má pro tenhle model rámce jako FUSE (souborové systémy), libusb nebo VFIO, Windows nabízí UMDF. Pád takového ovladače znamená jen ukončení jednoho procesu.
Modul, firmware a zavaděč
Ovladač není totéž co firmware. Firmware je kód běžící uvnitř samotného zařízení, který se do něj často nahrává právě ovladačem při startu (typicky u Wi-Fi karet). V Linuxu se ovladače distribuují jako moduly jádra (soubory .ko), které se zavádějí za běhu podle identifikátorů zařízení na sběrnici.
Stabilita rozhraní
Linux záměrně nemá stabilní vnitřní API jádra, takže ovladač mimo hlavní strom se musí opakovaně upravovat proti nové verzi. Windows naopak drží modely rozhraní dlouhodobě zpětně kompatibilní. Rozdíl vysvětluje, proč se v linuxovém světě tlačí na zařazení ovladače přímo do jádra a proč binární ovladače od výrobců stárnou rychle.
Kde se s ovladači potká i webový vývojář
Prohlížeč sám ovladače nepíše, ale opírá se o ně. WebGL a WebGPU jdou přes ovladač grafické karty, a chyba v něm se projeví jako artefakty v renderu nebo propad snímkové frekvence. Přístup ke kameře přes getUserMedia končí u ovladače videozařízení. U nativních aplikací na mobilech je vrstva ovladačů dodávaná výrobcem čipsetu a bývá hlavním důvodem, proč starší telefon nedostane novou verzi systému.
Podpis a bezpečnost
Kód v jádře má nejvyšší oprávnění, proto moderní systémy vyžadují digitální podpis ovladače. Windows to vynucuje u 64bitových systémů, Linux má mechanismus Secure Boot a podepsané moduly. Útok typu Bring Your Own Vulnerable Driver zneužívá legitimně podepsaný, ale děravý ovladač k získání přístupu do jádra.
Příklady z praxe
Zavedení modulu pro Wi-Fi kartu v Linuxu
Po připojení karty jádro přečte ze sběrnice PCI identifikátory výrobce a zařízení a podle tabulky v modulech najde odpovídající ovladač. Ten se zavede, nahraje do karty firmware ze souboru v /lib/firmware a zaregistruje síťové rozhraní. Pokud firmware v systému chybí, ovladač se zavede, ale rozhraní zůstane nefunkční a chyba se objeví v dmesg.
lspci -k | grep -A3 Network modinfo iwlwifi | head -n 5 dmesg | grep -i firmwareOvladač v uživatelském prostoru přes libusb
Vlastní USB měřicí přístroj nepotřebuje modul jádra. Aplikace si zařízení otevře přes libusb, odpojí generický ovladač jádra a komunikuje s koncovými body přímo. Pád programu neohrozí systém a distribuce je jen otázkou spuštění binárky s odpovídajícím pravidlem udev.
libusb_device_handle *h = libusb_open_device_with_vid_pid(ctx, 0x1d50, 0x6089); libusb_detach_kernel_driver(h, 0); libusb_claim_interface(h, 0); libusb_bulk_transfer(h, 0x81, buf, sizeof(buf), &len, 1000);
Časté omyly
- MýtusKdyž zařízení nefunguje, stačí stáhnout nejnovější ovladač z webu výrobce.
- Ve skutečnostiNovější ovladač bývá sestavený proti jiné verzi jádra nebo systému a může fungovat hůř než ten dodaný se systémem. U Linuxu je zpravidla nejspolehlivější ovladač, který je součástí hlavního stromu jádra a aktualizuje se s ním.
- MýtusOvladač a firmware jsou to samé.
- Ve skutečnostiOvladač je kód běžící na procesoru počítače v rámci operačního systému, firmware běží uvnitř samotného zařízení. Ovladač firmware do zařízení často teprve nahrává při inicializaci.
- MýtusOvladač musí být vždy součástí jádra.
- Ve skutečnostiŘada tříd zařízení se dnes obsluhuje z uživatelského prostoru přes FUSE, libusb, VFIO nebo UMDF ve Windows. Za cenu mírně vyšší režie tím pád ovladače přestane znamenat pád celého systému.
Časté dotazy
- Proč ovladač po aktualizaci jádra přestane fungovat?
- Linux nemá stabilní vnitřní rozhraní jádra, takže se struktury a funkce, o které se ovladač opírá, mezi verzemi mění. Modul přeložený proti staré verzi se do nového jádra nezavede. Ovladače v hlavním stromu jádra tento problém nemají, protože je vývojáři upravují společně se změnou rozhraní. Ovladače mimo strom řeší situace nástroj DKMS, který modul automaticky přeloží znovu po každé instalaci nového jádra. U Windows je situace jiná, tam se modely ovladačů drží zpětně kompatibilní po dlouhá období.
- Jak zjistím, který ovladač zařízení právě obsluhuje?
- Na Linuxu vypíše lspci -k nebo lsusb -t u každého zařízení jméno modulu, který si ho převzal. Detaily o modulu ukáže modinfo, načtené moduly vypisuje lsmod a chybové hlášky z inicializace najdete v dmesg nebo journalctl -k. Na Windows slouží Správce zařízení, kde karta Ovladač zobrazí poskytovatele, verzi, datum a soubory ovladače. Když u zařízení není přiřazený žádný modul, systém pro něj nemá podporu a zařízení zůstává nefunkční, i když je fyzicky detekované.
- Může chyba v ovladači shodit celý počítač?
- Ovladač běžící v režimu jádra má přístup k veškeré paměti a k privilegovaným instrukcím, takže neplatný ukazatel nebo zablokování v obsluze přerušení skončí pádem systému: kernel panic na Linuxu, modrá obrazovka na Windows. Právě proto se u zařízení, kde nejde o extrémní výkon, prosazují ovladače v uživatelském prostoru. Jejich chyba ukončí jen jeden proces a systém běží dál, i když za cenu vyšší režie při přepínání mezi kontexty.
- Potřebuje ovladač digitální podpis?
- Windows v 64bitových verzích odmítne zavést nepodepsaný ovladač do jádra a podpis musí pocházet z ověřeného programu Microsoftu. Linux vyžaduje podepsané moduly při zapnutém Secure Bootu, jinak zavedení selže nebo systém označí jádro jako znečištěné. Podpis však potvrzuje pouze původ, nikoli bezpečnost kódu. Útoky typu Bring Your Own Vulnerable Driver spočívají v tom, že útočník nainstaluje legitimně podepsaný, ale zranitelný ovladač a jeho chybu využije k získání práv v jádře.
Zdroje
- The Linux Kernel documentation(otevře se v novém okně)
- Windows Drivers documentation(otevře se v novém okně)
- Device driver(otevře se v novém okně)
- Ovladač(otevře se v novém okně)