GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So schreiben Sie Ihr eigenes Linux-Kernel-Modul mit einem einfachen Beispiel

Was sind Kernelmodule?

Kernel-Module sind Codestücke, die bei Bedarf vom Kernel geladen und entladen werden können.

Kernelmodule bieten eine einfache Möglichkeit, die Funktionalität des Basiskernels zu erweitern, ohne den Kernel neu erstellen oder neu kompilieren zu müssen. Die meisten Treiber sind als Linux-Kernel-Module implementiert. Wenn diese Treiber nicht benötigt werden, können wir nur diesen spezifischen Treiber entladen, wodurch die Kernel-Image-Größe reduziert wird.

Die Kernel-Module haben die Erweiterung .ko. Auf einem normalen Linux-System befinden sich die Kernel-Module im Verzeichnis /lib/modules//kernel/.

Zuvor haben wir besprochen, wie man einen Kernel aus der Quelle kompiliert.

Dieses Tutorial erklärt anhand eines einfachen Hello World-Beispiels, wie man ein Kernel-Modul schreibt.

Ich. Dienstprogramme zum Manipulieren von Kernelmodulen

1. lsmod – Bereits geladene Module auflisten

Der Befehl lsmod listet Module auf, die bereits im Kernel geladen sind, wie unten gezeigt.

# lsmod
Module                  Size  Used by
ppp_deflate            12806  0 
zlib_deflate           26445  1 ppp_deflate
bsd_comp               12785  0 
..

2. insmod – Modul in Kernel einfügen

Der Befehl insmod fügt ein neues Modul in den Kernel ein, wie unten gezeigt.

# insmod /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

# lsmod | grep "squash"
squashfs               35834  0

3. modinfo – Modulinfo anzeigen

Der Befehl modinfo zeigt Informationen über ein Kernelmodul wie unten gezeigt an.

# modinfo /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko

filename:       /lib/modules/3.5.0-19-generic/kernel/fs/squashfs/squashfs.ko
license:        GPL
author:         Phillip Lougher 
description:    squashfs 4.0, a compressed read-only filesystem
srcversion:     89B46A0667BD5F2494C4C72
depends:        
intree:         Y
vermagic:       3.5.0-19-generic SMP mod_unload modversions 686

4. rmmod – Modul aus Kernel entfernen

Der Befehl rmmod entfernt ein Modul aus dem Kernel. Sie können kein Modul entfernen, das bereits von einem Programm verwendet wird.

# rmmod squashfs.ko

5. modprobe – Module zum Kernel hinzufügen oder entfernen

modprobe ist ein intelligenter Befehl, der Module basierend auf der Abhängigkeit zwischen Modulen lädt/entlädt. Ausführlichere Beispiele finden Sie unter modprobe-Befehle.

II. Schreiben Sie ein einfaches „Hello World“-Kernelmodul

1. Installieren der Linux-Header

Sie müssen zuerst die linux-headers-.. wie unten gezeigt installieren. Verwenden Sie je nach Distribution apt-get oder yum.

# apt-get install build-essential linux-headers-$(uname -r)

2. Quellcode des Hello World-Moduls

Erstellen Sie als Nächstes das folgende hello.c-Modul in der Programmiersprache C.

#include <linux/module.h>    // included for all kernel modules
#include <linux/kernel.h>    // included for KERN_INFO
#include <linux/init.h>      // included for __init and __exit macros

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Lakshmanan");
MODULE_DESCRIPTION("A Simple Hello World module");

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello world!\n");
    return 0;    // Non-zero return means that the module couldn't be loaded.
}

static void __exit hello_cleanup(void)
{
    printk(KERN_INFO "Cleaning up module.\n");
}

module_init(hello_init);
module_exit(hello_cleanup);

Warnung: Alle Kernel-Module arbeiten im Kernel-Space, einem hochprivilegierten Modus. Seien Sie also vorsichtig mit dem, was Sie in ein Kernel-Modul schreiben.

3. Makefile zum Kompilieren des Kernel-Moduls erstellen

Das folgende Makefile kann verwendet werden, um das obige grundlegende Kernel-Modul „Hello World“ zu kompilieren.

obj-m += hello.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Verwenden Sie den Befehl make, um das Kernelmodul hell world zu kompilieren, wie unten gezeigt.

# make

make -C /lib/modules/3.5.0-19-generic/build M=/home/lakshmanan/a modules
make[1]: Entering directory `/usr/src/linux-headers-3.5.0-19-generic'
  CC [M]  /home/lakshmanan/a/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lakshmanan/a/hello.mod.o
  LD [M]  /home/lakshmanan/a/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-19-generic'

Das Obige erstellt eine hello.ko-Datei, die unser Beispiel-Kernel-Modul ist.

4. Fügen Sie das Kernel-Beispielmodul ein oder entfernen Sie es

Jetzt, da wir unsere hello.ko-Datei haben, können wir dieses Modul in den Kernel einfügen, indem wir den insmod-Befehl wie unten gezeigt verwenden.

# insmod hello.ko

# dmesg | tail -1
[ 8394.731865] Hello world!

# rmmod hello.ko

# dmesg | tail -1
[ 8707.989819] Cleaning up module.

Wenn ein Modul in den Kernel eingefügt wird, wird das Makro module_init aufgerufen, das die Funktion hello_init aufruft. Wenn das Modul mit rmmod entfernt wird, wird in ähnlicher Weise das Makro module_exit aufgerufen, das hello_exit aufruft. Mit dem Befehl dmesg können wir die Ausgabe des Kernel-Beispielmoduls sehen.

Bitte beachten Sie, dass printk eine im Kernel definierte Funktion ist und sich ähnlich wie printf in der IO-Bibliothek verhält. Denken Sie daran, dass Sie keine der Bibliotheksfunktionen des Kernelmoduls verwenden können.

Jetzt haben Sie die Grundlagen gelernt, um Ihr eigenes Linux-Kernel-Modul zu erstellen.


Linux
  1. So verwenden Sie den Rmmod-Befehl unter Linux mit Beispielen

  2. Linux – Wie kann man feststellen, welches Modul den Kernel verschmutzt?

  3. Linux – Ein verdorbener Kernel in Linux?

  4. Linux – Wie lädt man ein Kernel-Modul richtig neu?

  5. So erstellen Sie Threads in Linux (mit einem C-Beispielprogramm)

So retten Sie Ihr Windows- oder Linux-System mit Rescatux

So erstellen Sie Ihre eigene Linux-Distribution mit Yocto auf Ubuntu

So finden Sie heraus, welche Version des Linux-Kernels auf Ihrem PC läuft

So überwachen Sie Ihre Linux-Server mit Checkmk

Cron Vs Anacron:So richten Sie Anacron unter Linux ein (mit einem Beispiel)

Wie kann man ganz einfach seine eigene Linux-Distribution erstellen?