Linux Kernel · 2 min read · Dec 06, 2025

Dateien aus dem Linux-Kernelraum lesen (Modul/Treiber) (Fedora 14)

Dateien aus dem Linux-Kernelraum lesen (Modul/Treiber) (Fedora 14)

Es scheint, dass Operationen, die mit dem Userspace kommunizieren, wirklich nicht empfohlen werden. Und ich argumentiere nicht dagegen. Obwohl das nicht bedeutet, dass sie nicht erreicht werden können. Ein Treiber lädt Konfigurationen, die nur auf der HDD gespeichert werden könnten. Wenn MS Windows XP hochfährt, erinnert es sich daran, dass ich Bluetooth ausgeschaltet habe, sodass es nicht eingeschaltet ist, im Gegensatz zu sogar dem neuesten Linux (Fedora 14 zum Zeitpunkt des Schreibens) – eine solche Funktionalität wurde in vielen Treibern nicht implementiert. Wenn ein Entwickler procfs oder Zeichengeräte verwendet, sollte es eine andere Software oder ein Skript in der Bootsequenz geben, das tatsächlich Informationen aus einer Datei an ein bestimmtes Gerät sendet.

Nach einiger Zeit im Internet habe ich es geschafft, ein solches Modul zu schreiben, das eine Datei liest. Und hier ist es:

#include   // Wird von allen Modulen benötigt
#include   // Wird für KERN_INFO benötigt
#include       // Wird von filp benötigt
#include    // Wird von Segmentbeschreibungen benötigt

int init_module(void)
{
    // Variablen erstellen
    struct file *f;
    char buf[128];
    mm_segment_t fs;
    int i;
    // Den Puffer mit 0 initialisieren
    for(i=0;i<128;i++)
        buf[i] = 0;
    // Um in /var/log/messages zu sehen, dass das Modul funktioniert
    printk(KERN_INFO "Mein Modul ist geladen\n");
    // Ich benutze Fedora und für den Test habe ich die folgende Datei gewählt
    // Offensichtlich ist sie viel kleiner als die 128 Bytes, aber egal =)
    f = filp_open("/etc/fedora-release", O_RDONLY, 0);
    if(f == NULL)
        printk(KERN_ALERT "filp_open Fehler!!.\n");
    else{
        // Aktuellen Segmentbeschreiber erhalten
        fs = get_fs();
        // Segmentbeschreiber, der mit dem Kernelraum verbunden ist, setzen
        set_fs(get_ds());
        // Die Datei lesen
        f->f_op->read(f, buf, 128, &f->f_pos);
        // Segmentbeschreiber wiederherstellen
        set_fs(fs);
        // Sehen, was wir aus der Datei gelesen haben
        printk(KERN_INFO "buf:%s\n",buf);
    }
    filp_close(f,NULL);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Mein Modul ist entladen\n");
}

Das ist alles, was benötigt wird, um die Datei /etc/fedora-release zu lesen. Nur für den Fall, dass Folgendes im Makefile stehen muss, wenn der Quellcode als module.c gespeichert wird:

obj-m += module.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

Folgendes ausführen:

$ make

$ su

# insmod module.ko

Dann sehe ich am Ende von /var/log/messages Folgendes:

Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Mein Modul ist geladen

Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:Fedora release 14 (Laughlin)

Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]

Die zusätzliche neue Zeile könnte einfach aus der Datei stammen. Aber hey, das ist genau das, was in dieser Datei steht!!!

Es sieht so aus, als ob auch Schreibfunktionen vorhanden sind, sodass, wenn jemand Lust hat, etwas aus dem Kernelraum in eine Datei zu schreiben – die Funktionalität ist vorhanden.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.