首先编写一个简单的内核模块代码 helloworld.c
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
static int __init lkm_init(void)
{
printk("Hello world\n");
return 0;
}
static void __exit lkm_exit(void)
{
printk("Goodbye\n");
}
module_init(lkm_init);
module_exit(lkm_exit);
MODULE_LICENSE("GPL");
然后编写Makefile文件,注意tab键
obj-m:=helloworld.o
CURRENT_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# make
make -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 | head
Module 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
来源:oschina
链接:https://my.oschina.net/u/3211934/blog/4437358