Linux驱动程序编写复习_第1页
Linux驱动程序编写复习_第2页
Linux驱动程序编写复习_第3页
Linux驱动程序编写复习_第4页
Linux驱动程序编写复习_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论