Linux内核模块
目录
1.概念
为什么 Linux内核要引用模块的机制?
Linux内核采用宏内核架构,即操作系统的绝大部分功能都在内核中实现,并且都在内核空间(特权模式)下运行;而与之相反的另一种流行的架构是微内核架构,它把操作系统最基本的功能放入内核中,而其他大部分的功能(如设备驱动等)都放到非特权模式下,这种架构具有很好的动态扩展性,即在内核运行时加载一组目标代码来实现某个特定的功能。
2.模块编写
2.1 模块三要素:注册入口函数,出口函数,GPL声明
#include <linux/init.h>
3 #include <linux/module.h>
4
5
6 static int __init my_test_init(void)
7 {
8 printk("my first kernel module init\n");
9 return 0;
10 }
11
12 static void _init my_test_exit(void)
13 {
14 printk("Bye Bye\n");
15 }
16
17
18 module_init(my_test_init);
19 module_exit(my_test_exit);
20
21 MODULE_LICENSE("GPL");
22 MODULE_AUTHOR("HEHE");
23 MODULE_DESCRIPTION("my test kernel module");
24 MODULE_ALIAS("my test");
3.模块编译
3.1静态编译
将模块直接编译进内核,与内核形成一个整体运行,生命周期从内核启动开始到内核运行结束.
3.2动态编译
以模块的形式编译,在内核运行以后,通过命令加载到内核里,和内核一起运行,通过卸载命令卸载模块.
3.3内部编译
在内核源码树中编译
3.4外部编译
在内核源码目录外编译
内核关于构建外部模块的说明文档:
/kernel-x.x.xx/Documentation/kbuild/module.txt
make -C /lib/modules/`uname -r`/build M=$PWD modules
-C:执行指定路径下的Makefile
M :指定当前路径
uname -r :显示当前内核版本号
命令置换:tab键上面的按键,` `
Makefile的编写:
然后Make进行测试.c的编译:
第一行是路径替换,第二行是进入内核的Makefile进行编译,第三行GCC将当前的demo.c编译生成demo.o
第四行根据demo.o构建模块,最终生成了demo.ko
4.模块使用
4.1 加载内核模块
sudo insmod ***.ko
4.2查看内核消息日志命令
dmesg
sudo dmesg -c //删除之前的日志消息
4.3卸载内核模块
rmmod
sudo rmmod 内核模块名不包括扩展名
sudo rmmod demo
4.4内核模块声明
MODULE_AUTHOR(_author)
MODULE_DESCRIPTION(_description)
modinfo demo.ko 可以查看模块的信息,描述 作者,等