Linux Kernel · 2 min read · Dec 06, 2025

Lire des fichiers depuis l'espace noyau Linux (Module/Driver) (Fedora 14)

Lire des fichiers depuis l’espace noyau Linux (Module/Driver) (Fedora 14)

Il semble que les opérations qui communiquent avec l’espace utilisateur soient vraiment découragées. Et je ne conteste pas cela. Bien que cela ne signifie pas qu’elles ne peuvent pas être réalisées. Un pilote charge une configuration qui pourrait être stockée uniquement sur le HDD. Lorsque MS Windows XP démarre, il se souvient que j’ai désactivé le Bluetooth, donc il n’est pas alimenté, contrairement même au dernier Linux (Fedora 14 au moment de l’écriture) – une telle fonctionnalité n’a pas été implémentée dans de nombreux pilotes. Lorsque le développeur utilise procfs ou des dispositifs de caractères, il devrait y avoir un autre logiciel ou script dans la séquence de démarrage qui envoie effectivement des informations d’un fichier à un dispositif particulier.

Après un certain temps passé sur internet, j’ai réussi à écrire un tel module qui lit un fichier. Et le voici :

#include   // Nécessaire pour tous les modules
#include   // Nécessaire pour KERN_INFO
#include       // Nécessaire pour filp
#include    // Nécessaire pour les descripteurs de segment

int init_module(void)
{
    // Créer des variables
    struct file *f;
    char buf[128];
    mm_segment_t fs;
    int i;
    // Initialiser le tampon avec 0
    for(i=0;i<128;i++)
        buf[i] = 0;
    // Pour voir dans /var/log/messages que le module fonctionne
    printk(KERN_INFO "Mon module est chargé\n");
    // J'utilise Fedora et pour le test, j'ai choisi le fichier suivant
    // Évidemment, il est beaucoup plus petit que 128 octets, mais tant pis =)
    f = filp_open("/etc/fedora-release", O_RDONLY, 0);
    if(f == NULL)
        printk(KERN_ALERT "Erreur filp_open!!.\n");
    else{
        // Obtenir le descripteur de segment actuel
        fs = get_fs();
        // Définir le descripteur de segment associé à l'espace noyau
        set_fs(get_ds());
        // Lire le fichier
        f->f_op->read(f, buf, 128, &f->f_pos);
        // Restaurer le descripteur de segment
        set_fs(fs);
        // Voir ce que nous avons lu du fichier
        printk(KERN_INFO "buf:%s\n",buf);
    }
    filp_close(f,NULL);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Mon module est déchargé\n");
}

C’est tout ce qui est nécessaire pour lire le fichier /etc/fedora-release. Juste au cas où, ce qui suit doit être dans le Makefile si la source est enregistrée sous module.c :

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

En émettant ce qui suit :

$ make

$ su

# insmod module.ko

Puis à la fin de /var/log/messages, je vois ce qui suit :

Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Mon module est chargé

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

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

La ligne supplémentaire pourrait simplement provenir du fichier. Mais hé, c’est exactement ce qu’il y a dans ce fichier !!!

Il semble également que les fonctions d’écriture soient présentes, donc si quelqu’un a envie d’écrire quelque chose depuis l’espace noyau vers un fichier – la fonctionnalité est à peu près là.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.