13 字符设备驱动程序.ppt

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
字符设备的注册 早期方法: 内核中仍有许多字符驱动不使用刚刚描述过的cdev 接口。没有更新到 2.6 内核接口的老代码。 注册一个字符设备的早期方法: int register_chrdev(unsigned int major, const char *name, struct file_operations *fops); major 是给定的主设备号。为0代表什么? name 是驱动的名字(将出现在 /proc/devices), fops 是设备驱动的file_operations 结构。 register_chrdev 将给设备分配 0 - 255 的次设备号, 并且为每一个建立一个缺省的 cdev 结构。 从系统中卸载字符设备的函数: int unregister_chrdev(unsigned int major, const char *name); 字符设备驱动程序编写流程 实现底层操作函数 将这些底层操作函数结合到file_operations结构中; 在模块的入口函数 申请、注册设备号; 初始化cdev(要关联一个file_operations结构) 注册cdev; 在模块的出口函数 注销cdev; 注销设备号; 字符设备模块入口函数的执行流程: 字符设备驱动程序编写流程 字符设备模块出口函数的执行流程: 字符设备驱动程序编写流程 实例--(1)编写底层函数 实例--(2)创建file_operations变量,将底层操作函数集合到该结构中; 实例--(3)模块初始化函数; 实例--(4)模块出口函数; 编译模块; 在ARM板上插入模块 # insmod first_drv.ko 插入模块之后,可以通过文件/proc/devices 查看设备信息 # cat /proc/devices 找到 first_drv的主设备号是249,如下图 建立设备文件 # mknod /dev/first_drv c 249 0 建立好设备文件之后,应用程序就可以通过设备文件来访问驱动程序了。 应用测试程序如图: 在开发板上执行测试程序的效果如下: 课堂小结 字符设备驱动程序的编写框架是: 编写底层硬件的操作函数,将这些函数集合在一个file_operations结构中; 在模块的入口函数中,申请设备号,初始化并注册一个cdev结构; 在模块的出口函数中,注销cdev结构,注销设备号; 可以通过文件 /proc/devices 查看设备信息,找到动态分配的主设备号 手动建立设备文件的命令是mknod 预习内容 字符设备驱动框架 开发驱动程序需要对内核有一定的了解,并不是非要解读的多么透彻。 操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。 内核紧紧地包围在硬件周围,内核是一些软件包的组合,它们可以直接访问系统的硬件,包括处理器、内存和I/O设备。而用户进程则通过内核提供的用户服务来和内核通讯,从而间接地控制系统硬件。 用户级的程序使用内核提供的标准系统调用来与内核通讯,这些系统调用有:open(), read(), write(), ioctl(), close() 等等。 讲解重要成员,涉及内存管理、块设备、同步异步通讯机制等成员放到后面章节。注意学习方法,先迅速掌握基本构架,再从点到面,深入理解其他成员。 Lofft_t 长偏移量,即使32平台也使用64位的数据宽度。 讲解重要成员,涉及内存管理、块设备、同步异步通讯机制等成员放到后面章节。注意学习方法,先迅速掌握基本构架,再从点到面,深入理解其他成员。 Lofft_t 长偏移量,即使32平台也使用64位的数据宽度。 讲解重要成员,涉及内存管理、块设备、同步异步通讯机制等成员放到后面章节。注意学习方法,先迅速掌握基本构架,再从点到面,深入理解其他成员。 Lofft_t 长偏移量,即使32平台也使用64位的数据宽度。 讲解重要成员,涉及内存管理、块设备、同步异步通讯机制等成员放到后面章节。注意学习方法,先迅速掌握基本构架,再从点到面,深入理解其他成员。 Lofft_t 长偏移量,即使32平台也使用64位的数据宽度。 在glibc中定义的FILE 是用于用户空间的变量,不会出现在内核代码中。而file结构体是内核的一个数据结构,也不会出现在用户程序中。 读写指针 loff_t f_pos。 在glibc中定义的FILE 是用于用户空间的变量,不会出现在内核代

文档评论(0)

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

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

1亿VIP精品文档

相关文档