Linux内核设备驱动之Linux内核模块加载机制笔记整理
#include
1.模块参数
在驱动定义变量
staticintnum=0;//当加载模块不指定num的值时则为0
- module_param(变量名,类型,权限);类型:byte,int,uint,short,ushort,long,ulong,bool,charp,权限不能有写的权限
- 传参数:insmodtest.ko变量名1=值1 变量名2=值2
module_param的调用关系如下:
#definemodule_param(name,type,perm)\ module_param_named(name,name,type,perm) #definemodule_param_named(name,value,type,perm)\ param_check_##type(name,&(value));\ module_param_call(name,param_set_##type,param_get_##type,&value,perm);\ __MODULE_PARM_TYPE(name,#type) #definemodule_param_call(name,set,get,arg,perm)\ __module_param_call(MODULE_PARAM_PREFIX,\ name,set,get,arg,\ __same_type(*(arg),bool),perm) #define__module_param_call(prefix,name,set,get,arg,isbool,perm)\ staticint__param_perm_check_##name__attribute__((unused))=\ BUILD_BUG_ON_ZERO((perm)<0||(perm)>0777||((perm)&2))\ +BUILD_BUG_ON_ZERO(sizeof(""prefix)>MAX_PARAM_PREFIX_LEN);\ staticconstchar__param_str_##name[]=prefix#name;\ staticstructkernel_param__moduleparam_const__param_##name\ __used\ __attribute__((unused,__section__("__param"),aligned(sizeof(void*))))\ ={__param_str_##name,perm,isbool?KPARAM_ISBOOL:0,\ set,get,{arg}}
多个c文件编成一个模块,可以使用xxx-objs这个Makefile中的指令来实现,如下:
test-objs:=a.ob.o//由a.c,b.c编成test.ko,注意不能有.o文件与目标ko文件同名 obj-m+=test.o
可在/sys/module/模块名/下查看模块在系统的信息
1.查看elf文件的信息
readelftest.ko-a
ko文件组成
- 1.elf文件头
- 2.textdata...
- 3.sectionstable
- 4.symboltable
2.EXPORT_SYMBOL(函数名/变量的地址)//把函数/或者变量的地址导出到内核的符号表中
EXPORT_SYMBOL_GPL(函数名) ///////////
/proc/kallsyms查看当前系统的符号表
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。