Linux内核的学习(二)
linux的驱动模块的参数
大家在学习C语言时,应该学过在运行C程序时,给模块里面的变量定义具体的值,内核是怎么实现的呢。
方法如下:
#include <linux/moduleparam.h> static int num = 0; //当加载模块不指定num的值为0 module_param(变量名,类型,权限)// 类型有 byte, int , uint ,short ,ushort,long ulong ,bool ,charp //权限:其它用户所占的权限里不能有写的权限 module_param(num, int ,0644); // insmod test.ko 变量名 = 值 编译成KO文件后,可用modinfo查看到模块参数的信息
Linux怎么定义全局变量(函数),驱动模块里默认情况下不管函数还是全局变量都是局部使用(相当于在函数/变量名前加了 “static”),要作为全局使用,需要使用导出符号“EXPORT_SYMBOL(函数名/变量)”,声明函数/变量作全局使用。
myfunc.c:
#include <linux/init.h> #include <linux/module.h> void myfunc(char *str) { printk("in myfunc:%s\n"); } EXPORT_SYMBOL(myfunc); MODULE_LICENSE("GPL");
test.c
#include <linux/init.h> #include <linux/module.h> extern void myfunc(char *); static int __init myinit(void) { myfunc("test init"); return 0; } static void __exit myexit(void) { myfunc("test exit"); } module_init(myinit); module_exit(myexit); MODULE_LICENSE("GPL");
//需注意加载驱动模块的顺序, 如果myfunc驱动模块不先加载,则test模块会加载不成功.
查看elf文件的信息
readelf test.ko -a