Criando um Módulo de Kernel para Linux no Ubuntu

Visão Geral

Este guia demonstra como desenvolver e testar um módulo de kernel simples para Linux em um ambiente Ubuntu. O exemplo inclui a criação do driver, um Makefile para compilação e uma aplicação de teste. O procedimento é executado em uma máquina virtual com Ubuntu 12.04, sem necessidade de hardware dedicado.

Implementação do Driver

O driver define operações básicas de dispositivo, como abertura e escrita, usando funções do kernel. As mensagens são registradas via printk com prioridade KERN_EMERG para garantir visibilidade no console.

Código do Driver (module_driver.c)

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>

#define DRIVER_MAJOR 240
#define DEV_NAME "KernelDemo"

static int device_open(struct inode *node, struct file *fp) {
    printk(KERN_EMERG "Acesso ao dispositivo aberto.\n");
    return 0;
}

static int device_write(struct file *fp, const char __user *data, size_t len, loff_t *off) {
    printk(KERN_EMERG "Escrita no dispositivo.\n");
    return 0;
}

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = device_open,
    .write = device_write,
};

static int __init driver_init(void) {
    if (register_chrdev(DRIVER_MAJOR, DEV_NAME, &fops) < 0) {
        printk(KERN_EMERG "Falha ao registrar o dispositivo.\n");
        return -EIO;
    }
    printk(KERN_EMERG "Módulo carregado com sucesso.\n");
    return 0;
}

static void __exit driver_exit(void) {
    unregister_chrdev(DRIVER_MAJOR, DEV_NAME);
    printk(KERN_EMERG "Módulo descarregado.\n");
}

module_init(driver_init);
module_exit(driver_exit);
MODULE_LICENSE("GPL");

Makefile para Compilação

ifneq ($(KERNELRELEASE),)
MOD_NAME = kernel_demo
obj-m := $(MOD_NAME).o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
	make -C $(KDIR) M=$(PWD) modules

clean:
	rm -f *.o *.ko *.mod.c .*.cmd
	rm -rf .tmp_versions
endif

Aplicação de Teste (test_app.c)

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    int desc = open("/dev/demo_dev", O_WRONLY);
    if (desc < 0) {
        perror("Erro ao abrir o dispositivo");
        return 1;
    }
    int value = 99;
    write(desc, &value, sizeof(value));
    close(desc);
    return 0;
}

Processo de Teste

Compilação do Driver

Execute o comando make no diretório do projeto para gerar o arquivo kernel_demo.ko.

Compilação da Aplicação

Compile a aplicação de teste com gcc test_app.c -o test_app.

Carregamento do Módulo

Insira o módulo no kernel usando insmod kernel_demo.ko. Verifique as mensagens no log com dmesg | tail.

Criação do Nó de Dispositivo

Identfiique o número principal do dispositivo em /proc/devices (por exemplo, 240). Crie o nó com mknod /dev/demo_dev c 240 0.

Execução do Teste

Rode a aplicação ./test_app. As funções device_open e device_write serão invocadas, gerando mensagens no log do kernel.

Remoção do Módulo

Descarregue o módulo com rmmod kernel_demo e limpe o nó de dispositivo se necessário.

Tags: Ubuntu Makefile

Publicado em 6-11 16:08 por Thomas