Linux设备驱动程序介绍.doc

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

Linux操作系统将所有的设备(而不仅是存储器里的文件)全部都看成文件,都纳入文件系统的范畴,都通过文件的操作界面进行操作。这意味着: (l)每一个设备都至少由文件系统的一个文件代表,因而都有一个“文件名”。每个这样的“设备文件”都唯一地确定了系统中地一项设备。应用程序通过设备地文件寻找访问具体地设备,而设备则象普通文件一样受到文件系统访问权限控制机制地保护。 (2)应用程序通常可以通过系统调用open()“打开”这个设备文件,建立起与目标设备的连接。代表着该设备的文件节点中记载着建立这种连接所需的信息。对于执行该应用程序的进程而言,建立起的连接就表现为一个已经打开的文件。 (3)打开了代表着目标设备的文件,即建立起与设备的连接后,就可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。Linux将设备分成两大类。一类是像磁盘那样以记录块或“扇区”为单位,成块进行输入/输出设备,称为“块设备”;另一类是像键盘那样以字符(字节)为单位,逐个进行输入/输出的设备,称为“字符设备”、文件系统通常都建立在块设备上。网路设备是介于块设备和字符设备之间的一种特殊设备。设备文件的属性由三部分信息组成:第一部分是文件的类型(c/b),第二部分是一个“主设备号”,第三部分是一个“次设备号”。其中设备类型和主设备号结合在一起唯一地确定了设备文件地驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。应用程序通过Linux的系统调用与内核通信。由于Linux中将设备当作文件处理,所以对设备进行操作的调用和对文件操作的操作类似,主要包括open()、read()、write()、ioctl()、close()等。应用程序发出系统调用命令后,会从用户态转到内核态,通过内核将open()这样的系统调用转换成对物理设备的操作。在Linux中通过分层实现对物理设备的调用,并使得内核的结构清晰,提高了模块化的独立性。 2驱动程序的结构 一般Linux设备驱动程序可以分为3个主要组成部分: (1)自动配置和初始化子程序,负责检测所要驱动的硬件设备是否存在和能否正常工作。如果设备正常则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。 (2)服务于I/O请求的子程序,又称为驱动程序的上半部。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进程运行环境有关的函 数。 (3)中断服务程序,又称为驱动程序的下半部。在Linux系统中并不是直接从中断向量表调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标志请求服务的设备。在系统内部,I/O设备的存/取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。具体到Linux系统,设备驱动程序所提 供的这组入口点由一个文件操作结构来向系统进行说明。file_operations结构定义于linux/fs.h文件中,随着内核的不断升级,file_operations结构也越来越大,不同版本的内核会稍有不同。 struct file_operations{ struct module*owner; loff_t(*llseek)(struct file*,loff_t,int); ssize_t(*read)(struct file*,char*,size_t,loff_t*); ssize_t(*write)(struct file*,const char*,size_t,loff_t*); int(*readdir)(struct file*,void*,filldir_t); unsigned int(*poll)(struct file*,struct poll_table_struct*); int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long); int(*mmap)(struct file*,struct vm_area_struct*); int(*open)(struct inode*,struct file*); int(*flush)(struct file*); int(*release)(

文档评论(0)

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

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

1亿VIP精品文档

相关文档