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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月04日 10时09分18秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode题解(1378):使用唯一标识码替换员工ID(SQL)
2019-04-26
LeetCode题解(1384):按年度列出销售总额(SQL)
2019-04-26
LeetCode题解(1393):股票的资本损益(SQL)
2019-04-26
LeetCode题解(1398):购买了产品A和产品B却没有购买产品C的顾客(SQL)
2019-04-26
LeetCode题解(1407):排名靠前的旅行者(SQL)
2019-04-26
LeetCode题解(1412):查找成绩处于中游的学生(SQL)
2019-04-26
LeetCode题解(1421):净现值查询(SQL)
2019-04-26
LeetCode题解(1435):制作会话柱状图(SQL)
2019-04-26
LeetCode题解(1440):计算布尔表达式的值(SQL)
2019-04-26
文件服务器实现基本条件!
2019-04-26
文件服务器-活动目录的讨论
2019-04-26
文件服务器-活动目录的安装
2019-04-26
文件服务器-OU的概念!
2019-04-26
XP HOME 版本的 限制!
2019-04-26
VISTA版本!
2019-04-26
VMware GSX3.2 安装WINDOWS 2008!(1)
2019-04-26
VMware GSX3.2 安装WINDOWS 2008!(2)
2019-04-26
OE问题解决一例!
2019-04-26
利用LDIFDE,CSVDE 批量导出用户!
2019-04-26
ArcServer 无法正常启动,卸载IE7.0!
2019-04-26