Module unter Linux zurück
Punkt 1 Fragen Experten Links Orginaltexte
Allgemeine Beschreibung
Was sind die Module unter Linux ?
Jedes Code-Stück, das zum Kernel hinzugefügt werden kann, wird ein Modul genannt. Der Linux-Kernel unterstützt eine Reihe verschiedener Modul-Typen (auch Klassen genannt), darunter auch Gerätetreiber. Jedes Modul besteht aus Objekt-Code, der nicht zu einem vollständigen ausführbaren Programm gelinkt ist und dynamisch mit dem Programm insmod zum laufenden Kernel hinzugelinkt sowie mit rmmod daraus wieder entfernt werden kann.
In Abbildung 1-1 können Sie die verschiedenen Klassen von Modulen sehen, die jeweils eine bestimmte Aufgabe haben. Die Zugehörigkeit eines Moduls zu einer bestimmten Klasse wird anhand seiner Funktionalität bestimmt. Die Module in Abbildung 1-1 umfassen die wichtigsten Klassen, sind aber lange nicht vollständig, weil immer mehr Funktionalität im Linux-Kernel modularisiert wird.
Schnittstelle der Systemaufrufe
Prozeßverwaltung
Der Kernel ist für das Erzeugen und Zerstören von Prozessen und das Verwalten ihrer Verbindung zur Außenwelt (Input und Output) zuständig. Die Kommunikation zwischen den verschiedenen Prozessen (mit Signalen, Pipes und Primitiven zur Interprozeß-Kommunikation) gehört zur grundlegenden Systemfunktionalität und wird ebenfalls vom Kernel übernommen. Außerdem gehört der Scheduler, der steuert, wie Prozesse sich die CPU teilen, zur Prozeßverwaltung. Allgemein gesprochen, besteht die Prozeßverwaltung des Kernels darin, die Abstraktion mehrerer Prozesse auf einer einzigen CPU (oder auch mehreren) zu implementieren.
Speicherverwaltung
Der Speicher des Computers ist eine wichtige Ressource, und die Verfahren, nach denen sie verteilt wird, sind für die Performance des Systems entscheidend. Der Kernel erzeugt den virtuellen Adreßraum für jeden einzelnen Prozeß aus den vorhandenen beschränkten Ressourcen. Die einzelnen Teile des Kernels interagieren mit dem Subsystem zur Speicherverwaltung über eine Reihe von Funktionsaufrufen, die von einfachen malloc/free-Paaren bis hin zu exotischeren Funktionalitäten reichen.
Dateisysteme
UNIX basiert ganz grundsätzlich auf dem Konzept der Dateisysteme; so ziemlich alles kann unter UNIX als Datei angesehen werden. Der Kernel legt ein strukturiertes Dateisystem über unstrukturierte Hardware, und die daraus resultierende Datei-Abstraktion wird überall im gesamten System verwendet. Linux unterstützt darüber hinaus verschiedene Typen von Dateisystemen, also verschiedene Möglichkeiten, Daten auf dem physikalischen Medium zu organisieren. Beispielsweise können Disketten entweder mit dem Linux-Standarddateisystem ext2 oder mit dem oft verwendeten FAT-Dateisystem formatiert werden.
Gerätesteuerung
So ziemlich jede Systemoperation wird am Ende auf ein physikalisches Gerät zurückgeführt. Mit Ausnahme des Prozessors, des Speichers und einiger weniger anderer Dinge werden sämtliche Gerätesteuerungsoperationen durch Code ausgeführt, der für das jeweilige Gerät spezifisch ist. Dieser Code wird Gerätetreiber genannt. Der Kernel muß einen Gerätetreiber für jedes Peripheriegerät im System enthalten, von der Festplatte über die Tastatur bis hin zum Bandlaufwerk. Um diesen Aspekt der Kernel-Funktionen wird es uns in diesem Buch hauptsächlich gehen.
Netzwerkbetrieb
Der Netzwerkbetrieb muß vom Betriebssystem verwaltet werden, da die meisten Netzwerkoperationen nicht für einen Prozeß spezifisch sind: Eingehende Pakete sind asynchrone Ereignisse. Diese Pakete müssen gesammelt, identifiziert und weitergeleitet werden, bevor sich ein Prozeß darum kümmern kann. Es ist die Aufgabe des Systems, Datenpakete über Programm- und Netzwerkschnittstellen hinweg auszuliefern und die Ausführung von Programmen passend zu ihrer Netzwerkaktivität zu steuern. Außerdem sind alle Belange des Routings und der Adreßauflösung im Kernel angesiedelt.
Architekturabhängiger Code ==> CPU
Speichermanager ==> Speicher
Dateisystemtypen
Blockgeräte Disks Cds
Zeichengeräte Konsolen etc
Schnittstellentreiber
Kompilierung ohne Module
Zusätzlich zu gezielten Optimierungen für den Prozessor lässt sich ein Kernel "out-of-the-box" auch deutlich verschlanken. Er muß ja Module für verschiedenste Zwecke bereitstellen, die jedoch für die meisten Installationen nicht gebraucht werden. Im Regelfall werden ganze Modulgruppen nicht benötigt. So können auf Desktops beispielsweise
die IrDA-Komponenten entfallen,
auf Netzwerk-Clients in der Regel das ISDN-Subsystem.
Die Amateur-Radio-Unterstützung oder
die Bluetooth-Komponenten
zählen ebenfalls zu den typischen Entsorgungskandidaten.
In der schlanken Konfiguration ohne überfüssigen Ballast sinkt der Zeitaufwand für eine komplette Kernel-Kompilierung von 35 auf knapp sieben Minuten. Der Speicherbedarf des Systems reduziert sich erneut, auch bei sequenziellen Lesevorgängen erreichen wir nochmals einen Performance-Vorteil. Ansonsten weisen unsere Benchmarks jedoch keine wesentliche Beschleunigung gegenüber einem modularen Kernel aus.
Die Kernelmodule
Module bieten im Vergleich mit fest einkompilierten Treibern mehrere Vorteile:
Austauschbarkeit. Dadurch, daß Treiber, die als Module ausgeführt sind, bei Bedarf einfach geladen werden können, erspart man sich die Neukompilation des Kernels bei der Installation neuer Hardware, die sonst zur Integration neuer Treiber nötig wäre. Für Leute, die selbst einen Treiber schreiben wollen, bedeuten Module ebenfalls eine große Arbeitserleichterung, da sie dann nicht mehr für jede kleine Änderung einen neuen Kernel generieren und booten müssen.
Speicherersparnis. Ein fest im Kernel integrierter Treiber belegt, auch wenn er nicht benutzt wird, ständig wertvollen Arbeitsspeicher. Module hingegen werden bei Nichtverwendung entfernt und belegen dann keinen Speicher mehr.
Einfachere Distribution von Treibern. Dank Modulen ist es möglich, relativ problemlos Treiber zu veröffentlichen, ohne sie in den Linux-Kernel selbst integrieren zu müssen. (Natürlich könnte man den Treiber auch als Patch für den Kernel verbreiten - und dies wird ja auch getan - aber solche Patches sind meist nur mit einer bestimmten Kernelversion verwendbar.)
Diese Art, Treiber zu verteilen, ist eine Möglichkeit, die leider noch viel zu wenig genutzt wird.
Modulverwaltung
* insmod und rmmod:
* Diese beiden Utilities bilden die unterste Ebene. Mit ihnen ist es möglich, manuell Module zu laden und wieder zu entfernen; allerdings wenig mehr.
* modprobe:
* Dieses Programm ist schon etwas "schlauer": es kann mit "Abhängigkeiten" zwischen Modulen umgehen, d.h. es weiß, ob ein Modul ein anderes Modul voraussetzt und lädt es ggfs. zuerst. Ein Beispiel: sr_mod ist das Modul, das SCSI-CDROM-Laufwerke unterstützt.
Damit es arbeiten kann, benötigt es allerdings das Modul scsi_mod (für die allgemeine SCSI-Unterstützung) und ein Modul für die Hardwareunterstützung des SCSI-Hostadapters. Bei dem Aufruf modprobe sr_mod wird automatisch zuerst scsi_mod und das Modul für den Hostadapter geladen, bevor sr_mod selbst an die Reihe kommt. Und dies alles ist für den Benutzer völlig transparent. (Man muß modprobe allerdings in einer Konfigurationsdatei mitteilen, welches Modul für den Hostadapter das "richtige" ist) Außerdem hat modprobe einen kleinen "Gehilfen"
zur Seite, das Programm depmod, das die Liste der Abhängigkeiten erstellt.
* kerneld:
* Dieses läuft stets im Hintergrund mit (als sogenannter Daemon) und lauscht, ob der Kernel eine Anforderung für einen momentan nicht geladenen Treiber erhält.
Gegebenenfalls ruft kerneld dann modprobe auf, um den Treiber zu laden, woraufhin der Kernel weiterarbeiten kann. Und wenn ein Modul eine Minute lang nicht benutzt wurde, so entfernt kerneld es auch wieder.
(Übrigens ist kerneld zu viel mehr fähig; es kann beispielsweise auch als Screensaver fungieren oder beim Aufbau von Netzverbindungen Programme starten.)
Die Bezeichnung Treiber trifft eigentlich unter Linux nicht wirklich zu. Allein der Kernel darf auf die Hardware zugreifen. Dabei wird lediglich unterschieden, ob ein "Treiber" statisch oder modular eingebunden wurde.
Die modulare Aufbauweise hat den Vorteil, dass das System nur dann mit Dingen belastet wird, wenn sie unbedingt benötigt werden. Das Modul für eine TV-Karte bspw. muss nur dann laufen, wenn gerade jemand Fernseh schaut. Danach kann das Modul wieder weggepackt werden.
Damit man den Umgang mit Modulen immer im Griff hat, sollte man sich die folgenden Kommandos einprägen.
Wichtige Befehle:
lsmod: Mit lsmod können die Module, die in unser System eingebunden sind gelistet werden.
insmod: Dies ist der Nachfolger von modprobe. Mit diesem Befehl wird ein Modul gestartet
rmmod: im Gegensatz zu insmod entfernt dieser Befehl ein bestehendes Modul
modprobe: Dieser Befehl macht exakt das was insmod tut und ist veraltet. Ab Kernel 2.6 kommt er nicht mehr zum Einsatz
Und so werden diese Befehle eingesetzt.
Einsatz der Befehle:
tux@erde:# insmod bttv
Dieser Befehl sucht im Verzeichnis /lib/modules (Kann je nach Distribution abweichen und ist in der Path-Variablen hinterlegt) nach einer Datei, die bttv.o heißt. Ab Kernelversion 2.6 haben die Module eine neue Endung: .ko. Das Modul wird, sofern es gefunden wurde geladen. Erscheint keine Fehlermeldung lief alles glatt.
Ebenso einfach ist es ein Modul wieder zu entfernen:
tux@erde:# rmmod bttv
Wichtig ist noch zu wissen, wo die zentrale Konfiguration der Module zu finden ist. Auch hier hat sich beim Kernel 2.6 wieder eine Kleinigkeit getan.
Konfigurationsdateien:
Alte SuSE Versionen bis ich glaube 6.3 bedienten sich der Datei /etc/conf.modules. Ab Version 6.4 und alle anderen Distributionen griffen von jeher auf die Datei /etc/modules.conf zu.
Der Kernel 2.6 erwartet allerdings ab sofort diese Informationen in der Datei /etc/modprobe.conf.
Viel Erfolg beim Laden der Module Eurer Wahl.
Karsten
Die Module kann man sich mit cat /proc/modules anschauen
ipt_TOS 1048 9 (autoclean)
ipt_LOG 3480 1 (autoclean)
ipt_state 568 12 (autoclean)
st 30708 0 (autoclean) (unused)
sr_mod 13624 0 (autoclean)
sg 29276 0 (autoclean)
mousedev 4536 0 (unused)
joydev 5984 0 (unused)
evdev 4352 0 (unused)
input 3456 0 [mousedev joydev evdev]
usb-uhci 24976 0 (unused)
usbcore 66476 1 [usb-uhci]
raw1394 16724 0 (unused)
ieee1394 38064 0 [raw1394]
ipv6 179508 -1 (autoclean)
hisax 560592 4
isdn 139020 6 [hisax]
slhc 4752 1 [isdn]
isa-pnp 32520 0 [hisax]
ipt_REJECT 3160 3 (autoclean)
iptable_mangle 2200 1 (autoclean)
iptable_filter 1708 1 (autoclean)
ip_nat_ftp 3152 0 (unused)
iptable_nat 17638 1 [ip_nat_ftp]
ip_conntrack_ftp 4112 1 [ip_nat_ftp]
ip_conntrack 19384 3 [ipt_state ip_nat_ftp iptable_nat ip_conntrack_ ftp]
ip_tables 11808 9 [ipt_TOS ipt_LOG ipt_state ipt_REJECT iptable_m angle iptable_filter iptable_nat]
ide-scsi 10608 0
ide-cd 32220 1
cdrom 30496 0 [sr_mod ide-cd]
lvm-mod 70500 0 (autoclean)
ext3 90696 1
jbd 54292 1 [ext3]
Daneben empfiehlt sich auch ein Blick in die Datei /var/log/boot.msg. Dort finden Sie ein Protokoll aller vom Kernel beim Systemstart ausgegebenen Meldungen, das ebenfalls Informationen zur Kernelkonfiguration liefern kann.
http://www.linux-magazin.de/Service/Books/Buecher/HW-Treiber/building.html
http://www.linux-magazin.de/Service/Books/Buecher/HW-Treiber/x217.html
http://www.linuxhaven.de/dlhp/HOWTO/DE-Kernel-HOWTO-9.html
http://www.tecchannel.de/betriebssysteme/830/4.html
http://www.bs-welt.de/betriebssysteme.htm
Linux Systemaufbau Kernelmodule
Apache Module