课程设计实验报告-基于Linux的字符设备驱动程序的设计.docVIP

课程设计实验报告-基于Linux的字符设备驱动程序的设计.doc

  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的字符设备驱动程序的设计 1 选题意义 驱动程序在 Linux 内核里扮演着特殊的角色. 它们是截然不同的黑盒子, 使硬件的特殊的一部分响应定义好的内部编程接口. 它们完全隐藏了设备工作的细节. 用户的活动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的; 设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上. 这个编程接口是这样, 驱动可以与内核的其他部分分开建立, 并在需要的时候在运行时插入. 这种模块化使得 Linux 驱动易写, 以致于目前有几百个驱动可用. 尽管编写设备代码并不一定比编写应用程序更困难,但它需要掌握一些新函数库,并考虑一些新问题,而这些问题是在应用程序空间里不曾遇到的。在应用程序空间写程序,内核能够为犯的一些错误提供一张安全网,但当我们工作在内核空间时,这张安全网已不复存在。因为内核代码对计算机有绝对的控制权,它能够阻止其他任何进程的执行,所以编写的设备代码绝对小心不能滥用这种权利。 在 Linux 设备驱动中,字符设备驱动较为基础,所以本次实验设计一个简单的字符设备驱动程序,然后通过模块机制加载该驱动,并通过一个测试程序来检验驱动设计的正确与否,并对出现的问题进行调试解决。 2 技术路线 模块实际上是一种目标对象文件(后缀名为ko ),没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能。模块有一个入口(init_module())和一个出口(exit_module())函数,分别是模块加载和卸载时执行的操作,加载模块使用insmod命令,卸载使用rmmod命令。 字符设备以字节为单位进行数据处理,一般不适用缓存。大多数字符设备仅仅是数据通道,只能按照顺序读写。主设备号表示设备对应的驱动程序次设备号。LINUX对用户来说,设备文件与普通文件并无区别设备文件也可以挂接到任何需要的地方file_operations结构体中的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux 的open()、write()、read()、close()等系统调用时最终被调用。驱动程序的三层界面 :驱动程序与操作系统内核的接口,通过file_operations数据结构来完成;驱动程序与系统引导的接口,这部分驱动程序对设备进行初始化;驱动程序与设备的接口,描述驱动程序如何与设备进行交互,这与具体设备密切相关。 3 详细设计 3.1 cdev 结构体 本论文基于虚拟的globalmem设备进行字符设备驱动,globalmem意味着“全局内存”,在globalmem字符设备驱动中会分配一片大小为GLOBALMEM_ SIZE(4KB)的内存空间,并在驱动中提供针对该片内存的读写、控制和定位函数,以供用户空间的进程能通过Linux 系统调用访问这片内存。 在 Linux 2.6 内核中使用cdev结构体描述字符设备,cdev结构体的定义如下所示: struct cdev { struct kobject kobj; /* 内嵌的kobject对象*/ struct module *owner; /*所属模块*/ struct file_operations *ops; /*文件操作结构体*/ struct list_head list; dev_t dev; /*设备号*/ unsigned int count; }; cdev结构体的dev_t 成员定义了设备号,为32 位,其中高12 位为主设备号,低20位为次设备号。使用下列宏可以从dev_t获得主设备号和次设备号。 MAJOR(dev_t dev) MINOR(dev_t dev) 而使用下列宏则可以通过主设备号和设备号生成dev_t。 MKDEV(int major, int minor) cdev 结构体的另一个重要成员file_operations 定义了字符设备驱动提供给虚拟文件系统的接口函数。 Linux 2.6 内核提供了一组函数用于操作cdev结构体,如下所示: void cdev_init(struct cdev *, struct file_operations *); struct cdev *cdev_alloc(void); void cdev_put(struct cdev *p); int cdev_add(struct cdev *, dev_t, unsigned); void cdev_del(struct cdev *); cdev_init()函数用于初始化cdev 的成员,并建立cdev 和file_operations 之间的连接,其源代码如下所示。 void cdev

文档评论(0)

小教资源库 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档