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:
Vervolgens gebruik ik de volgende Makefile:
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.
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.