Pokušat ću ovdje dati neki svoj uvid u to kako funkcionira sustav drivera na prosječnom linuxu, jednostavno jer sam vidio da ima dosta komentara na forumu u kojima ljudi miješaju stvari koje inače ne bi miješali da imaju potpuniju sliku o tome. Nadam se da će mi oni koji primijete da tu nešto ne štima ukazati na pogreške ili na neku novu informaciju.
Daklem, računalo je sustav različitih hardverskih i softverskih dijelova, međusobno spojenih na milijun načina.
Hardverski je dio složen uglavnom tako da postoji nekoliko glavnih busova na matičnoj ploči, na koje se spajaju drugi uređaji ili drugi busovi (npr. USB bus se spaja na PCI bus). Busovi se sastoje od veznih linija (žica, bakrenih traka) i njihovih kontrolerskih čipova.
Većina uređaja ima neku vrstu kontrolera. I većina ih je, u stvari, više uređaja u jednom pakiranju (npr. web kamera ima kontroler za sliku i za zvuk, za usb vezu itd.)
Korisničke aplikacije u linuxu ne upravljaju kontrolerima tih uređaja direktno, nego koriste usluge drugih programa, napisanih za kontrolu svakog od tih uređaja posebno. Ti programi su driveri.
Random smiley:
Gledano sa softverske točke, u linuxu je kernel, tj. jezgra operativnog sustava, odvojena zbog sigurnosnih i stabilnosnih razloga od korisničkih aplikacija i komunicira s korisničkim dijelom proslijeđivanjem parametara. Driveri su također dio kernela i koriste isti mehanizam. Istina, postoje i tzv. user space driveri, koji nisu dio kernela ali svejedno i oni imaju svog "jataka" u kernelu koji mapiranjem omogućuje pristup hardveru.
Driveri mogu biti ugrađeni u kernel a mogu se i naknadno učitavati u obliku modula.
Kernel svoju strukturu uređaja, drivera i hijerarhiju busova održava putem posebnog datotečnog sustava u folderu /sys iz kojega se u svakom trenutku može vidjeti trenutna struktura. U /sys se mogu i dodjeljivati novi parametri atributima drivera, naravno, oni za koje je to dozvoljeno. Driveri su u /sys predstavljeni u obliku foldera, atributi u obliku datoteka a veze između uređaja i njihovih drivera u obliku, tko bi rek'o, symlinkova (shortcuta).
Kako linux kernel uopće zna kada je neki uređaj priključen i kako onda dodjeljuje pravi driver svakom uređaju?
Kernel putem već ugrađenih drivera može kontrolirati busove i natjerati ih da sami sebe skeniraju i jave promjene.
Kad bus driver registrira novi uređaj, uzima podatke gdje se na busu nalazi i uzima tvornički kodirane podatke iz uređaja poput VendorID i ProductID te mu dodaje major i minor ID oznake.
Kernel na osnovu tih podataka napravi potrebne foldere i datoteke u /sys za taj uređaj.
Onda upiše te podatke u nekoliko globalnih varijabli sustava i pokrene hotplug korisničku skriptu ili najčešće, udev.
Udev onda koristi te podatke iz globalnih varijabli da doda odgovarajuće datoteke u /dev folder. Putem /dev datoteka korisnički programi koriste usluge uređaja. Udev može raditi i druge stvari poput pokretanja drugih programa i korisničkih skripti kad se određeni uređaj pojavi.
Udev također pokreće i program modprobe koji učita drivere za uređaj.
Kako modprobe učitava drivere?
Not so random smiley:
Svaki driver ima u sebi popis ID-ova uređaja koje podržava. Program depmod, koji se pokreće pri podizanju sustava, očitava te popise iz svih drivera i stvara nekoliko datoteka u folderu /lib/modules/naziv_kernela. Te datoteke sadrže popise, ovisnosti i mapiranja svih dostupnih drivera i njih modprobe koristi da bi saznao koje sve drivere da učita osim onoga kojeg mu je kernel poslao. Zato je, na primjer, bitno da se prilikom ručnog dodavanja drivera u /lib/modules/ime_kernela folder pokrene "sudo depmod -a", inače modprobe ne zna za novi driver. Kad se driver automatski instalira onda obično instaler vodi brigu oko pokretanja depmoda.
Ako u depmod datotekama nema oznake drivera koja odgovara oznaci uređaja koju je poslao kernel onda modprobe neće učitati driver. Ako korisnik zna da neki driver može raditi s određenim uređajem, da bi ga modprobe učitao treba dodati novi "alias" drivera u /etc/modprobe.d .
Taj alias odgovara modaliasu u /sys folderu tog uređaja.
Kada je učitavanje dovršeno, kernel odlučuje koji je od učitanih drivera kandidata najbolji a ostale odbacuje. Tek onda kernel povezuje određeni driver s uređajem. To se zove bindanje.
Kod tog odlučivanja može doći do pogrešnog odabira. Moguće je da postoji driver za koji kernel pretpostavlja da je bolji od onoga kojega bi korisnik htio iako oba odgovaraju i onda "binda" njega. U tom slučaju, najjednostavnije je "blacklistati" nepoželjni driver.
Primjer:
Kod: Označi sve
sudo echo "blacklist ime_drivera" >> /etc/modprobe.d/blacklist.conf
Primjer:
Kod: Označi sve
sudo echo -n "Oznaka uređaja" > /sys/bus/naziv_busa/drivers/nepoželjni_driver/unbind
i isto tako binda drugi:
sudo echo -n "Oznaka uređaja" > /sys/bus/naziv_busa/drivers/dobar_driver/bind
Te ručno dodane postavke u /sys ne ostaju nakon reboota već ih treba upisati u obliku skripte ili udev pravila.
Toliko za danas.