一、什么是内核模块
内核模块:ko模块(Kernel Object Module)是Linux内核中的可加载模块,它可以动态地向内核添加功能。在运行时,可以通过加载或卸载ko模块来扩展或减少内核功能。ko模块通常包含驱动程序、文件系统、网络协议栈、安全模块等内核功能。内核开发人员可以通过编写ko模块来扩展或改进内核功能。
我们可以通过编写内核模块扩展内核功能,添加新的驱动程序或文件系统,或者修改内核的行为,而不需要重新编译整个内核。
二、编写内核模块的基本步骤:
编写模块代码:包括初始化和清除函数,以及其他需要的函数。
编写Makefile文件:定义编译模块的规则,指定编译器和编译选项等。
编译模块:使用make命令编译模块,生成ko文件。
加载模块:使用insmod命令加载模块。
卸载模块:使用rmmod命令卸载模块。
查看模块信息:使用modinfo命令查看模块的信息,包括作者、版本、描述等。
三、KO模块开发示例代码:
#include //头文件信息
#include static int __init hello_init(void) //初始化函数
{printk(KERN_INFO "Hello, world!\n");return 0;
}static void __exit hello_exit(void) //清理函数
{printk(KERN_INFO "Goodbye, world!\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL"); //表明该模块的源代码使用 GPL 许可证,可以在 GPL 许可证下被复制、修改和重新发布。如果模块没有正确声明许可证,那么它将被认为是专有软件,从而可能违反 GPL 许可证的条款。
MODULE_AUTHOR("xiaoming"); //作者信息
MODULE_DESCRIPTION("A simple security driver"); //内核模块描述
三、KO模块开发Makefile:
ko模块是通过make命令进行编译,因此我们需要编写对应的Makefile文件,定义编译模块的规则,指定编译器和编译选项等。
obj-m := security_md.o #内核模块名字,即生成security_md.kosecurity_md-objs := security.o sha.o aes.o #该security_md.ko涉及到的c源码,即security.c sha.c aes.cKDIR := /lib/modules/$(shell uname -r)/build #指向当前系统正在运行的内核的源代码目录PWD := $(shell pwd) #当前路径all:make -C $(KDIR ) M=$(PWD) modulesclean:make -C $(KDIR ) M=$(PWD) clean
命令:make
四、KO模块开发注意事项:
熟悉Linux内核的数据结构和API:内核模块需要使用Linux内核提供的数据结构和API,因此需要熟悉Linux内核的结构和编程接口。
避免使用标准C库:内核模块运行在内核空间,不能直接使用标准C库的函数,需要使用内核提供的函数来替代。
避免使用动态内存分配:内核模块需要分配内存来存储数据,但是不能使用标准C库的动态内存分配函数,因为它们会导致内核死锁或崩溃。内核提供了自己的内存分配器和管理机制。
谨慎使用全局变量:内核模块运行在内核空间,访问全局变量可能会影响整个系统的稳定性和安全性,需要谨慎使用。
编写安全的代码:内核模块运行在内核空间,具有很高的特权级别,必须编写安全的代码,避免因为漏洞或错误导致系统崩溃或被攻击。