Probleem met eigen kernel module

Pagina: 1
Acties:

  • zezke
  • Registratie: September 2006
  • Laatst online: 28-11 23:26
Ik ben momenteel aan het proberen een eigen kernel module te schrijven die de interne speaker aanstuurt. Echter telkens als ik proberen te schrijven naar de /dev/speaker (die ik aangemaakt heb door mknod /dev/speaker c 120 0) zegt Bash Permission Denied, zowel als gewone gebruiker als als su. Ik heb geen idee waar de fout zit.

Ik heb momenteel het volgende c-bestand:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/major.h>
#include <linux/fs.h>
#include <asm/io.h>
#include <asm/uaccess.h> 

struct timer_list timer;

program_speaker(){ outb_p(182, 0x43); }            // stel de hardware juist in
speaker_on(){ outb_p(inb_p(0x61)| 3, 0x61);  }
speaker_off(){ outb_p(inb_p(0x61) & 0xFC, 0x61);  }
play_note(int divisor){ outb_p(divisor%256, 0x42); outb_p(divisor/256, 0x42); }
static void test(unsigned long);

static ssize_t read_speaker(struct file * file, char * buf, 
      size_t count, loff_t *ppos){     
   return 0;
}

static ssize_t write_speaker(struct file * file, const char * buf,
      size_t count, loff_t *ppos){
   printk("Writing to the speaker!\n");
   
   return count;
}

static int open_speaker(struct inode * inode, struct file * file){
   return 0;     
}

static int close_speaker(struct inode * inode, struct file * file){
   return 0;     
}

static struct file_operations speaker_fops = {
.read = read_speaker,
.write = write_speaker,
.open = open_speaker,
.release = close_speaker
};

static int hello_init(void){
    printk("Hello Kernel!\n");
    init_timer(&timer);
    timer.expires = jiffies + 1000;
    timer.function = test;
    add_timer(&timer);
    return 0;
}

static void test(unsigned long dummy){
    del_timer(&timer);
    printk("Timer is done!\n");
}

static int hello_exit(void){
    printk("Goodbye kernel!\n");
    return 0;
}

module_init(hello_init);
module_exit(hello_exit);


Vervolgens gebruik ik de volgende Makefile:

code:
1
2
3
4
5
6
7
8
obj-m += speaker.o

all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=$(PWD) modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=$(PWD) clean
    $(RM) Module.markers modules.order
.

De hello-kernel-, timer-done- en goodbye-kernelberichten verschijnen allemaal netjes in dmesg. Heeft iemand een idee wat ik fout doe? Als er trouwens iemand een goede bron heeft voor informatie over kernel modules creëren mag je dat ook altijd zeggen: google leverde namelijk bitter weinig hulp op.

Verwijderd

Misschien een stomme vraag maar wat zijn de rechten van het device /dev/speaker ?

[ Voor 27% gewijzigd door Verwijderd op 11-12-2009 19:25 ]


  • zezke
  • Registratie: September 2006
  • Laatst online: 28-11 23:26
Verwijderd schreef op vrijdag 11 december 2009 @ 19:23:
Misschien een stomme vraag maar wat zijn de rechten van het device /dev/speaker ?
Lol inderdaad ik was vergeten iedereen schrijfrechten te geven 8)7 Bedankt! Nu geeft hij wel de volgende error:

code:
1
bash: /dev/speaker: No such device or address


Maar ik zal hier morgen eens voor kijken.

  • serkoon
  • Registratie: April 2000
  • Niet online

serkoon

mekker.

Zo te zien registreer je nergens in je module de file-handlers voor het device.

  • zezke
  • Registratie: September 2006
  • Laatst online: 28-11 23:26
Idd gewoon rats vergeten dat dat ook nog moest. Excuses hiervoor, het is de eerste keer dat ik tracht een kernel module te schrijven. Bedankt iedereen!