Myslím, že väčšina tých zdatnejších používateľov GNU/Linuxu si už kompilovalo kernel, s ktorým sa samozrejme kompilujú aj nejaké tie moduly. Čo sú to moduly? Ako sa vytvárajú, teda programujú a vlastne takmer všetko okolo nich sa dozviete práve v tomto seriáli, ktorého úvodný diel práve čítate.
Update: 20.08.07
Čo je dobré vedieť?
Predpokladám aspoň minimálne znalosti jazyka C, prípadne C++, základné informácie o tom, čo je kernel a ako sa kompiluje. Taktiež použitie kernelu rady 2.6.x, u mňa konkrétne kernel-2.6.22, pretože práve preň píšem tento seriál, a preto ma nemusíte obťažovať pripomienkami, ak vám niečo nebude fungovať tak, ako by malo a používate pritom rad 2.4. Na začiatok by to stačilo a ďalej sa vám v skratke pokúsim opísať to, čo ten modul vlastne je a povieme si tiež, aké druhy kernelu môžeme používať.
Čo je to modul?
Modul, resp. moduly sú časti kódu napísané v programovacom jazyku - väčšinou je to C, v ktorom je napísaný aj samotný kernel, no niektoré veci sú v ňom samozrejme v assembleri - ktoré môžu byť podľa potreby načítané, prípadne odstránené z kernelu za jeho behu. Jednoducho sa dá povedať, že moduly rozširujú funkcionalitu kernelu. Za ich výhodu možno považovať to, že nemusíte mať všetko zakompilované do kernelu, tým pádom má jeho obraz (image) menšiu veľkosť, čím zaberá menej miesta v pamäti. Samozrejme, že nie všetko môže byť skompilované ako modul. Ako príklad uvediem podporu pre IDE radiče diskov. To znamená, že ak by ste podporu pre ne v kerneli skompilovali ako modul, systém vám nenabehne a uvidíte len známy "kernel panic", pretože moduly sa načítavajú až potom, ako prebehne init a takisto po tom, ako sa pripojí hlavný koreňový adresár, tzn., že podporu pre použitý fs (file system) na ňom, musíte mať zakompilovanú priamo do kernelu. Niektoré veci, ako napr. ALSA sa doporučujú kompilovať ako modul. Existujú nasledujúce typy kernelov - monolitický kernel, mikrokernel, hybridný kernel, nanokernel a exokernel, z ktorých si stručne priblížime prvé dva:
- monolitický kernel (monolithic kernel) - Všetky služby (vrátane modulov) bežia v jednom adresnom priestore (kernel space). Dnešné monolitické jadrá ako je Linux kernel, FreeBSD alebo Solaris vedia dynamicky načítať/odstániť modul za behu.
- mikrokernel (microkernel) - V tomto prípade bežia moduly ako samostaný proces, čiže v oddelenom adresnom priestore.
V ďalších častiach budeme hovoriť práve o monolitickom jadre (Linux kernel). Kedykoľvek môžete modul, ak ho nepotrebujete používať, odstrániť príkazom:
rmmod "názov_modulu"
alebo pomocou modprobe:
modprobe -r "názov_modulu"
Je to určite výhodnejšie, než znovu kompilovať celý kernel. Hlavnou výhodou použitia modulov je ich flexibilita pri používaní, tzn., že daný modul jednoducho môžete načítať a takisto aj odstrániť z pamäte bez nutnosti reštartovania počítača. Na úvod toho, čo sú moduly, by to stačilo. Ďalej si povieme to, ako pracovať s už skompilovanými modulmi a ako si vlastne vedia naše moduly nájsť cestu ku kernelu.
Moduly a kernel
Aké moduly máte práve načítané, sa dozviete príkazom
lsmod
ktorý spracováva výpis zo súboru /proc/modules. Pýtate sa, ako si tieto moduly vedia nájsť cestu ku kernelu, resp. ako vedia odkiaľ sa majú načítať?
Keď kernel potrebuje funkcionalitu, ktorá nie je priamo v ňom, modul/súčasť kernelu nazyvaný/á kmod - ktorý sa v starších verziách kernelu nazýval kerneld - spustí/inicializuje program modprobe a ten daný modul nájde a načíta. Načíta ho, buď podľa jeho názvu, teda napr.:
nvidia - modulárny driver pre moju graf. kartu
bttv - ovládač pre moju TV kartu
alebo si ho vyhľadá podľa unikátneho identifikátora, čo v našom prípade pre modul nvidia bude char-major-195 a pre bttv je to char-major-81. Ak modprobe volá modul podľa unikátneho identifikátora, jeho názov zisťuje spravidla zo súboru /etc/modprobe.conf, čo však u vás nemusí platiť, pretože každá distribúcia ho môže mať na inom mieste. To, kde sa nachádza práve u vás, si už musíte zistiť vy sami. Ak tento súbor nájde, vyhľadá v ňom riadok začínajúci aliasom, teda akýmsi ukazovateľom na daný identifikátor, ktorý označuje modul. U mňa bude tento riadok pre modul 'bttv' vyzerať nasledovne:
alias char-major-81-* bttv
a podľa neho modprobe vie, že práve ten identifikátor (char-major-81-*) ukazuje na môj modul bttv.ko a žiadny iný. Ešte som zabudol spomenúť, že moduly, ktoré máme už skompilované, sa nachádzajú štandardne v adresári /lib/modules/'verzia-kernelu'/ a majú príponu .ko (čo však zatiaľ nie je také podstatné) a v tomto adresári sú umiestnené ďalšie súbory a podadresáre a práve v nich sa nachádzajú naše moduly. Tieto podadresáre sú vytvárané pri kompilovaní kernelu a sú to napr. kernel, fs:
kernel - tu sa nachádzajú moduly, ktoré priamo súvisia s kernelom a vašim HW, teda napr. ovládače graf. karty, zvuk. karty, zákl. dosky a pod.
fs - moduly, ktoré súvisia - ako už samotný názov napovedá - s nejakým file systemom. Ja tu mám napr. modul 'fuse', ktorý slúži na to, aby som mohol používať ntfs-3g driver a mať pripojené ntfs oddiely v rw (read-write) móde.
Niektoré moduly na sebe závisia. Príklad: používate balík lm_sensors, teda program
sensors
k zisteniu teploty, otáčok procesora a pod. Aby ste ho mohli využívať, potrebujete mať v kerneli zakompilovanú podporu pre čip, ktorý máte na vašej základnej doske. U mňa je to i2c_viapro. Tento modul je však závislý na inom, resp. obsluhuje ho ďalší modul, pretože používa symboly (premenné alebo funkcie), ktoré sú definované v tomto prípade v module, ktorý sa nazýva i2c_core. O to, aké moduly sú na sebe navzájom závislé, sa stará opäť modprobe, ktorý si prezrie súbor nachádzajúci sa v už spomínanom adresari /lib/modules/'verzia-jadra'/modules.dep, čo v mojom prípade bude /lib/modules/2.6.22-gentoo-r2/modules.dep a práve z neho zistí, či musia byť načítané nejaké moduly predtým (i2c_core), než bude načítaný modul, ktorý požadujeme (i2c_viapro). Tento súbor sa vytvára príkazom:
depmod -a
a obsahuje závislosti medzi vašimi skompilovanými modulmi. Aby načítanie modulov prebehlo v správnom poradí, čiže aby sa najprv načítal modul 'i2c_core', modprobe si na to zavolá ďalší program a to insmod, ktorý nám toto zaistí. Keby ste si chceli načítať modul 'i2c_viapro', musíte spustiť nasledujúce príkazy:
insmod /lib/modules/'verzia-kernelu'/kernel/drivers/i2c/i2c-core.ko
insmod /lib/modules/'verzia-kernelu'/kernel/drivers/i2c/busses/i2c-viapro.ko
Toto riešenie sa mi však zdá "trošku" zdĺhavé a pravdupovediac aj zbytočné, pretože stačí, ak jednoducho zadáte tento príkaz:
modprobe i2c-viapro
a 'modprobe' si sám zistí závislosti pre daný modul zo súboru /lib/modules/'verzia-kernelu'/modules.dep, zavolá program insmod a vie teda v akom poradí majú byť dané moduly načítané.
Rozdiel medzi insmod a modprobe je teda jasný. Zatiaľ, čo by ste chceli použiť pre načítanie modulov insmod, musíte si zistiť správne poradie modulov a takisto úplnú cestu k nim, kdežto 'modprobe' si 'insmod' zavolá sám a všetku tú zdĺhavú prácu vykoná za nás.
Výpis všetkých vami skompilovaných modulov (načítaných aj nenačítaných) získate príkazom:
modprobe -l
kde sa dozviete taktiež umiestnenia a prípony modulov.
K záveru len toľko, že linuxové distribúcie obsahujú nástroje modprobe, insmod a depmod v balíku module-init-tools. Predtým sa tento balík nazýval modutils.
Záver
Viem, že ste možno čakali viac a možno to bolo pre vás trochu nudné a mysleli ste si, že sa tu dozviete, ako sa taký modul vytvára, no cieľom tohto úvodného článku bolo oboznámiť vás s používaním modulov, dať vám základné informácie o nich a hlavne vysvetliť, ako a na čo nám moduly slúžia. Dúfam, že sa mi to aspoň z malej časti podarilo a už teraz vám môžem povedať, že ak sa vám čo len trochu páčil tento článok, nabudúce sa máte na čo tešiť. V ďalšom pokračovaní nášho seriálu si napíšeme a rozoberieme náš prvý jednoduchý modul s už "zažitým" názvom Hello World. Určite tam bude aj niečo viac, no o tom bude až druhý diel.
Názory, postrehy, pripomienky a otázky postujte do komentárov, príp. sa ozvite na moj mail.
Poďakovanie: warriant - za korekciu preklepov.
Nieco velmi ale velmi podobne som cital na security-portale.
vid.:
http://security-portal.cz/clanky/tvorba-modulu-i---uvod.html
Napr. uvod v slovencine:
Predpokladám aspoň minimálne znalosti jazyka C, prípadne C++, základné informácie o tom, čo je kernel a ako sa kompiluje.
Uvod v cz:
Předpokládám alespoň minimální znalosti jazyka C, případně C++, základní informace o tom, co je kernel a jak se kompiluje.
Vsimol som si este koniec v ceskom clanku:
Poděkování: warriantovi - za korekci překlepů a za kompletní překlad do čestiny ;)
V slovenskej mutacii je:
Poďakovanie: warriant - za korekciu preklepov.
To znamena ze toto je original a objavil sa v cestine skor alebo je toto copy paste z cz originalu?
A btw: nepride mi prilis normalne ked sa totozny clanok objavi na dvoch serveroch aj keby slo o original.
a prislo mi tiez zvlastne ze by sa mal objavit naraz na viacerych serveroch z toho titulu ze napr. za clanky sa na niektorych serveroch dostava nejaky (smiesny) honorar.
ale ono to vsetko je v kernel space, moduly sa zavadzaju priamo do jadra. a nenacitane moduly mozu byt ulozene kdekolvek (aj nikde)
ad ptze: no fuj
čo v mojom prípade bude /lib/modules/2.6.21-gentoo-r2/modules.dep a práve
a tu
Predpokladám aspoň minimálne znalosti jazyka C, prípadne C++, základné informácie o tom, čo je kernel a ako sa kompiluje. Taktiež použitie kernelu rady 2.6.x,
u mňa konkrétne kernel-2.6.22,
pretože práve preň píšem tento seriál,
Tekže pre akú verziu kernela je tento seriál?
a vsetkym nam je zrejme, ze ide o verziu 2 (major) a nie 1 alebo 0 :)
2 - major
6 - minor
xy - patchlevel
takze asi tak ;)
Máte šťastie, tí, čo sa teraz na informatike učíte niečo o počítačoch ako takých, ako napísať nejaký program v editore., Tá moja informatika mi pripomínala skôr návod k automatickej práčke, než návod na ovládani počítača ako takého.
Nevies o neakom softe co umozni pouzit kameru z mobilu ako web kameru niekde som o tom cital (pocul) dikes
Takze uz netrpezlivo cakam na pokracovanie :-)
identifikátor = jednoducho 'identifikátor'
Konkrétnejšie. Unikátny identifikátor - ktorý v našom prípade pre náš char-major-81(character special device pro video4linux) ovládač pre moju tv kartu od Matroxu -, určuje resp. "definuje" odkaz na zariadnie, čiže na súbor "/dev/video0", ktorý je vlastne len symlinkom na súbor, ktorý sa nachádza v podadresáry(v4l) adresára "/dev" a to konkrétne na súbor "/dev/v4l/video0".
Ale mna by zaujimalo odkial sa to cislo berie, mozem si to pomenovat ako chcem ja? V /dev ziaden alias z mojho modprobe.conf suboru nemam.