linux驱动程序编写基础

linux驱动程序编写基础

ID:1358198

大小:403.50 KB

页数:45页

时间:2017-11-10

linux驱动程序编写基础_第1页
linux驱动程序编写基础_第2页
linux驱动程序编写基础_第3页
linux驱动程序编写基础_第4页
linux驱动程序编写基础_第5页
资源描述:

《linux驱动程序编写基础》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux操作系统分析与实践第七讲:Linux驱动程序编写基础《Linux操作系统分析与实践》课程建设小组北京大学二零零八年春季*致谢:感谢Intel对本课程项目的资助本讲主要内容Linux内核模块中断和中断处理下半部Linux内核模块Linux操作系统的内核是单一体系结构(monolithickernel)有了模块机制后,提高Linux操作系统的可扩充性,内核编程不再是一个恶梦什么是模块呢?模块的全称是“动态可加载内核模块”(LoadableKernelModule,LKM)模块在内核空间运行模块实际上是一种目标

2、对象文件没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能这种目标代码通常由一组函数和数据结构组成Linux内核模块的优点与缺点优点使得内核更加紧凑和灵活修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可模块的目标代码一旦被链接到内核,它的作用域和静态链接的内核目标代码完全等价缺点由于内核所占用的内存是不会被换出的,所以链接进内核的模块会给整个系统带来一定的性能和内存利用方面的损失

3、;装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装入和卸载模块时修改符号表;模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性.Linux内核模块与应用程序的区别C语言程序Linux内核模块运行用户空间内核空间入口main()module_init()指定;出口无module_exit()指定;编译gcc–cMakefile连接ldinsmod运行直接运行insmod调试gdbkdbug,kdb,

4、kgdb等模块相关命令insmod[moduleparameters]Loadthemodule注意,只有超级用户才能使用这个命令RmmodUnloadthemodulelsmodListallmodulesloadedintothekernel这个命令和cat/proc/modules等价modprobe[-r]–Loadthemodulespecifiedandmodulesitdepends模块依赖一个模块A引用另一个模块B所导出的符号,我们就说模块B被模块A引用

5、。如果要装载模块A,必须先要装载模块B。否则,模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块间的相互关系就叫做模块依赖。最简单的内核模块例子#include#include#includestaticint__inithello_init(void){printk(KERN_INFO"Helloworld");return0;}staticvoid__exithello_exit(void){printk

6、(KERN_INFO"Goodbyeworld");}module_init(hello_init);module_exit(hello_exit);staticint__inithello_init(void)staticvoid__exithello_exit(void)Static声明,因为这种函数在特定文件之外没有其它意义__init标记,该函数只在初始化期间使用。模块装载后,将该函数占用的内存空间释放__exit标记该代码仅用于模块卸载。Init/exit宏:module_init/module_ex

7、it声明模块初始化及清除函数所在的位置装载和卸载模块时,内核可以自动找到相应的函数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)cleanModuleinclude

8、smorefilesobj-m:=hello.ohello-objs:=a.ob.o装载和卸载模块相关命令lsmodinsmodhello.kormmodhello.ko模块参数传递有些模块需要传递一些参数参数在模块加载时传递#insmodhello.kotest=2参数需要使用module_param宏来声明module_param的参数:变量名称,类型以

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。