Tvorba modulov I. - Úvod

Tvorba modulov I. - Úvod
17.08.2007 12:00 | Články | Erik Mocný
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:

  1. 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.
  2. 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.

    • nie je to nahodu copy-paste? 17.08.2007 | 16:49
      ka1n   Návštevník
      nie je to nahodou copy paste?
      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.
      • Re: nie je to nahodu copy-paste? 17.08.2007 | 18:19
        Avatar Erik Mocný arch  Používateľ
        Ano je to ten isty clanok, je to totiz moj clanok a mozem ho uverejnit kde sa mi len zachce .) A este co je na tom cudne? Keby sa objavil aj na 10 serveroch v priebehu tyzdna... hmm?
        • Re: nie je to nahodu copy-paste? 17.08.2007 | 18:36
          Avatar Erik Mocný arch  Používateľ
          A ano, znamena to, ze bol najprv napisany v slovencine, no z dovodu nedorozumenia medzi mnou a Ondrejom Huckom, som si myslel, ze tuto temu ma uz niekto rozpracovanu a preto som sa rozhodol, ze ho dam niekomu prelozit do cestiny a uverejnim ho - na uz spominanom - SP. Z toho vyplyva, ze serial, bude pisany aj pre ceskych citatelov (na SP) a takisto tu pre slovenskeho citatela. Kedze autorom som ja, za pripadne nedorozumenie sa ospravedlnujem.
          • Re: nie je to nahodu copy-paste? 17.08.2007 | 19:47
            Avatar Erik Mocný arch  Používateľ
            Takze, aby uz nedoslo k pripadnym nedorozumeniam, ako som sa dozvedel od Ondreja Hucka, serial bude od teraz uverejnovany na linuxos a nikde inde.
          • Re: nie je to nahodu copy-paste? 17.08.2007 | 20:37
            ka1n   Návštevník
            tak potom ok. ja len ze mi prislo trochu zvlastne ze sa objavi nieco podobne na dvoch roznych serveroch.

            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.

            • Re: nie je to nahodu copy-paste? 17.08.2007 | 20:57
              Avatar Erik Mocný arch  Používateľ
              Ved prave pre ten honorar to bude uz len tu. To nedorozumenie totiz spocivalo v tom, ze som si myslel, ze na linuxos moj clanok nebude uverejneny, inak by sa objavil bude len na SP alebo len tu.
    • re: 17.08.2007 | 23:13
      Avatar borg Arch, Debian jessie  Administrátor
      autor si pravdepodobne myli mikrokrenel s monolitickym kernelom a pravdepodobne nepozna ramdisk. ale som zvedavy na dalsie casti ;)
      • Re: re: 18.08.2007 | 02:58
        Avatar Erik Mocný arch  Používateľ
        borgcube: Mas pravdu, je to dost matuce, vsimol som si to tiez len teraz. Dalo by sa to opravit na podobu, ze pri monolitickom jadre bezia vsetky sluzby v jednom adresnom priestore (kernel space) a namiesto 'modular kernel' by som napisal 'modular monolithic kernel', kde nie je vsetko narvane v kernel space a tym padom ma jadro mensiu velkost, ptze sucasti bezia ako moduly, no a nenacitane moduly musia byt ulozene v ram. Vdaka za postreh.
        • Re: re: 18.08.2007 | 17:28
          Avatar uid0 Debian  Používateľ
          modular monolithic kernel', kde nie je vsetko narvane v kernel space a tym padom ma jadro mensiu velkost, ptze sucasti bezia ako moduly, no a nenacitane moduly musia byt ulozene v ram. Vdaka za postreh.

          ale ono to vsetko je v kernel space, moduly sa zavadzaju priamo do jadra. a nenacitane moduly mozu byt ulozene kdekolvek (aj nikde)
          Debian. apt-get into it…
      • Re: re: 18.08.2007 | 03:08
        Avatar Erik Mocný arch  Používateľ
        A samozrejme pri mikrokerneli bezia moduly ako samostatny proces, teda aj v oddelenom adresnom priestore, takze sa ospravedlnujem za popletenie pojmov, ptze na stabilite to v tomto pripade vela neprida (vid. priklad v clanku) :), cize ich jedinou vyhodou je odpojenie za behu systemu, kedze bezia v rovnakom adresnou priestore. Takze ano poznam rozdiel medzi mikrokernelom a monolit. jadrom akurat clanok bol pisany znacne dost rychlo, pravdupovediac za noc a preto tieto chyby. Este raz sa ospravedlnujem a cim skor to bude opravene .)
        • Re: re: 18.08.2007 | 17:33
          Avatar uid0 Debian  Používateľ
          sorry, ale akosi mi unika co si chcel tymto zdelit. tak popletene vyjadrovanie som uz dlho nevidel:
          ptze na stabilite to v tomto pripade vela neprida (vid. priklad v clanku) :), cize ich jedinou vyhodou je odpojenie za behu systemu, kedze bezia v rovnakom adresnou priestore.

          ad ptze: no fuj
          Debian. apt-get into it…
    • Malá nekonzistentnosť 19.08.2007 | 01:56
      Avatar juraj GNU/Linux / FSF priority  Používateľ
      Len poznámočka: č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?
      • Re: Malá nekonzistentnosť 19.08.2007 | 02:56
        Avatar Erik Mocný arch  Používateľ
        S "konzistentnostou" som to myslel trosku dopredu. Este tusim, ze v ten den ked som to pisal, som si kompiloval 2.6.22-1, ale dolezita je hlavne majoritna verzia, nie minoritna ;)
        • Re: Malá nekonzistentnosť 19.08.2007 | 04:33
          Avatar uid0 Debian  Používateľ
          je to major a minor, nie majoritna (vacsinova) a minoritna (mensinova).

          a vsetkym nam je zrejme, ze ide o verziu 2 (major) a nie 1 alebo 0 :)
          Debian. apt-get into it…
        • Re: Malá nekonzistentnosť 19.08.2007 | 13:24
          Avatar borg Arch, Debian jessie  Administrátor
          2.6.xy

          2 - major
          6 - minor
          xy - patchlevel

          takze asi tak ;)
    • ešte tak vedieť programovať 20.08.2007 | 13:49
      Avatar karol Mandriva 2008.1  Používateľ
      Za mojich čias nás v škole učili na informatike pracovať s MS Word, MS Exel proste Office 97 a vrcholom všetkého bola stromová štruktúra adresára začínajúca diskom C. Postupom času a zdokonalovaním výpočtovej techniky som sa už nedostal k programovaniu, nakoľko boli veci a odbory, ktoré ma viac zaujímali, ale aj tak by bolo niekedy vhodné vedieť aspoň trochu programovať.

      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.
      "Operátor pozorovania prítomnosti nekomutuje s operátorom reality.Nemôžeme teda popísať realitu okolo nás bez toho aby sme ju ovplyvnili." <br/>
    • modul pre mobil 20.08.2007 | 16:36
      redo   Návštevník
      Zdravim. Asi ani jeden komentar tu nebol k veci cize k MODULOM !!! A o Moduloch je tento clanok. Mna zaujimaju moduly a nie kde ten clanok bol este uverejneny alebo o spravnosti cisla jadra. Potreboval by som najst nakompilovat naprogramovat modul pre mobil SE k800i mam Mandrivu-2007.1 !!! Dakujem za Help
      • Re: modul pre mobil 20.08.2007 | 18:22
        Avatar uid0 Debian  Používateľ
        haha !!! dakujem, ze necakas, ze ta niekto bude obskakovat pod clankom o "programovani" modulov !!!
        Debian. apt-get into it…
      • Re: modul pre mobil 20.08.2007 | 18:53
        Avatar borg Arch, Debian jessie  Administrátor
        pockaj si, naprogramujes si sam ;)
        • Re: modul pre mobil 20.08.2007 | 18:58
          redo   Návštevník
          fain len dufam ze nebudem cakat tak mesiac dva :-))
          Nevies o neakom softe co umozni pouzit kameru z mobilu ako web kameru niekde som o tom cital (pocul) dikes
          • Re: modul pre mobil 20.08.2007 | 19:00
            Avatar borg Arch, Debian jessie  Administrátor
            ak nechces cakat, doporucujem linux device driver, 3rd edition. ak chces zachytavat obraz, video4linux2 je to co by si si mal nastudovat tiez. alebo pouzit google, ci uz dakto ten mobil na linuxe rozbehal.
            • Re: modul pre mobil 20.08.2007 | 19:07
              redo   Návštevník
              Ok dikes za radu. Ak to nepomoze budem si musiet pockat no co uz !!!
    • Celkom zaujimave ;-) 24.08.2007 | 18:20
      BH   Návštevník
    • ďalší diel 25.08.2007 | 13:30
      Avatar Izidor Matušov Archlinux  Používateľ
      Už sa teším na ďalší diel, nech konečne vidím aj ako sa programujú jaderné moduly.. A potom sa začnem hrať aj s kernelom, nielen so softami pre užívateľov ;)
      • Re: ďalší diel 25.08.2007 | 14:53
        styxx77   Návštevník
        je to dobry clanok,takych aj podrobnejsich treba viac,nech viac ludi pochopi linux
    • Serial mi prisiel celkom vhod 26.08.2007 | 19:56
      akomano   Návštevník
      Po asi mesiaci googlenia a prehladavania gentoo for a mailing listov kvoli problemu s rozbehanim ovladaca pre Flarion datovu kartu na jadre 2.6.20 a 2.6.21 ma kernel a veci okolo neho zacali dost zaujimat.
      Takze uz netrpezlivo cakam na pokracovanie :-)
    • A co je to ten unikatny identifikator? 27.08.2007 | 19:13
      Avatar Ladislav Michnovic SuSE  Používateľ
      Mohol by si trochu detailnejsie napisat, co je to ten unikatny identifikator char-major-81- ?
      Only man who sells empty boxes is the undertaker.
      • Re: A co je to ten unikatny identifikator? 27.08.2007 | 23:50
        Avatar Erik Mocný arch  Používateľ
        unikátny = jedinečný
        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".
        • Re: A co je to ten unikatny identifikator? 28.08.2007 | 13:51
          Avatar Ladislav Michnovic SuSE  Používateľ
          Zatial si iba opisal to, co sa da zistit pohladom do suboru modprobe.conf a tvojho clanku.
          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.
          Only man who sells empty boxes is the undertaker.
          • Re: A co je to ten unikatny identifikator? 28.08.2007 | 17:21
            Avatar uid0 Debian  Používateľ
            stiahni linux a pozri Documentation/devices.txt
            Debian. apt-get into it…