回顾Linux系统驱动概述.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
设备驱动程序基本概念-软件系统流程 设备驱动程序基本概念-驱动程序作用 设备驱动程序将复杂的硬件抽象成一个结构良好的设备,并通过提供统一的程序接口为系统的其它部分提供使用设备的能力和方法。 设备驱动程序(应该只是)为系统的其它部分提供各种使用设备的能力,使用设备的方法应该由应用程序决定。 设备驱动程序基本概念 Linux下对外设的访问只能通过驱动程序 Linux对于驱动程序有统一的接口,以文件的形式定义系统的驱动程序: Open、Release、read、write、ioctl… 驱动程序是内核的一部分,可以使用中断、DMA等操作 驱动程序需要在用户态和内核态之间传递数据 设备驱动程序基本概念 驱动程序与应用程序的区别 1、应用程序以main函数开始,驱动程序则没用main函数。它以特殊的模块初始化函数为入口。 2、应用程序从头至尾执行一个任务,驱动程序在完成初始化后,等待系统调用。 3、应用程序可以使用GLIBC等标准C函数库,驱动程序不能使用标准C函数库。 简单实例 #include linux/init.h #include linux/module.h MODULE_LICENSE(Dual BSD/GPL); static int hello_init(void) { printk(KERN_ALERT Hello, world\n); return 0; } static void hello_exit(void) { printk(KERN_ALERT Goodbye, world\n); } module_init(hello_init); module_exit(hello_exit); 设备驱动程序的分类 字符设备驱动程序 各种串行接口,并行接口等。 块设备驱动程序 磁盘设备等 网络设备驱动程序 网卡等。 杂项设备驱动程序 不属于上述三种设备之外的一些设备,如SCSI,时钟等。 驱动程序在操作系统中的位置 设备驱动程序是内核代码的一部分。 驱动程序的地址空间是内核的地址空间。 驱动程序的代码直接对设备硬件(实际是设备的各种寄存器)进行控制(实际就是读写操作)。 应用程序通过操作系统的系统调用执行相应的驱动程序函数。中断则直接执行相应的中断程序代码。 设备驱动程序的file_operations结构体的地址被注册到内核中的设备链表中。 块设备和字符设备以设备文件的方式建立在文件系统中的/dev目录下,而且每个设备都有一个主设备号和一个次设备号。 int register_chrdev(unsigned int major, const char*name,struct file_operations *fops); 驱动程序在操作系统中的位置 主设备号和次设备号 主设备号标识设备对应的驱动程序 一个驱动程序可以控制若干个设备,次设备号提供了一种区分它们的方法 系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中 int register_chrdev(unsigned int major, const char*name,struct file_operations *fops); 主设备号和次设备号 在/dev目录下使用ll命令(ls -l)可以查看各个设备的设备类型、主从设备号等 file_operations结构体 struct file_operations demo_fops = {…} 完成了将驱动函数映射为标准接口。 例如: static struct file_operations demo_fops = { owner: THIS_MODULE, write: demo_write, read: demo_read, ioctl: demo_ioctl, open: demo_open, release: demo_release, }; 上面的这种特殊表示方法不是标准C的语法,这是GNU编译器的一种特殊扩展,它使用名字对进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。 file_operations结构体 主要包括:open,close(或者release),read,write,ioctl,poll,mmap等 结构体demo_fops将作为一个参数在注册一个设备驱动程序时传递给内核。 内核使用设备链表维护各种注册的设备。不同类型的设备使用不同的链表。 设备驱动程序的接口 Open接口: Open接口提供给驱动程序初始化设备的能力,从而为以后的设备操作做好准备,此外open操作一般还会递增使用计数,用以防止文件关闭前模块被卸载出内核。在大多

文档评论(0)

chqs52 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档