Kostra ovladače
V této části si krok za krokem sestavíme základní kostru modulu jádra pro znaková zařízení, kterému budeme říkat dskel (= driver’s skeleton). Tento jednoduchý modul pak může sloužit jako šablona pro vývoj jakéhokoliv jiného modulu.
Při vývoji modulu dskel projedeme ty nejdůležitější pasáže z problematiky vývoje ovladačů zařízení. Vážným zájemcům pak vřele doporučuji ke studiu anglicky psanou knihu Linux Device Drivers od nakladatelství O’Reillyhttp://lwn.net/Kernel/LDD3/.
Co nás čeká ...
Základní vlastnosti
Jednoduché ovladače (moduly) se obvykle skládají jen z jednoho zdrojového souboru. S jedním zdrojovým souborem si vystačíme i my. Tento soubor budeme postupně rozšiřovat, tak jak budou nám přibývat potřebné znalosti.
Inicializace a ukončení - I
Inicializace a ukončení - ta nejzákladnější funcionalita každého ovladače ať už jde o prostý ”Hello kernel!” až po ovladač nějakého složitého blokového zařízení. Pojďme si ukázat, co všechno musíme při inicializaci a ukončování ovladače zvládnout.
Sestavení ovladače
Už máme první část kostry našeho modulu dskel hotovou, pojďme se proto naučit jak modul zkompilovat do podoby objektového souboru jádra.
Inicializace a ukončení - II
V předchozím textu, kde jsme probírali inicializaci a ukončení modulu během jeho zavádění/vyjímání z jádra, jsme záměrně vynechali jednu důležitou část. A sice přidání informací o našem modulu do adresáře /sys.
Operace open() a release()
Před samotným výkladem o souborových operacích open() a release() si něco povíme o struktuře file, jejíž instance, resp. ukazatel na ni je prvním parametrem každé souborové operace, která přistupuje k ovladači.
Operace read() a write()
Operace read() a write() si jsou velmi podobné. Liší se v podstatě jen směrem přenosu dat. Operace read() přenáší data ze zařízení, zatímco operace write() do zařízení.
Operace ioctl()
Operace ioctl() a odpovídající systémové volání, resp. knihovní funkce ioctl() slouží k rozšířenému ovládání zařízení. Většinou se s její pomocí nastavují parametry, režimy zařízení apod.
Přístup k vnějšímu zařízení
Na začátku našeho povídání o ovladačích pro systém Linux jsme si vymezili prostor ovladače a definovali jsme si dvě rozhraní, která je třeba naimplementovat, jestliže má být ovladač přístupný z uživatelského prostoru a zároveň jestliže má sám přistupovat na nějaké zařízení. Tato situace je zachycena na obrázku1.8. Rozhraní vůči uživatelskému prostoru je zde označeno jako rozhraní A, zatímco rozhraní pro komunikaci se zařízením je označeno jako rozhraní B. Popisu rozhraní A jsme věnovali celý předchozí text. V této části se proto podíváme jakým způsobem naimplementovat rozhraní B.
Práce s časem
Práci s časem se nelze při vývoji ovladačů zařízení prakticky vyhnout. Vždy je třeba někde chvíli počkat, provádět nějaké úlohy periodicky apod. Jádro (Linux) dává programátorům ovladačů k dispozici celou řadu nástrojů. Až tolik, že je obtížné se v nich vyznat a zvolit ten správný pro danou potřebu. V následujícím textu si proto ukážeme ty nejzákladnější postupy při práci s časem, které budou pro jednoduché ovladače bohatě dostačovat.
Souběh, kritické sekce
Při psaní kódu našeho modulu dskel jsme zatím víceméně opomíjeli fakt, že kód ovladače může a také většinou je vykonáván více programy současně - říkáme, že kód je vykonáván na kontextu více programů.