Compreender a organização do sistema de arquivos é fundamental para o desenvolvimento de drivers.
Criando um Novo Driver
Para integrar um novo driver ao kernel, siga estes passos:
- Escreva o código-fonte do driver no subdiretório correspondente dentro de
drivers/, ou adicione código de suporte a placa emarch/arm/mach-xxx/. - Edite o script de configuração
Kconfigno mesmo diretório. - Modifique o script
Makefilelocal.
//-------exemplo.c------------------------
#include <linux/init.h>
#include <linux/module.h>
static int __init modulo_init(void){
printk(KERN_INFO "Modulo de exemplo carregado.\n");
return 0;
}
module_init(modulo_init);
static void __exit modulo_saida(void){
printk(KERN_INFO "Modulo de exemplo removido.\n");
}
module_exit(modulo_saida);
MODULE_AUTHOR("Autor");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("Um modulo de exemplo para testes.");
MODULE_ALIAS("modulo_teste");
//-------Makefile------------------------
ifeq ($(KERNELRELEASE),)
DIR_KER ?= /lib/modules/$(shell uname -r)/build
CAMINHO := $(shell pwd)
all:
$(MAKE) -C $(DIR_KER) M=$(CAMINHO) modules
install:
$(MAKE) -C $(DIR_KER) M=$(CAMINHO) modules_install
clean:
rm -f *.o *.ko *.mod.c *.mod.o modules.order Module.symvers
rm -rf .tmp_versions .*.cmd
.PHONY: all install clean
else
obj-m := exemplo.o
endif
Consultando Informações do Módulo
Use o comando modinfo para inspecionar detalhes sobre um módulo compilado:
modinfo exemplo.ko
Parâmetros em Tempo de Carregamento
Módulos podem aceitar parâmetros durante sua inserção no kernel. Os valores podem ser consultados em /sys/module/nome_do_modulo/parameters.
static int identificador = 0;
static char *nome_mensagem = "Padrao";
module_param(identificador, int, 0644);
module_param(nome_mensagem, charp, 0644);
static int __init modulo_init(void){
printk(KERN_INFO "Inicializado: ID=%d, Nome=%s\n", identificador, nome_mensagem);
return 0;
}
module_init(modulo_init);
Execução de exemplo:
sudo insmod exemplo.ko identificador=42 nome_mensagem="Teste"
Saída do dmesg:
[12345.678901] Inicializado: ID=42, Nome=Teste
Exportando Símbolos do Kernel
Funções podem ser tornadas disponíveis para outros módulos usando macros de exportação:
int escrever_reg(int endereco, int valor){
// lógica de escrita
return valor;
}
int ler_reg(int endereco){
// lógica de leitura
return 0;
}
EXPORT_SYMBOL_GPL(escrever_reg);
EXPORT_SYMBOL_GPL(ler_reg);
Os símbolos exportados podem ser verificados em /proc/kallsyms.
Arquivos Espceiais do Sistema
Dispositivos são representados como arquivos no diretório /dev/. As colunas de data indicam o número principal (major) e secundário (minor) do dispositivo.
A lista completa de drivers registrados está em /proc/devices.
Sistema de Arquivos sysfs
O sysfs expõe a estrutura do kernel em /sys/:
- block/: Contém todos os dispositivos de bloco.
- devices/: Apresenta todos os dispositivos do sistema em uma estrutura hierárquica baseada no barramento ao qual estão conectados.
- bus/: Lista todos os tipos de barramento disponíveis (ex: PCI, USB).
- class/: Agrupa dispositivos por tipo funcional (ex: rede, som, entrada).