Problema na insercao de modulo do kernel

Iniciado por bambamuergs, 12 de Fevereiro de 2008, 19:25

tópico anterior - próximo tópico

bambamuergs

??? ??? Buenas pessoal, estou comecando a estudar modulos para o kernel, testei uns "Hello World" e tudo OK, mas estou em um que da um bipe no pc speaker, esse eh o problema. O problema comeca na compilacao, uns 10 "warnings", depois quando vou inseri-lo no kernel do linux, que retorna o seguinte:

alan@alan-note:~/modulos/TutorialRafael/beep$ sudo insmod beep-speaker.ko
insmod: error inserting 'beep-speaker.ko': -1 Unknown symbol in module
alan@alan-note:~/modulos/TutorialRafael/beep$


Entao digito dmesg e lah no final tem o seguinte:

[ 5699.644987] beep_speaker: Unknown symbol cli
[ 5699.645046] beep_speaker: Unknown symbol restore_flags
[ 5699.645097] beep_speaker: Unknown symbol save_flags


O arquivo Makefile utilizado eh o seguinte:

obj-m += beep-speaker.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


O fonte eh beep-speaker.c (retirado de kernelnewbies, modificado por mim =P):

#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/system.h>      //add por causa das 3 funcoes: cli(), save_flags() e restore_flags()
#include <linux/delay.h>
#include <asm/string.h>
#include <asm/io.h>

#define SPEAKER_PORT 0x61
#define PORT 0xFC
#define HZ_MN1 0xff
#define HZ_MN2 0x42
#define __bad_udelay() "wrong"

static void kd_nosound(unsigned long ignored)
{
    /* acesssando port space */
    /* outb - saida em 8-bit */
    /* inb_p - entrada em 8-bit */
    outb(inb_p(SPEAKER_PORT) & PORT, SPEAKER_PORT);
    return;
}

static void kd_mksound(unsigned int hz, unsigned int ticks)
{
static struct timer_list sound_timer = {
function: kd_nosound
};
        unsigned int count = 0;
unsigned long flags;

        if (hz > 20 && hz < 32767)
        count = 1193180 / hz;
        save_flags(flags);       // salva as flags do processador para poder modifica-la
cli(); // desativa as interrupcoes
del_timer(&sound_timer);
        if (count)
        {
        outb_p(inb_p(SPEAKER_PORT) | 3, SPEAKER_PORT);
            outb_p(0xB6, 0x43);
    /* selecionar HZ desejado */
            outb_p(count & HZ_MN1, HZ_MN2);
            outb((count >> 8) & HZ_MN1, HZ_MN2);
            if (ticks)
            {
        sound_timer.expires = jiffies+ticks;
        add_timer(&sound_timer);
            }
}
else
        kd_nosound(0);
restore_flags(flags); // restaura as flags do processador para poder modifica-la
        return;
}

int init_module(void)
{
    printk(KERN_INFO "PC Speaker inicializando! \n");
    kd_mksound(494,120);
    mdelay(200);
    kd_mksound(1,140);
    mdelay(100);
    kd_mksound(330,120);
    mdelay(200);
    kd_mksound(1,120);
    mdelay(100);
    kd_mksound(415,120);
    mdelay(200);
    kd_mksound(1,120);
    mdelay(100);
    kd_mksound(494,120);
    mdelay(200);
    kd_mksound(1,120);
    mdelay(100);

    kd_mksound(0,0);
    return 0;
}

void cleanup_module(void)
{
printk(KERN_INFO "PC Speaker sendo finalizado! \n");[color=black][/color]
}

EXPORT_NO_SYMBOLS;
MODULE_AUTHOR("Guilherme Polo");
MODULE_LICENSE("GPL");


Alguem pode me ajudar? Não sei oq fazer para contornar este problema. Soh para constar, utilizo o kernel 2.6.22-14-generic.

[/color][/color]