Mutex
Topics in this section,
# |
Version |
---|---|
Freebsd |
14.1.0 |
In this program, you are going to learn
How to use mutex in kernel module ?
1#include<sys/param.h>
2#include<sys/kernel.h>
3#include<sys/module.h>
4#include<sys/systm.h>
5#include<sys/mutex.h>
6
7static struct mtx lock;
8
9static int count = 0;
10
11static void increment_counter(void)
12{
13 mtx_lock(&lock);
14 printf("Count = %d\n",count);
15 count++;
16 mtx_unlock(&lock);
17}
18
19static int event_handler(struct module *module, int event, void *arg)
20{
21 int e = 0;
22
23 switch(event)
24 {
25 case MOD_LOAD:
26 printf("Module loaded\n");
27 mtx_init(&lock, "my_mutex", NULL, MTX_DEF | MTX_NOWITNESS);
28
29 increment_counter();
30 increment_counter();
31 break;
32 case MOD_UNLOAD:
33 printf("Module unloaded\n");
34 mtx_destroy(&lock);
35 break;
36
37 default:
38 e = EOPNOTSUPP;
39 break;
40 }
41return(e);
42}
43
44static moduledata_t mutex_data = {
45 "mutex_module",
46 event_handler,
47 NULL
48};
49
50DECLARE_MODULE(mutex_module, mutex_data, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
51
52
1SRCS=mutex.c
2KMOD=mutex_module
3
4.include <bsd.kmod.mk>
1$ pwd
2basic_device_drivers/mutex
3
4
5$ ls
6mutex.c Makefile
7
8
9$ make
10
11
12$ ls
13.depend.mutex.o export_syms machine mutex.o opt_global.h
14Makefile i386 mutex.c mutex_module.ko x86
Load the module using kldload
1$ kldload -v ./mutex_module.ko
2Loaded ./mutex_module.ko, id=8
Run kldstat command to check the loaded modules
1$ kldstat
2Id Refs Address Size Name
3 1 29 0xffffffff80200000 1f6c698 kernel
4 2 1 0xffffffff8216d000 772c70 zfs.ko
5 3 1 0xffffffff828e1000 7850 cryptodev.ko
6 4 1 0xffffffff83218000 3220 intpm.ko
7 5 1 0xffffffff8321c000 2178 smbus.ko
8 6 1 0xffffffff8321f000 3360 uhid.ko
9 7 1 0xffffffff83223000 3360 wmt.ko
10 8 1 0xffffffff83227000 20d4 mutex_module.ko
Run dmesg command to check the kernel logs
1$ dmesg
2Module loaded
3Count = 0
4Count = 1
Unload the module using kldunload
1$ kldunload -v ./mutex_module.ko
2Unloading mutex_module.ko, id=8
Run kldstat command to check the loaded modules
1$ kldstat
2Id Refs Address Size Name
3 1 27 0xffffffff80200000 1f6c698 kernel
4 2 1 0xffffffff8216d000 772c70 zfs.ko
5 3 1 0xffffffff828e1000 7850 cryptodev.ko
6 4 1 0xffffffff83218000 3220 intpm.ko
7 5 1 0xffffffff8321c000 2178 smbus.ko
8 6 1 0xffffffff8321f000 3360 uhid.ko
9 7 1 0xffffffff83223000 3360 wmt.ko
Run dmesg command to check the kernel logs
1$ dmesg
2Module loaded
3Count = 0
4Count = 1
5Module unloaded