网站大量收购闲置独家精品文档,联系QQ:2885784924

Linuxsystem驱动概述.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linuxsystem驱动概述

Linux系统驱动概述 驱动程序与应用程序的区别 应用程序一般有一个main函数,从头到尾执行一个任务;应用程序可以和GLIBC库连接 驱动程序没有main函数,通过使用宏module_init(初始化函数名) 将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏moudule_exit(退出处理函数名)注册退出处理函数。它在驱动退出时被调用。驱动程序中是不能使用标准C库的 内核版本与编译器的版本依赖 当模块与内核链接时,insmod会检查模块和当前内核版本是否匹配,每个模块都定义了版本符号__module_kernel _version,这个符号位于模块文件的ELF头的.modinfo段中。只要在模块中包含linux/module.h,编译器就会自动定义这个符号 每个内核版本都需要特定版本的编译器的支持,高版本的编译器并不适合低版本的内核,Linux-2.4版本的insmod 命令装载模块时,首先从/lib/modules目录和内核相关的子目录中查找模块文件,如果需要从当前目录装载,使用insmod module.o。 设备驱动程序的作用 设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法。 设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。 Linux下对外设的访问只能通过驱动程序 Linux对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序: Open、Release、read、write、ioctl… 驱动程序是内核的一部分,可以使用中断、DMA等操作 驱动程序需要在用户态和内核态之间传递数据 设备驱动程序的分类 字符设备驱动程序 各种串行接口,并行接口等。 块设备驱动程序 磁盘设备等 网络设备驱动程序 网卡等。 杂项设备驱动程序 不属于上述三种设备之外的一些设备,如SCSI,时钟等。 在操作系统中的位置 设备驱动程序是内核代码的一部分。 驱动程序的地址空间是内核的地址空间。 驱动程序的代码直接对设备硬件(实际是设备的各种寄存器)进行控制(实际就是读写操作)。 应用程序通过操作系统的系统调用执行相应的驱动程序函数。中断则直接执行相应的中断程序代码。 设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。 块设备和字符设备以设备文件的方式建立在文件系统中的/dev目录下,而且每个设备都有一个主设备号和一个次设备号。 在操作系统中的位置 主设备号和次设备号 主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。 主设备号标识设备对应的驱动程序 一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法 系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中 int register_chrdev(unsigned int major, const char*name,struct file_operations *fops); 主设备号和次设备号 创建设备节点 设备已经注册到内核表中,对于设备的访问通过设备文件(设备文件与设备驱动程序的主设备号匹配),内核会调用驱动程序中的正确函数 给程序一个它们可以请求设备驱动程序的名字。这个名字必须插入到/dev目录中,并与驱动程序的主设备号和次设备号相连 使用mknod在文件系统上创建一个设备节点 mknod /dev/mydevice c 254 0 动态分配设备号 在Documentation/device.txt文件中可以找到已经静态分配给大部分设备的列表 由于许多数字已经分配了,为新设备选择一个唯一的号码是很困难的 如果调用register_chrdev时的major为零,函数就会选择一个空闲号码并做为返回值返回 动态分配的问题 动态分配的主设备号不能保证总是一样的,无法事先创建设备节点 可以从/proc/devices读取 cat /proc/devices 利用脚本动态创建设备文件节点 Linux的驱动开发调试有两种方法 直接编译到内核, 再运行新的内核来测试。效率较低,但在某些场合是唯一的方法 编译为模块的形式,单独加载运行调试。模块方式调试效率很高,它使用insmod工具将编译的模块直接插入内核,如果出现故障,可以使用rmmod从内核中卸载模块。不需要重新启动内核,这使驱动调试效率大大提高 。 模块方式驱动程序编译的两种方法

文档评论(0)

shaoye348 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档