【Linux内核分析与应用】学习记录1内核模块的插入和删除
首先编写一个简单的内核模块代码 helloworld.c
# include <linux/init.h># include <linux/kernel.h>
# include <linux/module.h>
static int __init lkm_init(void)
{
printk("Hello world
");
return 0;
}
static void __exit lkm_exit(void)
{
printk("Goodbye
");
}
module_init(lkm_init);
module_exit(lkm_exit);
MODULE_LICENSE("GPL");
然后编写Makefile文件,注意tab键
obj-m:=helloworld.oCURRENT_PATH:=$(shell pwd)
LINUX_KERNEL:=$(shell uname -r)
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
这样就可以开始编译了
root@ubuntu:~/my-linux/1# makemake -C /usr/src/linux-headers-4.15.0-109-generic M=/root/my-linux/1 modules
make[1]: Entering directory "/usr/src/linux-headers-4.15.0-109-generic"
CC [M] /root/my-linux/1/helloworld.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/my-linux/1/helloworld.mod.o
LD [M] /root/my-linux/1/helloworld.ko
make[1]: Leaving directory "/usr/src/linux-headers-4.15.0-109-generic"
编译完成后开始加载内核ko文件,注意这一步需要root权限
root@ubuntu:~/my-linux/1# insmod helloworld.ko
可以通过dmsg查看内核日志来验证加载成功
dmesg...
[1155722.072492] Hello world
也可以通过lsmod查看我们的模块已经在列表中了
root@ubuntu:~/my-linux/1# lsmod | headModule Size Used by
helloworld 16384 0
sctp_diag 16384 0
sctp 311296 51 sctp_diag
dccp_diag 16384 0
dccp 73728 1 dccp_diag
tcp_diag 16384 0
udp_diag 16384 0
inet_diag 24576 4 tcp_diag,sctp_diag,udp_diag,dccp_diag
unix_diag 16384 0
最后卸载模块
root@ubuntu:~/my-linux/1# rmmod helloworld
在demsg中也能看到退出的日志
dmesg...
[1155722.072492] Hello world
[1155774.216982] Goodbye
以上是 【Linux内核分析与应用】学习记录1内核模块的插入和删除 的全部内容, 来源链接: utcz.com/z/518733.html