Van az a pillanat, amikor kinyitod a fiókod, és kipottyan belőle egy tíz-tizenöt éves USB-s kontroller, egy különös optikai egér vagy egy egzotikus vonalkódolvasó, amihez már régóta nincs hivatalos drivertámogatás. A rendszer felismeri, hogy valami eszköz csatlakoztatva van, de a szoftverek csak értetlenül bámulják, mint borjú az új kaput. Pontosan így éleszd fel a fiók mélyén porosodó USB-s perifériáidat, és írj saját kernel-szintű illesztőprogramot, hogy ne csak dísznek maradjanak az asztalodon.
A legtöbb mai operációs rendszer már elhagyta a támogatást azokhoz a régi, specifikus eszközökhöz, amikhez a gyártók már réges-rég nem adnak frissítést. Amikor írsz egy saját illesztőprogramot, akkor lényegében te határozod meg, hogyan beszéljen a hardver a számítógéped operációs rendszerének magjával. Ez nem egy egyszerű alkalmazás, ami elszáll, ha hibázol. Itt minden közvetlenül a rendszer szívében történik, ezért az első pár teszt után garantáltan lesz pár kékhalál élményed is.
A folyamat során rengeteget tanulsz az USB protokolltól kezdve egészen a memóriakezelésig. Amikor a saját kódod végre értelmezhető adatokat küld a gépednek az őskövület hardverből, az egy egészen különleges sikerélmény.
Mielőtt belevágnál a kódolásba, össze kell szedned a megfelelő környezetet. Nem elég egy sima szövegszerkesztő, komolyabb szerszámokra lesz szükség, amikkel a kernel szintű utasításokat össze tudod gyúrni.
Az USB egy meglehetősen szószátyár szabvány. Amikor bedugsz valamit, az eszköz bemutatkozik a gépnek egy úgynevezett deskriptorral. Ez tartalmazza az eszköz azonosítóját, a gyártót és azt is, milyen típusú adatok érkeznek majd belőle.
A Wireshark segítségével pontosan látni fogod, milyen csomagok érkeznek, amikor csinálsz valamit a perifériával. Ezeket a csomagokat kell majd a kódodban dekódolnod, hogy a gép tudja, mit is jelent a beérkező bináris adathalmaz.
Amikor megvan a terved, jöhet a fejlesztés. A Linux kernel modulok egyfajta speciális könyvtárak, amiket futás közben tudsz hozzácsatolni a maghoz. A modulnak regisztrálnia kell magát az USB alrendszernél.
usb_register függvénnyel történik.probe függvény lesz az a pont, ahol az eszköz csatlakoztatásakor a rendszer megkérdezi, hogy a te drivered kezeli-e ezt a hardvert.disconnect függvénynek pedig gondoskodnia kell arról, hogy az eszköz kihúzásakor minden erőforrást tisztán adjon vissza a rendszernek, nehogy elszálljon a kernel.A legnehezebb rész az, amikor a nyers adatokat át kell konvertálnod olyan jelekké, amiket a felhasználói programok is értenek. Például, ha egy régi egérről van szó, akkor a nyers USB csomagokból ki kell olvasnod az X és Y koordinátákat, majd azokat átadnod az input alrendszernek, ami végül mozgatja a kurzort a képernyőn.
Ne számíts arra, hogy az első verzió azonnal működni fog. A kernel fejlesztésben a hibakeresés leggyakrabban a printk használatával történik, ami a rendszer naplófájljaiba írja ki a fontos eseményeket.
Amikor végre látod, hogy a porosodó eszköz életre kel a kezed alatt, és a gép úgy reagál rá, mintha csak egy modern eszköz lenne, akkor érzed igazán a programozás erejét. Nemcsak újrahasznosítottál valamit, hanem mélyebben megértetted, hogyan működik a géped belső világa. Ez az igazi szoftverfejlesztés, ahol a bitek a fémek között találkoznak a valósággal.