Linux Kernel · 2 min read · Dec 06, 2025
Lettura di file dallo spazio del kernel Linux (Modulo/Driver) (Fedora 14)
Lettura di file dallo spazio del kernel Linux (Modulo/Driver) (Fedora 14)
Sembra che le operazioni che comunicano con lo spazio utente siano davvero scoraggiate. E non sto discutendo su questo. Anche se non significa che non possano essere realizzate. Un driver carica configurazioni che potrebbero essere memorizzate solo su HDD. Quando MS Windows XP si avvia, ricorda che ho disattivato il Bluetooth, quindi non è acceso, a differenza anche dell’ultima versione di Linux (Fedora 14 al momento della scrittura) – tale funzionalità in molti driver non è stata implementata. Quando uno sviluppatore utilizza procfs o dispositivi a carattere, dovrebbe esserci un altro software o script nella sequenza di avvio che sta effettivamente inviando informazioni da un file a un dispositivo particolare.
Dopo un po’ di tempo trascorso su internet, sono riuscito a scrivere un modulo che legge un file. Ed ecco qui:
#include // Necessario per tutti i moduli
#include // Necessario per KERN_INFO
#include // Necessario per filp
#include // Necessario per i descrittori di segmento
int init_module(void)
{
// Crea variabili
struct file *f;
char buf[128];
mm_segment_t fs;
int i;
// Inizializza il buffer con 0
for(i=0;i<128;i++)
buf[i] = 0;
// Per vedere in /var/log/messages che il modulo è operativo
printk(KERN_INFO "Il mio modulo è caricato\n");
// Sto usando Fedora e per il test ho scelto il seguente file
// Ovviamente è molto più piccolo di 128 byte, ma che ci importa =)
f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if(f == NULL)
printk(KERN_ALERT "errore filp_open!!.\n");
else{
// Ottieni il descrittore di segmento corrente
fs = get_fs();
// Imposta il descrittore di segmento associato allo spazio del kernel
set_fs(get_ds());
// Leggi il file
f->f_op->read(f, buf, 128, &f->f_pos);
// Ripristina il descrittore di segmento
set_fs(fs);
// Vedi cosa abbiamo letto dal file
printk(KERN_INFO "buf:%s\n",buf);
}
filp_close(f,NULL);
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Il mio modulo è scaricato\n");
} Questo è tutto ciò che è necessario per leggere il file /etc/fedora-release. Giusto per essere sicuri, quanto segue deve essere nel Makefile se il sorgente è salvato come 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) cleanEseguendo quanto segue:
$ make
$ su
# insmod module.ko
Poi alla fine di /var/log/messages vedo quanto segue:
Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Il mio modulo è caricato
Dec 11 13:06:11 thinkpad kernel: [ 2410.431993] buf:Fedora release 14 (Laughlin)
Dec 11 13:06:11 thinkpad kernel: [ 2410.431995]
La nuova riga aggiuntiva potrebbe provenire semplicemente dal file. Ma ehi, è esattamente ciò che c’è in quel file!!!
Sembra che ci siano anche funzioni di scrittura, quindi se qualcuno ha voglia di scrivere qualcosa dallo spazio del kernel a un file – la funzionalità è lì.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.