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) cleanEn é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à.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.