\section{Moduly}

Nejprve k~historii modulů jádra linuxu. První Linux měl všechny potřebné
ovladače přímo ve svém kódu. Jaké ovladače budeme chtít použít bylo třeba
specifikovat během kompilace jádra. Jestliže  si  dokoupíme, či 
půjčíme nějaký
hardware, například zipdrive, 
pro nejž jsme neměli v~jádře přikompilovaný ovladač, bylo třeba překládat
celé jádro, což není pro mnoho uživatelů Linuxu vůbec jednoduchá
záležitost. Na druhé straně, chtěli-li bychom jádro se všemi
ovladači, asi by nám v~operační paměti moc volného prostoru nezůstalo,
zvláště máme-li jí pouze 4MB a mnohé ovladače by si za celou dobu našeho 
linuxování mnoho nezapracovali.

Proto se hned od počátku vývoje Linuxu 
začalo přemýšlet o~možném řešení takového omezení a 
velice brzy se začala realizovat myšlenka modularizace jádra.
Moduly jádra se do jádra instalovali ručně pomocí programu
\verb|insmod(1)|. Modulů tehdy ještě nebylo mnoho. 

V~současné době je práce s~moduly
zautomatizovaná, modul se naistaluje na žádost jádra. Popišme si stručně
jak se tomu děje.
Jestliže jádro dostane požadavek na
akci, pro níž nemá podporu, zašle zprávu daemonu \verb|kerneld(1)| se
symbolickým popisem daného problému a \verb|kerneld| zařídí
instalaci daného ovladače, či ovladačů;  spustí program
\verb|modprobe(1)|, ten se podívá do patřičných konfiguračních souborů
a nalezne-li modul odpovídající popisu
spustí \verb|insmod(1)|, který ovladač naistaluje s~parametry určenými
konfigurací, \verb|modprobe| se ukončí a předá zprávu daemonu
\verb|kerneld|, že splnil (případně nesplnil) úkol. Jádro systému
pak užívá právě naistalovaného modulu naprosto stejně jako, kdyby bylo
obsaženo v~jádře při jeho kompilaci.

Aby i náš systém pracoval podobným způsobem je třeba mít 
jádro s~podporou modulů a spolupráce s~\verb|kerneld|, dále je samozřejmě
třeba mít dobře naistalované potřebné moduly odpovídající verze.
Poté je třeba udělat několik drobných úprav v~našich bootovacích 
\verb|rc.*| scriptech. 

Většina nových distribucí Linuxu
\footnote{Debian 1.1, Slackware96, RedHat Rembrandt} již vše potřebné
obsahuje a moduly plně využívá. Následující řádky jsou určeny pro ty z~vás,
 kteří samy 
upgradovali na jádro řady 2.0.x a chtějí automatické instalování
modulů využívat.
 

%Linus Torvalds přesně definoval
%rozhraní mezi kernelem a moduly, proto není problém, aby byli tvořeny
%moduly rovněž na komerční bázi.



\subsection{Jak kompilovat jádro s~podporou pro moduly}

Abychom mohli používat dymicky instalovaných modulů, je třeba
jádro kompilovat s~podporou pro moduly a \verb|kerneld|.

V~nové řadě jádra linuxu se velice zjednodušila práce s~kompilací jádra.
Jsou k~dispozici kromě standardního \verb|make config| ještě
\verb|make menuconfig| či dokonce \verb|make xconfig|.
\verb|Menuconfig| nám po kompilaci, pro tento účel upraveného,
\verb|dialog|u nabídne celoobrazovkové barevné menu tak, jak jsme zvyklí 
u~\verb|setup|u distribuce Slackwaru. Nastavit vše potřebné je teď velice 
pohodlné a přehledné, přičemž není potřeba procházet celou nabídku krok po
kroku,
ale stačí nastavit jen to co chceme. Máme možnost si nastavení uložit do
souboru.
\verb|Xconfig| je configurační menu založené na Tcl/Tk pro X Window Systém.

Při konfiguraci jádra umožníme \verb|loadable module support|    
a \verb|kernel daemon support|, tím si chystáme jádro schopné pracovat 
s~moduly. Pak v~ostatní nabídce  zvolíme do hlavního jádra jen to co 
opravdu potřebujeme pro nabootování počítače. Vše ostatní co používáme 
méně často označíme jako modul (\verb|m|).

Co lze používat jako modul?  Podpora většiny filesystémů
(minix, xiafs, msdos, umdos, sysv, isofs, hpfs, smbfs, nfs), věšina ovladačů
SCSI na všech úrovních, většina síťových karet, ovladace CD-ROM
a mnohé další ( popora tiskárnu na paralelním portu, 
podpora ELF, a.out,
javy, podpora seriového rozhranní\dots .

Co a jak necháte v~jádře napevno záleží jen na vaší libovůli.
Není dobrým řešením mít vše napevno v~jádře, jelikož přicházíme
o~paměť, avšak rovněž není řešením mít vše jako automaticky napojovaný
modul, jelikož
pak  stále zaměstnáváme \verb|kerneld| a paměť ani čas neušetříme.
 Jistá vyváženost při výběru modulů bude jistě 
namístě.

Máme-li kernel nakonfigurovaný spustíme tradiční:\\
\verb| make dep ; make clean; make zImage| \\
a navíc připojíme\\
\verb| make modules| \\
které kompiluje potřebné moduly do formy objektových souborů
(\verb|*.o|) a symbolické linky na tyto soubory ukládá do
\verb|/usr/src/linux/modules|. Dopadne-li kompilace modulů dobře
spustíme\\
\verb|make modules_install|\\
které naistaluje objektové soubory modulů do adresáře
\verb|/lib/modules/2.0.x|, kde \verb|x| je číslo kompilované verze
jádra linuxu. Moduly jsou uspořádány do několika adresářů.


\subsection{Příklad, modul {\tt lp.o}} 

Dejme tomu, že chceme naistalovat  jen jeden
modul, například modul \verb|lp| pro podporu komunikace s~tiskárnou 
na paralelním 
portu. 

Není třeba připonínat, že vše co následuje
provádíme jako systémový administrátor \verb|root| v~adresáři 
\verb|/usr/src/linux|.
Pro větší názornost namísto \verb|make config|  spustíme \verb|make menuconfig|. Po kompilaci programu \verb|scripts/lxdialog/lxdialog| ---
specielně pro konfiguraci kompilace kernelu pravený program \verb|dialog|
--- se objeví následující nabídka: 
{\scriptsize
\begin{verbatim}
  +------------------------------- Main Menu -------------------------------+
  |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |
  |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |
  |  <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.     |
  |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable     |
  | +---------------------------------------------------------------------+ |
  | |      Code maturity level options  --->                              | |
  | |      Loadable module support  --->                                  | |
  | |      General setup  --->                                            | |
  | |      Floppy, IDE, and other block devices  --->                     | |
  | |      Networking options  --->                                       | |
  | |      SCSI support  --->                                             | |
  | |      Network device support  --->                                   | |
  | |      ISDN subsystem  --->                                           | |
  | |      CD-ROM drivers (not for {\sc SI or IDE/ATAPI drives)  --->     | |
  | |      Filesystems  --->                                              | |
  | |      Character devices  --->                                        | |
  | +------v(+)-----------------------------------------------------------+ |
  +-------------------------------------------------------------------------+
\end{verbatim}
}
Abychom mohli používat dynamické moduly vybereme položku
\verb|Loadable module support|, 
ve které pomocí mezerníku označíme \verb|Enable loadable module support|
a \verb|Kernel daemon support|:
{\scriptsize
\begin{verbatim}
 Linux Kernel Configuration
 ------------------------------------------------------------------------------
  +------------------------ Loadable module support ------------------------+
  |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |
  |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |
  |  <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.     |
  |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable     |
  | +---------------------------------------------------------------------+ |
  | |      [*] Enable loadable module support                             | |
  | |      [ ] Set version information on all symbols for modules         | |
  | |      [*] Kernel daemon support (e.g. autoload of modules)           | |
  | |                                                                     | |
  | +------------v(+)-----------------------------------------------------+ |
  +-------------------------------------------------------------------------+
  |                    <Select>    < Exit >    < Help >                     |
  +-------------------------------------------------------------------------+
\end{verbatim}
}
Dvakrát stisknuté \verb|escape| nás navrátí do hlavní nabídky, ze které 
přejdeme do \verb|Character devices| a v~této nabídce pak
označíme \verb|Parallel printer support| jako modul 
vybráním položky a stisknutím \verb|M|:
{\scriptsize
\begin{verbatim}
 Linux Kernel Configuration
 ------------------------------------------------------------------------------
  +--------------------------- Character devices ---------------------------+
  |  Arrow keys navigate the menu.  <Enter> selects submenus --->.          |
  |  Highlighted letters are hotkeys.  Pressing <Y> includes, <N> excludes, |
  |  <M> modularizes features.  Press <Esc><Esc> to exit, <?> for Help.     |
  |  Legend: [*] built-in  [ ] excluded  <M> module  < > module capable     |
  | +---------------------------------------------------------------------+ |
  | |            <*> Standard/generic serial support                      | |
  | |            [ ] Digiboard PC/Xx Support                              | |
  | |            < > Cyclades async mux support                           | |
  | |            [ ] Stallion multiport serial support                    | |
  | |            < > SDL RISCom/8 card support                            | |
  | |            <M> Parallel printer support                             | |
  | |            [ ] Mouse Support (not serial mice)                      | |
  | |            [ ] Support for user misc device modules                 | |
  | |            [ ] QIC-02 tape support                                  | |
  | |            < > Ftape (QIC-80/Travan) support                        | |
  | |            [ ] Advanced Power Management BIOS support               | |
  | +------------v(+)-----------------------------------------------------+ |
  +-------------------------------------------------------------------------+
  |                    <Select>    < Exit >    < Help >                     |
  +-------------------------------------------------------------------------+
\end{verbatim}
}
V~nabídce \verb|General setup| nezapomeneme vybrat optimalizaci
pro náš procesor.
Program ukončíme svěma stisknutími \verb|escape| v~hlavní nabídce
a potvrzením \verb|yes| na otázku zda chceme uložit právě nastavenou 
konfiguraci. 

Spustíme kompilaci kernelu: \verb|make dep; make clean; make zImage|
Po úspěšném přeložení kernelu spustíme kompilaci modulů:
\verb|make modules| a proběhne-li vše bez problémů spustíme
\verb|make modules_install|.

V~adresáři \verb|/lib/modules| se nám vytvoří adresář s~úplným označením
naší verze jádra, řekněme 
\verb|2.0.17|, a v~něm v~adresáři \verb|misc| by měl být naistalován
modul \verb|lp.o|.

Aby nám vše fungovalo jak má je třeba při bootu spustit 
daemon \verb|kerneld|. Ve Slackwaru po úpravě vypadá 
soubor  \verb|/etc/rc.d/rc.S| takto:
{\parindent=0pt
{\scriptsize
\begin{verbatim}
#!/bin/sh
#
# /etc/rc.d/rc.S:  System initialization script.
#
# Mostly written by:  Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
#

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# enable swapping
/sbin/swapon -a

# Start update.
/sbin/update &

#
# Nastartování daemonu kerneld, který automaticky načítá do kernelu
# potřebné moduly.
if [ -x /sbin/kerneld ]
then
	/sbin/kerneld
fi
#
\end{verbatim}
\dots  pokračuje nezměněný \verb|/etc/rc.d/rc.S| 
\begin{verbatim}
if [ -x /etc/rc.d/rc.modules ]
then
    /etc/rc.d/rc.modules
else
#  Konec souboru /etc/rc.d/rc.S
\end{verbatim}
}
\noindent
V~úvodu scriptu se spouští \verb|kerneld| a na konci skriptu
se spouští jiný script \verb|/etc/rc.d/rc.modules|,
který v~našem případě může vypadat takto:

{\scriptsize
\begin{verbatim}
#!/bin/sh
#
# Script /etc/rc.d/rc.modules startuje vše potřebné 
#  tak aby automatické natahování modulů fungovalo.
#
#
PATH=/sbin:/usr/sbin:/bin:/usr/bin

# Vytvoření potřebného linku na správný adresář z moduly k právě 
# spuštěnému kernelu
ln -snf /lib/modules/`uname -r` /lib/modules/current

# Vytvoření souboru závislostí
if [ \! -r /lib/modules/current/modules.dep ]
then
	echo "Creating module dependencies"
	/sbin/depmod -a
fi
# Konec scriptu rc.modules
\end{verbatim}
}
 
 
No a nyní překopírujeme na správné místo
\verb|/usr/src/linux/arch/i386/boot/zImage|, nakonfigurujeme
LILO, či \verb|loadlin.exe| tak, aby se při restartu systému použilo
toto námi vytvořené jádro.
 
Vše ještě jednou překontrolujeme a provedeme restart systému.
Mělo by se použít námi skompilované jádro, spustit
\verb|kerneld|, vytvořit link \verb|/lib/modules/current| a posléze
soubor závislostí \verb|/lib/modules/modules.dep|.

Proběhlo-li vše tak jak má tak by se nám nyní při každém
pokusu přístupu na tiskárnu, například pomocí
příkazu \verb|lpr|, mělo ve výpisu načtených modulů (\verb|lsmod(1)|)
objevit řádek:
\begin{verbatim}
Module:        #pages:  Used by:
lp                 2            1 (autoclean)
\end{verbatim}
}

Tento příklad je velmi zjednodušeným obrazem skutečnoti. Moduly se
dají použít i pro daleko složitější ovladače --- moduly lze spouštět
s~parametry
(síťové a zvukové karty) uloženými v~konfiguračním souboru 
\verb|/etc/conf.modules|; moduly lze přihrát napevno (\verb|insmod(1)|);
 moduly lze připojit
jen dočastě (\verb|modprobe(1)|); 
modul lze smazat (\verb|rmmod(1)|), atd. .
Více se dočtete v~dokumentaci ke kernelu v~souboru
\verb|modules.txt| a v~dokumentaci k~ovladačům, jichž lze 
použít jako modul.



