Linux -Geräte -Treiber -Tutorial für Anfänger

Linux -Geräte -Treiber -Tutorial für Anfänger
Linux -Betriebssystem enthält 3 Hauptabschnitte: Root -Dateisystem, Kernel und Bootloader.

Stammdateisystem:

Dieser Teil des Betriebssystems enthält Anwendungsbinärdateien, Bibliotheken, Skripte, Konfigurationsdateien und ladbare Moduldateien von Kernel usw

Kernel:

Dieser Teil ist das Herzstück des Betriebssystems. Der Kernel ist für die Behandlung aller für die Ausführung des Betriebssystems erforderlichen Vorgänge wie Speicherverwaltung, Prozessverwaltung und Eingangs-/Ausgabe -Hardwareoperationen usw. verantwortlich

Bootloader:

Dies ist der erste Teil, der von der CPU am Start ausgeführt wird. Der Bootloader enthält den Quellcode zum Initialisieren des Systems und zum Ausführen des Kernels und Befehle zum Debuggen und Ändern der Kernel -Umgebung. Außerdem enthält er die Befehle zum Herunterladen und Aktualisieren des Kernels und des Systembilders in den Flash -Speicher.

Die Treiber fungieren als Brücke zwischen Hardware und Benutzeranwendung. Der Kernel bietet einen Mechanismus namens Systemaufrufe, um mit dem Kernel zu sprechen. In Linux können die Fahrer auf zwei Arten implementiert werden. Einer ist Treiber können als Teil des Kernels zusammengestellt werden und ein anderer ist die Treiber können als Module zusammengestellt und zur Laufzeit geladen werden.

Beginnen wir mit einem einfachen Hello World -Kernel -Modul. Hier ist der Quellcode für ein einfaches Hello World -Kernel -Modul.

Hallo.C

#Include // benötigt für Module_init und Module_exit
#include // benötigt für kern_info
#Include // benötigt für die Makros
int __init hw_init (void)
printk (kern_info "Hallo Welt \ n");
Rückkehr 0;

void __exit hw_exit (void)
printk (kern_info "bye world \ n");

Module_license ("GPL");
module_init (hw_init);
module_exit (hw_exit);

Makefile

OBJ-M: = Hallo.Ö
alle:
make -c/lib/module/$ (Shell uname -r)/bauen m = $ (pwd) Module
sauber:
make -c/lib/module/$ (Shell uname -r)/bauen m = $ (pwd) sauber

Erstellen Sie einen Ordner mit dem Namen Hallo und dann die Hallo.C Und Makefile im Inneren. Öffne das Terminal Bewerbung und Verzeichnis in Hello ändern. Führen Sie nun den Befehl aus machen und wenn es erfolgreich ist, sollte es eine ladbare Kernelmoduldatei generieren, die aufgerufen wurde Hallo.ko.

Wenn Sie ausführen, machen Sie die Ausgabe make: nichts zu tun für 'alles'. Dann stellen Sie bitte sicher, dass Sie in der Registerkarte Makefile (keine Leerzeichen) vor Make -c eingegeben haben (keine Leerzeichen). Wenn Made erfolgreich ist, sollten Sie die Ausgabe wie unten gezeigt erhalten.

MACHEN [1]: Eingingen des Verzeichnisses '/usr/src/Linux-Header-3.13.0-128-generisch '
CC [M]/Home/John/Desktop/Hallo/Hallo.Ö
Gebäudemodule, Stufe 2.
Modpost 1 Module
CC/Home/John/Desktop/Hallo/Hallo.Mod.Ö
Ld [m]/home/John/Desktop/mvs/Pers/Kern/Hallo/Hallo.ko
Make [1]: Verzeichnis '/usr/src/Linux-Header-3 verlassen.13.0-128-generisch '

Testen wir das Modul nun, indem wir es in den Kernel laden. Zum Laden und Entladen von Kernelmodulen benötigen wir eine Superuser -Erlaubnis. Verwenden Sie den folgenden Befehl, um das Kernel -Modul in den Kernel zu laden.

sudo Insmod Hallo.ko

Um die Printk -Nachricht anzuzeigen, müssen Sie das Kernel -Protokoll überprüfen, um das Kernel -Protokoll zu überprüfen. Verwenden Sie den folgenden Befehl.

dmesg

Dieser Befehl gibt die Kernel -Protokollnachrichten aus. Am Ende sollten Sie sehen, dass unsere Nachricht Hallo Welt gedruckt.

Um das Modul zu entladen, verwenden Sie den folgenden Befehl.

sudo rmmod Hallo

Um die Printk -Nachricht zu sehen, verwenden Sie den Befehl DMESG erneut und im Kernel -Protokoll können Sie unsere Nachricht sehen Tschüss Welt.

Lassen Sie uns nun den Quellcode verstehen.

Hallo.C

Um den Kernel -Treiber zu schreiben vi Editor.

Jedes Kernel -Modul sollte die Header -Datei enthalten Linux/Modul.H Dies enthält die Erklärungen und Makros für Kernelfunktionen wie z module_init Und Module_exit usw. Die beiden notwendigsten Funktionen für einen Kernel -Treiber sind Module_init und Module_exit -Funktionen. Die Funktion, deren Zeiger an module_init übergeben wird.

Im Kernel zum Debuggen und Drucken des Protokolls verwenden wir printk Funktion, die der Printf -Funktion ähnelt, die wir in der Anwendung verwenden. Sie können die Makros wie KERN_INFO, KERN_ERR usw. verwenden, um eine Protokollebene anzugeben.

Wenn wir einen Treiber schreiben, um mit einer bestimmten Hardware zu sprechen, sollte die Init -Funktion über den Code verfügen, um die Hardware zu initialisieren, bevor wir mit der Verwendung beginnen, und die Beendigung der Funktion sollte über einen Code verfügen, um Ressourcen zu reinigen (dynamischer Speicher usw.), den wir im Treiber verwendet haben Bevor wir aus dem Kernel verlassen.

Hier in diesem Beispiel drucken wir nur Debug -Nachrichten in Init- und Exit -Funktionen.

Makefile

Zum Bau des Kernel -Moduls müssen wir ein Makefile schreiben, das leiten wird machen Dienstprogramm, wie man das Modul kompiliert. Die Syntax OBJ-M wird verwendet, um das Kernel Makefile mitzuteilen, dass der Treiber mit der angegebenen Objektdatei als Modul kompiliert werden muss. Wenn Sie gerade den Befehl ausführen machen Dann kommt die Kontrolle zum alle: Abschnitt des Makefile und wenn Sie den Befehl ausführen sauber machen dann geht die Kontrolle zum sauber: Abschnitt von Makefile. Aus diesem Makefile leiten wir tatsächlich im Kernel -Quellverzeichnis mit Option -c. Bitte stellen Sie sicher, dass in Ihrem System ein Kernel -Quellverzeichnis installiert ist. Hier in diesem Beispiel haben wir den Befehl verwendet Uname -r Um die aktuelle Version des Linux -Kernels Ihres Systems zu finden.

Wir haben Option M = $ (PWD) verwendet, um im Kernel Makefile anzugeben, dass sich die Quelle für den Fahrer im gegenwärtigen Arbeitsverzeichnis befindet, und wir geben das Wort an Module Um Kernel Makefile zu sagen, dass er nur Module erstellen und den vollständigen Kernel -Quellcode nicht erstellen soll. In sauber: Abschnitt von Makefile Wir fordern Kernel Makefile an, die Objektdateien zu reinigen, die zum Erstellen dieses Moduls erstellt wurden.

Dies fangen Sie an, Ihr erstes Kernel -Modul zu kompilieren und auszuführen.