Como criar o famoso Hello World no kernel?

Antes de ir em frente verifique se você possui os fontes do kernel devidamente instalado e configurado em sua máquina. Para detalhes veja o material de como compilar o seu kernel na sessão FAQ.

Módulo olamundo

shell> vi olamundo.c

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

static int __init olamundo_init(void)
{
        printk(KERN_DEBUG "Ola Mundo!\n");
        return 0;
}
static void __exit olamundo_exit(void)
{
        printk(KERN_DEBUG "Tchau!\n");
}

MODULE_AUTHOR("Nome do autor ");
MODULE_DESCRIPTION("Exibe a string Ola Mundo!");
MODULE_LICENSE("GPL");

module_init(olamundo_init);
module_exit(olamundo_exit);

Makefile

ATENÇÃO: Utilize a tecla TAB ao invés da tecla ESPAÇO para espaços

# Diretório de módulos do Kernel
KDIR := /lib/modules/$(shell uname -r)/build

# Objeto
obj-m = olamundo.o

# Regra default do Makefile
default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
        @rm -rf *.mod* Module.symvers *.o *~ *.markers *.order

# Limpando objetos e afins
clean:
        @rm -rf *~ *.o *.ko

Testando

  • Criando o diretório para testes:
  •         shell> mkdir meus-modulos

  • Copiando o módulo olamundo e o Makefile para o diretório meus-modulos
  •         shell> cp Makefile olamundo.c meus-modulos

  • Entrando no diretório meus-modulos
  •         shell> cd meus-modulos

  • Compilando
  •         shell> make

  • Carregando o módulo na memória
  •         shell>sudo insmod ./olamundo.ko

  • Exibindo a mensagem de Ola Mundo:
  •         shell> dmesg

  • Removendo o módulo da memória e exibindo a mensagem Tchau!
  •         shell>rmmod olamundo

  • Exibindo a mensagem Tchau:
  •         shell> dmesg

Descrição

O módulo olamundo define duas funções, uma para ser chamada quando o módulo é carregado no kernel (olamundo_init) e outra quando o módulo é removido do kernel (olamundo_exit). Note as macros __init e __exit explicitamente nas funções. As linhas module_init e module_exit são macros que indicam as funções que serão carregadas ao iniciar ou remover o módulo.

A macro MODULE_LICENSE é usada para informar a licença do módulo.

A função printk é similar a tradicional função em C printf e irá exibir as mensagens "Ola Mundo" e "Tchau"
A string KERN_DEBUG informa que as mensagens serão de debug.

Este módulo foi desenvolvido baseado na versão 2.6.X do kernel