最近需要开发一些内核模块,进行探究linux内核的一些特征,现在把一些遇到的比较好的文章和知识点,进行简要记录和备忘;
内核模块开发相关链接:
- https://www.thegeekstuff.com/2013/07/write-linux-kernel-module/ 入门教程;insmod, rmmod, modinfo等相关命令;
- https://www.thegeekstuff.com/2010/08/make-utility/ make 工具使用教程;
- https://www.thegeekstuff.com/2010/11/modprobe-command-examples/ modprobe 命令的使用方法;
- https://blog.sourcerer.io/writing-a-simple-linux-kernel-module-d9dc3762c234 写一个简单的字符设备内核模块;源代码
- https://www.cnblogs.com/klb561/p/9192630.html linux 内核编译与模块编译;(内核编译命令)
- https://www.cnblogs.com/1477717815fuming/p/7581941.html 比较好的内核编译文章 (每一步骤都进行了截图,可以借鉴)
- http://www.tldp.org/LDP/lkmpg/2.6/html/index.html 一套比较好的linux 内核模块参考书籍;PDF
- https://developer.ibm.com/technologies/linux/articles/l-kernel-memory-access/ Linux内存模型讲解和Linux访问userspace内存API讲解;
内核模块开发过程遇到的知识点:
- make命令,会隐士调用cc -c 命令,生成.o文件;所以在内核模块的makefile中,可以直接写上: obj-m += hello_mod.o
- 内核模块可以进行传参:insmod module.ko [param1=value param2=value ...]
- 内核模块只能访问内核导出的函数和变量;EXPORT_SYMBOL(my_variable);
- 想要熟悉内核模块编程,写一个linux设备驱动程序是比较好的学习方法;
- 在进行开发linux内核模块的时候,最好下载对应版本的linux内核代码,使用source insight或者vscode工具进行打开进行参考;因为经常内核中的API会改变;你参考别人的针对其他版本开发的代码,编译不通过;
- 内核模块和内核公用一个地址空间,可以使用所有模块导出的符号表;我们可以使用内存拷贝函数,把用户空间中的一些代码段,拷贝到内核态来完成。
最简单的内核模块编译示例:
//必要的头文件 #include <linux/module.h> // included for all kernel modules #include <linux/kernel.h> // include for KERN_INFO #include <linux/init.h> // include for __init and __exit macros //模块许可证声明(必须) MODULE_LICENSE("Dual BSD/GPL"); // 通常使用BSD 和 GPL 双协议 //声明模块的作者(可选) MODULE_AUTHOR("Yaowen Xu"); MODULE_AUTHOR("YaoXu"); MODULE_DESCRIPTION("This is a simple example!"); MODULE_ALIAS("A simplest example"); //模块加载函数(必须) static int hello_init(void) { printk(KERN_ALERT "Hello World enter/n"); return 0; } //模块卸载函数(必须) static void hello_exit(void) { printk(KERN_ALERT "Hello World exit/n"); } //模块的注册 module_init(hello_init); module_exit(hello_exit);
obj-m += hello_mod.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
编译前需要安装必要编译工具和所需要的文件:
apt-get install build-essential linux-headers-$(uname -r)
保持更新,转载请注明出处;更多内容请关注cnblogs.com/xuyaowen; 如果对您有帮助,请点击推荐~!