前言
Linux 系统为应用程序提供了功能强大且容易扩展的 API,但在某些情况下,这还远远不够。与硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块。下面从 Hello World 模块来说明模块的建立与运行。
环境搭建
开始编写Linux内核模块之前,我们首先要准备一些工具。最重要的是,你需要有一台Linux机器,尽管可以使用任何Linux发行版,但本文中,我使用的是Ubuntu 16.04 LTS,如果你使用的其他发行版,可能需要稍微调整安装命令。
建立
1、创建目录
mkdir -p ~/src/lkm_example
-p 确保目录名称存在,不存在的就建一个
2、跳转到模块目录下
cd ~/src/lkm_example
3、创建模块文本
touch lkm_example.c
4、编写文本
vi lkm_example.c
5、文本内容
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
模块分析
hello_init():模块加载
hello_exit():模块卸载
module_init(hello_init): hello_init 函数为模块加载角色
module_init(hello_exit):hello_exit 函数为模块卸载角色
printk():与 printf() 相似
MODULE_LICENSE:Hello Would 模块带有自由的许可证
KERN_ALERT:消息的优先级
编译
1、在当前目录下创建 Makefile 文件
touch Makefile
2、编写 Makefile 文件
vim Makefile
3、Makefile 文件内容
obj-m += lkm_example.o
all:
make -C /lib/modules/$ (shell uname -r)/build M=$ (PWD) modules
clean:
make -C /lib/modules/$ (shell uname -r)/build M=$ (PWD) clean
obj-m表示把文件lkm_example.o作为"模块"进行编译,生成一个独立的 “lkm_example.o” 文件但不会编译到内核
运行
1、make 指令
make
在当前目录下找 Makefile 或 makefile
2、将 Hello World 模块加载到内核
sudo insmod lkm_example.ko
3、查询内核日志输出 printk 结果
sudo dmsge
内核日志输出结果
4、检查内核当前加载模块
lsmod
5、将 Hello World 模块从内核卸载
sudo rmmod lkm_example
6、查询内核日志输出 printk 结果
sudo dmsge
内核日志输出结果
7、检查内核当前加载模块
lsmod
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)