写一个有依赖的Linux 内核模块
接上一篇 写一个 Linux内核 hello world 模块, 这次我们写2个内核模块 hello & world, 并且 world 模块依赖于 hello 模块.
hello 模块
源代码: hello.c
#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void)
{
pr_info("hello module is loaded\n");
return 0;
}
static void __exit hello_exit(void)
{
pr_info("hello module is unloaded\n");
}
void say_hello(void)
{
pr_info("hello ");
}
EXPORT_SYMBOL(say_hello);
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("free");
world 模块
源代码: world.c
#include <linux/module.h>
#include <linux/init.h>
void say_hello(void);
static int __init world_init(void)
{
pr_info("world module is loaded\n");
say_hello();
pr_info("world\n");
return 0;
}
static void __exit world_exit(void)
{
pr_info("world module is unloaded\n");
}
module_init(world_init);
module_exit(world_exit);
MODULE_LICENSE("free");
Makefile
源代码: Makefile. 缩进使用 tab
.
obj-m := world.o hello.o
KDIR := /lib/modules/`uname -r`/build/
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
编译模块
$ make
make -C /lib/modules/`uname -r`/build/ M=/home/supra/work/modules/deps modules
make[1]: Entering directory '/home/supra/work/jammy/jammy-Ubuntu-5.15.0-70.77-test'
CC [M] /home/supra/work/modules/deps/world.o
CC [M] /home/supra/work/modules/deps/hello.o
MODPOST /home/supra/work/modules/deps/Module.symvers
CC [M] /home/supra/work/modules/deps/hello.mod.o
LD [M] /home/supra/work/modules/deps/hello.ko
BTF [M] /home/supra/work/modules/deps/hello.ko
CC [M] /home/supra/work/modules/deps/world.mod.o
LD [M] /home/supra/work/modules/deps/world.ko
BTF [M] /home/supra/work/modules/deps/world.ko
make[1]: Leaving directory '/home/supra/work/jammy/jammy-Ubuntu-5.15.0-70.77-test'
加载模块
$ sudo insmod hello.ko
$ tail -n 1 /var/log/syslog
Jul 10 14:15:22 supra kernel: [ 3313.748762] hello module is loaded
$ sudo cat /proc/modules | grep hello
hello 16384 0 - Live 0xffffffffc0797000 (POE)
$ sudo insmod world.ko
$ tail -n 3 /var/log/syslog
Jul 10 14:19:22 supra kernel: [ 3553.077383] world module is loaded
Jul 10 14:19:22 supra kernel: [ 3553.077385] hello
Jul 10 14:19:22 supra kernel: [ 3553.077386] world
$ sudo cat /proc/modules | grep hello
hello 16384 1 world, Live 0xffffffffc0797000 (POE)
查看模块依赖
$ lsmod | grep hello
hello 16384 1 world
$ lsmod | grep world
world 16384 0
hello 16384 1 world
相反顺序卸载模块
$ sudo rmmod world.ko
$ sudo rmmod hello.ko
$ tail -n 2 /var/log/syslog
Jul 10 14:26:00 supra kernel: [ 3949.339943] world module is unloaded
Jul 10 14:26:05 supra kernel: [ 3954.185122] hello module is unloaded