/* * server.c * * Kernel module que realiza a comunicacao entre modulos * * Para compreender melhor este modulo, voce tem que ter uma rapida visao * de como funciona a "The Kernel Symbol Table" * Esta tabela contem enderecos de funcoes e variaveis globais do kernel. * Quando roda-se o comando insmod os "undefined symbols" sao resolvidos contra * a tabela de simbolos publicos do kernel. Esta tabela pode ser acessada atraves do * arquivo /proc/ksyms * * Quando um novo modulo e carregado, qualquer simbolo exportado pelo mesmo torna-se * parte desta tabela, e voce podera ver o simbolo em /proc/ksyms, ou atraves da saida * do comando ksyms * Como isto funciona: * Um arquivo objeto ELF consiste de varias secoes. Algumas sao partes basicas do arquivo * objeto. Mas podem ser adicionadas outras secoes que voce queira para ser usada por * programas especiais. Em kernel modules que explicitamente exporta simbolos sao adicionadas * algumas secoes como por exemplo __ksymtab and .kstrtab * Para ver as secoes de um arquivo objeto use o comando objdump modulo.o --section-headers * Neste modulo podemos assim ver o conteudo de .kstrtab * objdump servidor.o --full-contents --section=.kstrtab * * servidor.o: file format elf32-i386 * * Contents of section .kstrtab: * 0000 74657374 655f5238 61313664 64616500 teste_R8a16ddae. * * Aqui temos entao o nosso simbolo exportado teste. * Pode se utilizar o comando modinfo para interpretar o conteudo da secao .modinfo * Mais detalhes man modinfo. * Deste modo o kernel sabe quais funcoes ou variaveis do modulo sao exportadas. * * O kernel ainda usa um sistema de versoes. Deste modo, e atachado uma versao em * todos os simbolos exportados. Estas versoes sao calculadas atraves do comando genksyms * Olhe o Makefile. * Mais detalhes : man genksyms * * Se voce quiser que nao seje exportado nenhum simbolo do seu modulo, use * a macro "EXPORT_NO_SYMBOLS" * Para exportar um simbolo use a macro "EXPORT_SYMBOL" * * Deste modo, podemos inserir nossos modulos que exportam simbolos que serao usados * por modulos que serao inseridos depois, como uma pilha * * No nosso exemplo, segue esta ordem : * * insmod servidor.o * insmod cliente.o * * rmmod cliente * rmmod servidor * * OBS: como uma _pilha_ * * Qualquer sugestao, comentario ou erro: mail thobias@cos.ufrj.br * 10/01/2002 */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/config.h> #include <linux/sched.h> #include <linux/init.h> #include <linux/modversions.h> #include "servidor.ver" //arquivo gerado pelo genksyms que contem informacoes sobre versao #define MODVERSIONS #ifndef EXPORT_SYMTAB # define EXPORT_SYMTAB /* necessario para exportar symbols */ #endif int teste(void); int teste(void) { printk(KERN_ALERT "Fui chamado! hip hip...\n"); return 10; } int servidor_inter_init_module(void) { printk(KERN_ALERT "Hello\n"); return 0; } void servidor_inter_cleanup_module(void) { printk(KERN_ALERT "Goodbye !!\n"); } module_init(servidor_inter_init_module); module_exit(servidor_inter_cleanup_module); EXPORT_SYMBOL (teste); MODULE_AUTHOR("Thobias Salazar Trevisan"); MODULE_DESCRIPTION("Inercomunicacao entre modulos, modulo que exporta a funcao teste"); MODULE_LICENSE("GPL");