domingo, 7 de dezembro de 2008

LKMs rules

   Eis exemplo simples de módulo que imprime “Ola Mundo!” no log do sistema operacional. O desenvolvimento no Linux é muito dinâmico. Com a evolução do sistema muitos códigos deixam de funcionar se não forem adaptados às novas mudanças. Para este exemplo, e exemplos futuros neste artigo, considera-se que o módulo será executado em uma máquina que possua núcleo 2.6.x.

#include
int init_module(void)
{
    printk("<1> Ola Mundo!\n");
    return 0;
}
void cleanup_module(void)
{
    printk("<1> Tchau :)\n");
}

   Para o desenvolvimento de um Linux Kernel Module (LKM) é necessário incluir o arquivo de cabeçalho “module.h” que possui várias definições essenciais para o módulo. Duas funções devem ser obrigatoriamente definidas: init_module (função de inicialização do módulo) e cleanup_module (função de remoção do módulo). A função printk é a substituta de printf, pois não é possível utilizar as bibliotecas que normalmente são usadas em aplicações no nível de usuário (MORAES, 2005).

   Para compilar o módulo, é usado um esquema de compilação fornecido pelo núcleo chamado “kbuild”. Na sequencia é apresentado um exemplo de Makefile que deve ser criado no mesmo diretório do código-fonte do módulo. Ele ajusta algumas variáveis e fará o uso de um Makefile mais complexo que já vem com o núcleo. Este Makefile mais complexo se encontra no mesmo diretório onde estão armazenados os módulos do núcleo (/lib/modules/versao_do_nucleo/build) onde “versao_do_nucleo” é a versão atual do núcleo no sistema. No Makefile sugerido, a versão do núcleo é buscada através da ferramenta “uname” que serve para imprimir informações sobre o sistema, neste caso o parâmetro usado “-r” vai imprimir a versão do núcleo.

obj-m += ola.o
all:
    make -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
    make -C /lib/modules/`uname -r`/build M=`pwd` clean


   Finalmente é possível compilar o módulo com o comando “make”. Caso tudo esteja certo, será gerado o módulo com a extensão “.ko” (kernel object). Se as ferramentas do pacote “module-init-tools” estiverem instaladas, o módulo pode ser carregado com o comando “insmod ola.ko”, listado com “lsmod” e removido com “rmmod ola”. As mensagens de log podem ser verificadas com o comando “dmesg”.

2 comentários: