Linux内核模块编程系列1-极简内核模块编写
发布日期:2022-03-18 18:19:17 浏览次数:3 分类:技术文章

本文共 2155 字,大约阅读时间需要 7 分钟。

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 0xffffffffc06f3000veth 16384 0 - Live 0xffffffffc068e000fuse 98304 0 - Live 0xffffffffc085a000btrfs 1060864 0 - Live 0xffffffffc072f000xor 24576 1 btrfs, Live 0xffffffffc0728000raid6_pq 110592 1 btrfs, Live 0xffffffffc070c000

其中以第一行为例

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

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

lsmod

结果如下:

Module                  Size  Used byxt_nat                 16384  0veth                   16384  0fuse                   98304  0btrfs                1060864  0xor                    24576  1 btrfsraid6_pq              110592  1 btrfs

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

2.极简模块

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

#include 
#include
#include
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内容如下:

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

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

3.运行

运行如下命令来取得hello.c和Makefile文件:

git clone https://github.com/zhang0peter/linux-kernel.gitcd linux-kernel/1.kernel-module/

进行编译:

make

运行结果如下:

make -C /lib/modules/4.9.0-6-amd64/build M=/root/linux-kernel/1.kernel-module modulesmake[1]: Entering directory '/usr/src/linux-headers-4.9.0-6-amd64'  Building modules, stage 2.  MODPOST 1 modulesmake[1]: Leaving directory '/usr/src/linux-headers-4.9.0-6-amd64'

此目录下会多出hello.ko文件,然后安装内核模块:

dmesg -Cinsmod hello.kolsmod | grep hello

运行结果如下:

hello                  16384  0

卸载内核模块:

rmmod hello.kodmesg

运行结果如下:

[10416680.668761] Hello, World![10416720.646996] Goodbye, World!

下一篇文章

转载地址:https://zhang0peter.blog.csdn.net/article/details/83890891 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:手把手教你学Kotlin (2):task1-6 函数,Java to Kotlin Convert,(持续更新中)
下一篇:Linux在shell终端中清空DNS缓存,刷新DNS的方法(ubuntu,debian)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月04日 10时09分18秒