标签:bool class 加载 代码 通过 编译 问题 安装 stat
1. Linux 内核的整体结构非常庞大,其包含的组件也非常多,使用这些组件的方法有两种:
① 直接编译进内核文件,即zImage或者bzImage(问题:占用内存过多)
② 动态添加
* 模块本身并不被编译进内核文件
* 根据需求,在内核运行期间动态安装或卸载
2. 内核模块动态安装与卸载
①安装 insmod
例:insmod /home/dnw_usb.ko
②卸载 rmmod
例:rmmod dnw_usb
③查看 lsmod
例: lsmod
3. 模块声明
① MODULE_LICENSE()
② MODULE_AUTHOR()
③ MODULE_DESCRIPTION()
④ MODULE_VERSION()
4. 模块参数
① 模块参数用于在加载模块时传递参数给模块
② 通过宏module_param指定保存模块参数的变量
module_param(name, type, perm)
* name:变量的名称
* type:变量类型。bool:布尔型,int:整型,charp:字符串型
* perm是访问权限。S_IRUGO:读权限,S_IWUSR:写权限
③ 简单示例
int a = 3; module_param(a, int, SIRUGO);
命令行:insmod xxx.ko a = 10
5. 符号导出
① 如果内核模块中的函数或者全局变量想让其他模块使用,必须进行导出
② 内核符号导出使用宏
EXPORT_SYMBOL(符号名)
EXPORT_SYMBOL_GPL(符号名)
注:其中EXPORT_SYMBOL_GPL只能用于包含GPL许可证的模块
6. 内核模块简单示例
① 模块代码:
#include <linux/init.h> #include <linux/module.h> static int hello_init() { printk(KERN_WARNING"Hello world initlizing\n"); return 0; } static void hello_exit() { printk(KERN_WARNING"Hello world exiting\n"); } module_init(hello_init); module_exit(hello_exit);
② Makefile:
obj-m := helloworld.o KDIR := /home/Linux/Kernal/linux-2.6.29 all: make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm clean: rm -f *.o *.ko *.order *.symvers
标签:bool class 加载 代码 通过 编译 问题 安装 stat
原文地址:https://www.cnblogs.com/wulei0630/p/9492577.html