LINUX-BG Adres : http://www.linux-bg.org |
Linuks moduli |
Ot: PxL Publikuvana na: 22-02-2007 Adres na statiiata: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=devs&key=390713057 |
.::Linux draivuri::.
.:: Koi? Kude? Zashto? Predi izvestno vreme biah mnogo zapalen da napisha draivur za iadroto na Linux.Izvestno mi beshe gore-dolu kak se pishe draivur i kak raboti takuv, suotvetno imah i izvestni poznaniia po C.Obshto vzeto tova bi triabvalo da e iziskvaneto za pisane na draivuri za ustroistva. Kato tsialo podobni materiali ne lipsvat v internet, no ne sum sreshtal na bulgarski. .:: Niva na komunikatsiia Kakto predpolagam e izvestno na povecheto Linux potrebiteli, ustroistvata tam sa predstaveni kato failove, namirat se v /dev chasta...Otsustva portovata komunikatsiia...? Po-skoro komunikatsiiata s fizicheskite ustroistva se osushtestviava na dve niva. Realnata komunikatsiia s harduernoto ustroistvoto se sushtestviava ot t.nar. kernel space nivo, kudeto iadroto i modulite mu se grizhat da predavat informatsiiata ot i za fizicheskite ustroistva kum suotvetstvashtite im takiva predstaveni ot failove. Drugata chast se naricha user space, kudeto aplikatsiite komunikirat s tezi failove. .:: Kernel space / User space Kato nachalo mozhem da kazhem nakratko, che modulite sa prilozheniia, chiiato ideia e da se razshiri i lesno da se dobavia funktsionalnost kum iadroto. V zavisimost ot tipa na iadroto (v konkretniiat sluchai viziram Linuks iadro) modulite mogat da se dobaviat dinamichno, t.e. ne e nuzhna prekompilatsiia i restart na samoto iadro za da bude dobaven nov modul. Po-spetsialno ni interesuvat t.nar. monolitic tip iadra, tui kato Linux iadroto e takuv tip. Pri monolitic tipovete iadra (za razlika naprimer ot microkernel tipovete) modulite izpolzvat pametta zadelena za iadroto. Tova oznachava, che vsichki globalni danni sa vidimi za vsichki moduli. Imenno poradi tova pisaneto na moduli triabva da e mnogo strogo standartizirano i e za predpochitane da se polzvat static promenlivi.. Kakto spomenah po-gore tselta na draivurite v kernel space e da svurzhat failovete na ustroistvata v /dev sus samit eharduerni ustroistva.Modulite v kernel space (LKM - Loadable Kernel Modul) obmeniat danni s potrebitelskite aplikatsii v user space chrez callback funktsii v iadroto.Predstaveno vizualno tova bi izglezhdalo taka: Za da ne oburkam niakogo ili sebe si napravo shte dam primer za prost kernel modul.
Kakto zabeliazvate izpolzvam niakolko makrosa, chrez koito opredeliame litsenz i informatsiia za modula. Definirani sa v module.h neobhodimost za vseki edin kernel modul (vim /usr/include/linux/module.h). Za da kompilirame shte ni triabva elementaren Makefile
Zapazvame i kompilirame:
Kompiliraniiat modul simple.ko mozhem da zaredim ot user space v iadroto, chrez insmod, i da razgledame s lsmod.
V gorniiat primer suzdadohme modul, koito defakto ne pravi nishto osven da se zaredi v kernel space. Pri zarezhdane na moduli v povecheto sluchai e neobhodimo da izvurshite operatsiia, naprimer initsializatsiia na ustroistvo, danni i t.n. Za tselta sa predostaveni dve funktsii: module_init() i module_exit(). Neka razshirim nashiiat primer:
Izpolzvame callback funktsiite predostaveni ot iadroto, za da izpulnim operatsiia pri zarezhdane i premahvane na nashiiat modul. V sluchaia polzvam kernel funktsiiata printk, koiato zapazva sistemni suobshteniia v sistemniiat log. Za da gi vidim mozhem da polzvame dmesg. Po analogichen nachin kakto purviiat put zarezhdam modula i tursia za suobshteniiata v log-a:
.::Device failove Kakto spomenah veche aplikatsiite ot user space komunikirat s modulite v iadroto chrez fail-ove namirashti se v /dev chastta. Za vsiako ustroistvo predostaveno v /dev otgovaria suotveten modul v iadroto. Za da se /naznachi/ daden modul kum daden fail se izpolzvat unikalni chisla (zhelatelno e te da sa unikalni, za da ne se oburkvat modulite, no e vuzmozhno da se dublirat, koeto bi dovelo do nai-razlichni /nepriiatni/ posledstviia). Tezi chisla sa narecheni major numbers, chrez tiah iadroto znae koi modul za koi fail otgovaria.Vsiako ustroistvo ima i minor number, koeto ne igrae rolia pri iadroto, to e neobhodimo na samiiat modul da razlichava svoite ustrostva. Vazhno e da znaem, che tezi ustroistva mogat da sa dva vida: character i block.Glavnata razlikata kakto mozhebi se doseshtate e, che block ustroistvata predavat dannite na otdelni fiksirani v zavisimost ot tipa na ustroistvoto blokove, dokato character ustroistvata niamat fiksiran razmer na predavanite danni. Eto edin primer:
Vizhdate tipa na ustroistvoto [color=blue]b[/color]rw-rw----. Kakto i negovite major i minor nomera brw-rw---- 1 root disk [color=red]3[/color], [color=blue]8[/color] Feb 18 13:18 /dev/hda8 Mozhete da zabelezhite ot gorniiat primer, che za tezi ustroistva otgovaria edin modul, tui kato imat edin i sushti major nomer. Suotvetno minor nomerata sa razlichni, za da mozhe modulut da razlichava ustroistvata. Za da znaem koga protses se opitva da chete ili pishe v dadeno ustroistvo e neobhodimo da polzvame struktura narechena file_operations, definirana v fs.h.
ili C99 standarta:
Nedefiniranite chlenove na strukturata shte se definirat avtomatichno ot gcc kato NULL. V primera, shte izpolzvam komentari direktno, za da e po-razbiraemo:
Sled kato zaredim modula shte triabva da suzdadem fail za ustroistvoto v /dev s mknod kato mu zadadem Major number spored tova, kakuv Major number ni e opredelen ot iadroto
Veche znaem kak da suzdadem modul i da go asotsirame s user space ustroistvo. Ostana edinstveno momenta, v koito realno shte komunikirame s harduer... .:: Operatsii s harduer Linuks predostavia niakolko funktsii za operatsii s harduera. Predi da se zaredi draivur, podoben na gorniiat toi triabva da /rezervira/ daden IO port za polzvane.Tova se osushtestviava chrez funktsiiata request_region iziskvashta nomer na port, obhvat ako sa poveche ot 1 vhodno-izhoden port i ime na draivura. Predi neia obache, za da se uveri, che niakoi drug modul ne polzva porta draivura triabva da izvika check_region, iziskvashta dva parametura: nomer na port i dulzhina (1 za konkreten port). Sled priklyuchvane na rabota s vunshnoto u-vo Draiuvura triabva da osvobodi port-a za da e vuzmozhno drugi draivuri da rabotiat s nego, za tselta se polzva release_region iziskvashta otnovo sushtite parametri. Za komunikatsiia s ustroistvata se polzvat funktsii ot bibliotekata io.h (asm/io.h). Dvete po-sushtestveni funktsii za pisane i chetene ot port sa: outb i inb .:: Harduerni prekusvaniia Za da raboti s harduerni prekusvaniia (IRQ - Interrupt Request), draivurut polzva request_irq i free_irq. Sushto mozhem da polzvame dve funktsii za vremenno prekratiavane na prekusvaniiata i suotvetno vuzstanoviavaneto im: cli i sti. .:: DMA DMA (Direct Memory Access) kanalite polzvat direktno RAM pametta, bez da nalagat prekusvane na protsesornata rabota. Za rabota s DMA se izpolzva bibliotekata asm/dma.h. Ustroistvata polzvashti DMA sa obiknoveno prikrepeni kum dunnata platka. .:: KonkluzIoneto Nai-dobriiat nachin da razberete neshto e da razgledate gotov primer i da testvate. p.s.: Tazi statiia e provokirana ot osnovnoto solo v Sweet child o' mine na Guns 'n' Roses Referentsii: http://www.faqs.org/docs/kernel/ http://kernel.org/ Blagodarsko na @Angel ot http://forums.bgdev.org/ za suvetite otnosno kernel/user space grafikata. Dimitur T. Dimitrov PxL 2007 http://insecurebg.org/ pxl at insecurebg --EOF Suzhaliavam ako imam netochnosti,pomagaite da gi opravim. << | Programirane grafichen interfeis (GUI) s Lazarus i freepascal >> |
Avtorite na saita, kakto i tehnite sutrudnitsi zapazvat avtorskite prava vurhu sobstvenite si materiali publikuvani tuk,
no te sa copyleft t.e. mogat svobodno da budat kopirani i razprostraniavani s iziskvaneto izrichno da se upomenava imeto na avtora,
kakto i da se publikuva na vidno miasto, che te sa vzeti ot originalniia im URL-adres na tozi survur (http://www.linux-bg.org). Avtorskite prava na prevodnite materiali prinadlezhat na tehnite avtori. Ako s publikuvaneto tuk na niakakuv material nevolno sa narusheni nechii prava - sled konstatiraneto na tozi fakt materialut shte bude svalen.
All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
|