【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.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

以上是 【Linux内核分析与应用】学习记录1内核模块的插入和删除 的全部内容, 来源链接: utcz.com/z/518733.html

回到顶部