Stranica: 1/1.

Driveri u linuxu

Postano: 01 svi 2014, 15:29
Postao/la jurastublic
Driveri u linux sustavima

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

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

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
 
Ako slučajno taj driver koristi još neki uređaj onda se to ne smije već se taj driver "unbinda" putem datoteke u /sys folderu
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  
Ponekad driver odbija ID uređaja jer popis ID-ova uređaja u driveru nije ažuriran iako bi taj driver odgovarao. U tom slučaju do "bindanja" ne dolazi makar je driver učitan ručno. Za to postoji datoteka u folderu /sys.../drivers pod nazivom new_id i upisivanjem ID-a u tu datoteku se može dodati novi ID uređaja u driverov popis. Isto tako se ID upisivanjem u remove_id može obrisati iz tabele i tako spriječiti da se nepoželjni driver binda na uređaj.

Te ručno dodane postavke u /sys ne ostaju nakon reboota već ih treba upisati u obliku skripte ili udev pravila.
:cenzura
Toliko za danas.

Re: Driveri u linuxu

Postano: 01 svi 2014, 15:59
Postao/la shrike
super tekst, i evo par nadopuna:

Kod blackilistanja je potrebno na dosta distri napraviti update initramfsa koji se radi ovako:

Kod: Označi sve

update-initramfs -u -k all
Dodatno, primjetio sam da jako puno ljudi pita nešto u stilu "da li posotje dirveri za distru A jer ih nema za distru B". driveri na linuxu ne dolaze za distre, već dolaze za kernele. ako vaša distra nema neki driver, "linux način rješavnaja problema" je upgreadati kernel bilo instalacijom veće verzije iz paketnog sustava, bilo ručnom kompilacijom.

Re: Driveri u linuxu

Postano: 01 svi 2014, 16:59
Postao/la Suko
Vidim da se tu već sprema tekst za naslovnicu. :zvizdi

Re: Driveri u linuxu

Postano: 01 svi 2014, 17:04
Postao/la Medojedni jazavac
Super informativno. Hvala na ovome.

Re: Driveri u linuxu

Postano: 01 svi 2014, 18:45
Postao/la Vl@do
Za mene pretesko, ali i prezanimljivo stivo. Svakako bi bilo korisno, u ovom stilu, na portalu objasniti svima nama koji ulazimo polako, ali sigurno u ovaj svijet.

Re: Driveri u linuxu

Postano: 01 svi 2014, 20:26
Postao/la zvir
A ako nekoga zanima programiranje Linux drivera, evo jedna serija članaka koji čitatelja u problematiku uvode pisanjem jednostavnih drivera. LINK

Have fun. :)