Linux Kernel · 2 min read · Dec 06, 2025

Lectura de archivos desde el espacio del núcleo de Linux (Módulo/Controlador) (Fedora 14)

Lectura de archivos desde el espacio del núcleo de Linux (Módulo/Controlador) (Fedora 14)

Parece que las operaciones que se comunican con el espacio de usuario están realmente desaconsejadas. Y no estoy discutiendo eso. Aunque no significa que no se puedan lograr. Un controlador carga una configuración que podría estar almacenada solo en el HDD. Cuando MS Windows XP se inicia, recuerda que he apagado Bluetooth, por lo que no está encendido, a diferencia de incluso el último Linux (Fedora 14 en el momento de escribir) – tal funcionalidad en muchos drivers no fue implementada. Cuando un desarrollador utiliza procfs o dispositivos de caracteres, debería haber otro software o script en la secuencia de arranque que realmente esté enviando información desde un archivo a un dispositivo particular.

Después de un tiempo buscando en internet, logré escribir un módulo que lee un archivo. Y aquí va:

#include   // Necesario para todos los módulos
#include   // Necesario para KERN_INFO
#include       // Necesario para filp
#include    // Necesario para descriptores de segmento

int init_module(void)
{
    // Crear variables
    struct file *f;
    char buf[128];
    mm_segment_t fs;
    int i;
    // Inicializar el búfer con 0
    for(i=0;i<128;i++)
        buf[i] = 0;
    // Para ver en /var/log/messages que el módulo está operando
    printk(KERN_INFO "Mi módulo está cargado\n");
    // Estoy usando Fedora y para la prueba he elegido el siguiente archivo
    // Obviamente es mucho más pequeño que los 128 bytes, pero que demonios =)
    f = filp_open("/etc/fedora-release", O_RDONLY, 0);
    if(f == NULL)
        printk(KERN_ALERT "¡Error en filp_open!!.\n");
    else{
        // Obtener el descriptor de segmento actual
        fs = get_fs();
        // Establecer el descriptor de segmento asociado al espacio del núcleo
        set_fs(get_ds());
        // Leer el archivo
        f->f_op->read(f, buf, 128, &f->f_pos);
        // Restaurar el descriptor de segmento
        set_fs(fs);
        // Ver qué leímos del archivo
        printk(KERN_INFO "buf:%s\n",buf);
    }
    filp_close(f,NULL);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Mi módulo está descargado\n");
}

Eso es todo lo que se necesita para leer el archivo /etc/fedora-release. Solo en caso, lo siguiente necesita estar en el Makefile si la fuente se guarda como 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

Emitir lo siguiente:

$ make

$ su

# insmod module.ko

Entonces al final de /var/log/messages veo lo siguiente:

Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Mi módulo está cargado

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

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

La línea nueva adicional podría ser solo del archivo. Pero oye, ¡eso es exactamente lo que hay en ese archivo!!!

Parece que las funciones de escritura también están ahí, así que si alguien siente la necesidad de escribir algo desde el espacio del núcleo a un archivo – la funcionalidad está casi ahí.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.