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.