【Linux 内核分析与应用】学习记录1-内核模块的插入和删除

蓝咒 提交于 2020-08-06 21:07:53

首先编写一个简单的内核模块代码 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!