Kernel Linux · 2 min read · Dec 06, 2025

Lendo Arquivos Do Espaço do Kernel Linux (Módulo/Driver) (Fedora 14)

Lendo Arquivos Do Espaço do Kernel Linux (Módulo/Driver) (Fedora 14)

Parece que operações que comunicam com o espaço do usuário são realmente desencorajadas. E eu não estou discutindo isso. Embora isso não signifique que não possam ser realizadas. Um driver carrega configurações que poderiam ser armazenadas apenas no HDD. Quando o MS Windows XP é iniciado, ele lembra que eu desliguei o Bluetooth, então ele não é ativado, ao contrário até mesmo do Linux mais recente (Fedora 14 no momento da escrita) – tal funcionalidade em muitos drivers não foi implementada. Quando o desenvolvedor usa procfs ou dispositivos de caractere, deve haver outro software ou script na sequência de inicialização que está realmente enviando informações de um arquivo para um dispositivo específico.

Depois de algum tempo navegando pela internet, consegui escrever tal módulo que lê um arquivo. E aqui está:

#include   // Necessário para todos os módulos
#include   // Necessário para KERN_INFO
#include       // Necessário para filp
#include    // Necessário para descritores de segmento

int init_module(void)
{
    // Criar variáveis
    struct file *f;
    char buf[128];
    mm_segment_t fs;
    int i;
    // Inicializa o buffer com 0
    for(i=0;i<128;i++)
        buf[i] = 0;
    // Para ver em /var/log/messages que o módulo está operando
    printk(KERN_INFO "Meu módulo está carregado\n");
    // Estou usando Fedora e para o teste escolhi o seguinte arquivo
    // Obviamente é muito menor que 128 bytes, mas que se dane =)
    f = filp_open("/etc/fedora-release", O_RDONLY, 0);
    if(f == NULL)
        printk(KERN_ALERT "erro filp_open!!.\n");
    else{
        // Obter descritor de segmento atual
        fs = get_fs();
        // Definir descritor de segmento associado ao espaço do kernel
        set_fs(get_ds());
        // Ler o arquivo
        f->f_op->read(f, buf, 128, &f->f_pos);
        // Restaurar descritor de segmento
        set_fs(fs);
        // Ver o que lemos do arquivo
        printk(KERN_INFO "buf:%s\n",buf);
    }
    filp_close(f,NULL);
    return 0;
}

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

Isso é tudo que é necessário para ler o arquivo /etc/fedora-release. Apenas para garantir, o seguinte precisa estar no Makefile se a fonte for salva 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

Emitindo o seguinte:

$ make

$ su

# insmod module.ko

Então, no final de /var/log/messages eu vejo o seguinte:

Dec 11 13:06:11 thinkpad kernel: [ 2410.431974] Meu módulo está carregado

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

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

A linha nova adicional pode ser apenas do arquivo. Mas ei, isso é exatamente o que está naquele arquivo!!!

Parece que funções de escrita também estão lá, então se alguém sentir vontade de escrever algo do espaço do kernel para um arquivo – a funcionalidade está quase lá.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.