08041127陈涛linux作业.doc

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

嵌入式Linux的驱动程序开发 Linux是Unix操作系统的一种变种,在 Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱 动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便   系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用 程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能:   1.对设备初始化和释放.   2.把数据从内核传送到硬件和从硬件读取数据.   3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据.   4.检测和处理设备出现的错误.在Linux 操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时, 实际的硬件 I/O 一般就紧接着发生了, 块设备则不然, 它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的 I/O 操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的 CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备,另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们.设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作.如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了。inux 抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示打开设备是由open()来完成的。例如,打印机是用lp_open()打开的,而硬盘是用hd_open()打开的。在大部分设备驱动程序中,open完成如下工作:   1.增加设备的使用计数。   2.检查设备的相关错误,如设备尚未准备好或是类似硬件的问题。   3.检查是首次打开,则初始化设备。   4.识别次设备号,如有必要则更新f_op指针。   5.如果需要,分配且设置要放在filp-private_data里的数据结构。   释放设备由release()来完成,例如释放打印机是用lp_release(),而释放终端设备是用tty_release()。释放设备的一般步骤包括:   1.释放在filp-private_data中的open分配的内存。   2.如果是最后一次释放,则关闭设备。   3.递减设别的使用计数。   字符设备使用各自的read()和write()来进行数据读写。例如,对虚拟终端的读写是通过vcs_read()和vcs_write()来进行数据读写的。   块设备使用通用的generic_file_read()和generic_file_write()来进行数据读写。这两个通用函数向请求表添加读写请求,内核可以通过ll_rw_block()优化请求顺序。由于是对内存缓冲区而不是设备进行操作的,因而可以加快读写请求。如果内存缓冲区内没有要读入的数据或是要将写请求写入设备,那么就要真正的执行数据传输。这是通过数据结构request_queue和request_fn()来完成 (include/linux/blkdev.h)。   除了读写操作,有时还要控制设备。这可以通过设备驱动程序中的ioctl()来完成。例如IDE硬盘的控制可以通过hd_ioctl(),对光驱的控制可以通过cdrom_ioctl()。   与读写操作不同,ioctl()的用法与具体设备密切相关。以软驱的floppy_ioctl()为例(drivers/block/floppy.c):   static int fd_ioctl(struct inode *inode,   struct file *filp,   unsigned int cmd,   unsigned l

文档评论(0)

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

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

1亿VIP精品文档

相关文档