Anda di halaman 1dari 2

Para exemplificar a interface do sistema operacional com o driver, vamos criar um "Hello Kernel".

O driver no faz nada de muito importante, s exibe uma mensagem quando carregado e outra quando descarregado. /*----------------------- cut here ---------------------------*/ #include <linux/init.h> #include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL") /* Evita reclamacoes de kernel */ staticint hellok(void) { printk(KERN_ALERT "Kello, Hernel! :]\n"); /* Coisas que fazem os drivers de dispositivos */ return0; }

staticvoid byek(void) { printk(KERN_ALERT "Bye, Kernel! :[\n"); }

module_init(hellok); module_exit(byek); /*----------------------- cut here ---------------------------*/

Dissecando o nosso mdulo (que no tem muito o que ser dissecado, na verdade), encontramos algumas coisas parecidas com programas normais, outras, nem tanto. A primeira coisa a ser notada so os arquivos de include: nada de stdio.h nem string.h. Entretanto, temos <linux/init.h> e <linux/module.h>. Esses dois cabealhos devem aparecer em todos os mdulos carregveis. <linux/module.h> tem muitas definies importantes e smbolos utilizados em mdulos e init.h disponibiliza module_init e module_exit, alm de outras coisas. Drivers geralmente utilizam muito mais includes, mas esses voc vai encontrar em qualquer um deles. Voc provavelmente deve ter percebido que no temos uma funo main(). Ao invs dela existem as chamadas macros module_init e module_exit, que recebe como parmetros, respectivamente, as funes de inicializao e de sada do mdulo. Quando o driver for carregado, ele chama a funo registrada por module_init e quando descarregar, a funo registrada em module_exit.

Para imprimir na tela, temos uma funo que engana. Parece muito a velha conhecida printf. No entanto, printk uma funo controlada unicamente pelo kernel, pois esse no pode depender de funes disponibilizadas por bibliotecas que podem no estar presentes no futuro (se utilizssemos printf, nosso mdulo dependeria da presena da libc, que muito provavelmente no estar disponvel). Outras caractersticas que diferem printk de printf (alm de trocar f por k): o argumento de urgncia (KERN_ALERT, que definida como <1>. Quanto maior o nmero entre <>, menor a prioridade. Dependendo do valor, a mensagem pode nem mesmo ser exibida) que vem antes da string que ser exibida. Outra que printk no suporta nmeros de ponto flutuante (float). A diferena mais importante de um mdulo para um programa comum que mdulos so orientados ao evento. Em outras palavras, enquanto o seu programa favorito abre, executa o que tem que executar e depois sai, um mdulo carregado no kernel informando o que sabe fazer e com quem. Depois disso no faz mais nada. Fica l, parado, junto com um monte de mdulos, esperando ordens que podem aparecer ou no. Para compilar esse mdulo necessrio um pouco mais de trabalho. Primeiramente, para kernels da verso 2.6.x, voc vai precisar dos fontes do kernel instalados e compilados. Em verses 2.4.x, apenas os headers do kernel eram necessrios. Vai ser necessrio criar um makefile um pouco diferente dos padres para que a compilao funcione. O kernel tem seu prprio 'jeitinho' de utilizar makefiles, chamado kbuild. Por hora, nosso Makefile vai se parecer com isso
# ----------------------- cut here ---------------------------obj-m := hellokernel.o # ----------------------- cut here ----------------------------

Esse makefile deve estar no mesmo diretrio do cdigo do seu mdulo. Compile-o da seguinte forma:
make -C /caminho/do/fonte/linux M=`pwd` modules

(Digite esse comando dentro da pasta que est o seu makefile e o seu mdulo) No final, voc vai ter um arquivo do formato hellokernel.ko. Carregue o mdulo utilizando o comando insmod hellokernel.ko, e o descarregue com rmmod hellokernel.ko. Se tudo correu bem, o driver vai exibir as respectivas mensagens que programamos.

Anda mungkin juga menyukai