Linux内核模块编程系列1

1.准备工作

使用如下命令查看自己Linux的内核版本

uname -a

结果如下:

Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux

安装内核模块需要的头文件:

apt-get install build-essential linux-headers-`uname -r`

使用如下命令查看系统模块

cat /proc/modules

结果如下:

xt_nat 16384 0 - Live 0xffffffffc06f3000
veth 16384 0 - Live 0xffffffffc068e000
fuse 98304 0 - Live 0xffffffffc085a000
btrfs 1060864 0 - Live 0xffffffffc072f000
xor 24576 1 btrfs, Live 0xffffffffc0728000
raid6_pq 110592 1 btrfs, Live 0xffffffffc070c000

其中以第一行为例

xt_nat 16384 0 - Live 0xffffffffc06f3000
模块名 模块内存大小 被load的次数 是否依赖第三方moudle,-表示不依赖 模块状态 模块当前的内核内存偏移位置

也可以使用如下命令查看已加载的系统模块

lsmod

结果如下:

Module                  Size  Used by
xt_nat                 16384  0
veth                   16384  0
fuse                   98304  0
btrfs                1060864  0
xor                    24576  1 btrfs
raid6_pq              110592  1 btrfs

使用命令modprobe 加载模块,rmmod卸载模块

2.极简模块

代码如下,保存文件为hello.c,完整代码见code

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“Zhang”);
MODULE_DESCRIPTION(“A simple example Linux module.);
MODULE_VERSION(0.1);
static int __init lkm_example_init(void) {
    printk(KERN_INFO “Hello, World!\n”);
    return 0;
}
static void __exit lkm_example_exit(void) {
    printk(KERN_INFO “Goodbye, World!\n”);
}
module_init(lkm_example_init);
module_exit(lkm_example_exit);

我们不能直接用gcc进行编译,需要使用make进行编译,完整代码见Makefile,Makefile内容如下:

obj-m += hello.o  
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

注意Makefile中每行的开头要使用tab而不是空格

下一篇文章Linux内核模块编程系列2
参考资料:

猜你喜欢

转载自blog.csdn.net/zhangpeterx/article/details/83890891