版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux驱动
Linux内核模块的优点与缺点优点使得内核更加紧凑和灵活修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可模块的目标代码一旦被链接到内核,它的作用域和静态链接的内核目标代码完全等价缺点由于内核所占用的内存是不会被换出的,所以链接进内核的模块会给整个系统带来一定的性能和内存利用方面的损失;装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装入和卸载模块时修改符号表;模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性.Linux内核模块与应用程序的区别C语言程序Linux内核模块运行用户空间内核空间入口main()module_init()指定;出口无module_exit()指定;
编译gcc–cMakefile连接ldinsmod运行直接运行insmod调试gdbkdbug,kdb,kgdb等模块相关命令
insmod<module.ko>[moduleparameters]Loadthemodule注意,只有超级用户才能使用这个命令RmmodUnloadthemodulelsmodListallmodulesloadedintothekernel这个命令和cat/proc/modules等价modprobe[-r]<modulename>–Loadthemodulespecifiedandmodulesitdepends模块依赖一个模块A引用另一个模块B所导出的符号,我们就说模块B被模块A引用。如果要装载模块A,必须先要装载模块B。否则,模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块间的相互关系就叫做模块依赖。最简单的内核模块例子#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>staticint__inithello_init(void){ printk(KERN_INFO"Helloworld\n"); return0;}staticvoid__exithello_exit(void){ printk(KERN_INFO"Goodbyeworld\n");}module_init(hello_init);module_exit(hello_exit);staticint__inithello_init(void)staticvoid__exithello_exit(void)Static声明,因为这种函数在特定文件之外没有其它意义__init标记,该函数只在初始化期间使用。模块装载后,将该函数占用的内存空间释放__exit标记该代码仅用于模块卸载。Init/exit宏:module_init/module_exit声明模块初始化及清除函数所在的位置装载和卸载模块时,内核可以自动找到相应的函数
module_init(hello_init); module_exit(hello_exit);编译内核模块Makefile文件obj-m:=hello.oall:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)modulesclean:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)cleanModuleincludesmorefilesobj-m:=hello.ohello-objs:=a.ob.o装载和卸载模块相关命令lsmodinsmodhello.kormmodhello.ko模块参数传递有些模块需要传递一些参数参数在模块加载时传递
#insmodhello.kotest=2参数需要使用module_param宏来声明
module_param的参数:变量名称,类型以及访问许可掩码支持的参数类型Byte,short,ushort,int,uint,long,ulong,bool,charpArray(module_param_array(name,type,nump,perm))#include<linux/kernel.h>#include<linux/module.h>#include<linux/init.h>#include<linux/moduleparam.h>staticinttest;module_param(test,int,0644);staticint__inithello_init(void){ printk(KERN_INFO“Helloworldtest=%d\n”,test); return0;}staticvoid__exithello_exit(void){ printk(KERN_INFO"Goodbyeworld\n");}MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Test");MODULE_AUTHOR("xxx");module_init(hello_init);module_exit(hello_exit);导出符号表如果一个模块需要向其他模块导出符号(方法或全局变量),需要使用:
EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); *注意:符号必须在模块文件的全局部分导出,不能在函数部分导出。更多信息可参考<linux/module.h>文件Modules仅可以使用由Kernel或者其他Modules导出的符号不能使用Libc/proc/kallsyms可以显示所有导出的符号内核模块操作/proc文件/proc文件系统,这是内核模块和系统交互的两种主要方式之一。/proc文件系统也是Linux操作系统的特色之一。/proc文件系统不是普通意义上的文件系统,它是一个伪文件系统。通过/proc,可以用标准Unix系统调用(比如open()、read()、write()、ioctl()等等)访问进程地址空间可以用cat、more等命令查看/proc文件中的信息。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。当调试程序或者试图获取指定进程状态的时候,/proc文件系统将是你强有力的支持者。通过它可以创建更强大的工具,获取更多信息。/proc相关函数create_proc_entry()
创建一个文件proc_symlink()
创建符号链接proc_mknod()
创建设备文件proc_mkdir()
创建目录remove_proc_entry()
删除文件或目录Linux2.6内核中有关模块部分的改变模块引用计数器
Linux2.4中在linux/module.h中定义了三个宏来维护实用计数:
__MOD_INC_USE_COUNT
当前模块计数加一
__MOD_DEC_USE_COUNT
当前模块计数减一
__MOD_IN_USE
计数非0时返回真
在Linux2.6中,模块引用计数器由系统自动维护,所以程序中有关这些宏都可以注释掉。
关于符号导出列表(listofexportedsymbols)
Linux2.4中会用EXPORT_NO_SYMBOLS宏,来表示不想导出任何变量或函数。 在Linux2.6中这个宏也已经消失。系统默认为不导出任何变量或函数。
模块程序编译方法的改变
Linux2.4中命令为:
gcc–Wall–DMODULE–D__KERNEL__-DLINUX–c源文件名.c
其中:
__KERNEL__:
即告诉头文件这些代码将在内核模式下运行
MODULE:
即告诉头文件要给出适当的内核模块的定义
LINUX:
并非必要
-Wall:
显示所有warning信息。Linux2.6中必须写makefile。通过make命令编译程序。
Linux2.6中makefile的写法:(以helloworld为例)
//Makefileobj-m+=hello.o
all:
make-C/lib/modules/$(shelluname-r)/buildM=$(PWD)modules
clean:
make-C/lib/modules/$(shelluname-r)/buildM=$(PWD)clean
*注意:all下一行需要有一个“Tab”键,不要写成空格或略去,不然系统无法识别,报错:nothingtobedonefor“all”。用以加载的目标文件类型已经改变Linux2.4中用以加载为模块的目标文件扩展名为.oLinux2.6中中用以加载为模块的目标文件扩展名为.ko在Linux2.4中,函数init_module()和函数cleanup_module()是必不可少的;而在Linux2.6中,同样功能的函数并非一定要起这两个函数名。Lab模块编程WriteTwoModule:Module1:Hell
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年高效酸雾净化器合作协议书
- 2024年记忆绵家居制品项目投资申请报告代可行性研究报告
- 托法替尼银屑病
- 山西传媒学院《合成生物技术》2023-2024学年第一学期期末试卷
- 山西财经大学《算法设计与分析实验》2023-2024学年第一学期期末试卷
- 手术压疮及体位的摆放
- 垃圾处理的方法与技巧
- 山东中医药大学《数字媒体基础创作》2023-2024学年第一学期期末试卷
- 2023年固定照明设备项目融资计划书
- 山东政法学院《新能源汽车电池与电机技术》2023-2024学年第一学期期末试卷
- 海洋科普趣味知识讲座
- 2024年浙江浙能电力股份有限公司招聘笔试参考题库含答案解析
- 鲜红斑痣疾病演示课件
- 静脉输液操作课件
- 调酒师职业生涯规划书
- 安全生产培训(完整版)课件
- 数字文化馆运营推广策略
- 量子计算并行处理
- 国开2023秋《电子商务概论》实践任务B2B电子商务网站调研报告参考答案
- AI技术在教育中的应用:学校教育与教育机构培训
- 联邦学习部署
评论
0/150
提交评论