Desenvolvimento de Drivers para Linux

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:

  1. Escreva o código-fonte do driver no subdiretório correspondente dentro de drivers/, ou adicione código de suporte a placa em arch/arm/mach-xxx/.
  2. Edite o script de configuração Kconfig no mesmo diretório.
  3. Modifique o script Makefile local.
//-------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).

Tags: Linux kernel drivers Makefile Kconfig

Publicado em 7-1 19:33