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

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

ID:14744379

大小:609.50 KB

页数:24页

时间:2018-07-30

课程设计实验报告-基于linux的字符设备驱动程序的设计_第1页
课程设计实验报告-基于linux的字符设备驱动程序的设计_第2页
课程设计实验报告-基于linux的字符设备驱动程序的设计_第3页
课程设计实验报告-基于linux的字符设备驱动程序的设计_第4页
课程设计实验报告-基于linux的字符设备驱动程序的设计_第5页
资源描述:

《课程设计实验报告-基于linux的字符设备驱动程序的设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、基于Linux的字符设备驱动程序的设计1选题意义驱动程序在Linux内核里扮演着特殊的角色.它们是截然不同的"黑盒子",使硬件的特殊的一部分响应定义好的内部编程接口.它们完全隐藏了设备工作的细节.用户的活动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上.这个编程接口是这样,驱动可以与内核的其他部分分开建立,并在需要的时候在运行时"插入".这种模块化使得Linux驱动易写,以致于目前有几百个驱动可用.尽管编写设备代码并不一定比编写应用程序更困难,但它需要掌握一些新函数库,并考虑一些新问题,而

2、这些问题是在应用程序空间里不曾遇到的。在应用程序空间写程序,内核能够为犯的一些错误提供一张安全网,但当我们工作在内核空间时,这张安全网已不复存在。因为内核代码对计算机有绝对的控制权,它能够阻止其他任何进程的执行,所以编写的设备代码绝对小心不能滥用这种权利。在Linux设备驱动中,字符设备驱动较为基础,所以本次实验设计一个简单的字符设备驱动程序,然后通过模块机制加载该驱动,并通过一个测试程序来检验驱动设计的正确与否,并对出现的问题进行调试解决。2技术路线模块实际上是一种目标对象文件(后缀名为ko),没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部

3、分运行或从内核中取下,从而可以动态扩充内核的功能。模块有一个入口(init_module())和一个出口(exit_module())函数,分别是模块加载和卸载时执行的操作,加载模块使用insmod命令,卸载使用rmmod命令。字符设备以字节为单位进行数据处理,一般不适用缓存。大多数字符设备仅仅是数据通道,只能按照顺序读写。主设备号表示设备对应的驱动程序,次设备号用来区分具体设备的实例。LINUX为文件和设备提供一致的用户接口,对用户来说,设备文件与普通文件并无区别,设备文件也可以挂接到任何需要的地方。对于字符设备而言,file_operations结构体中的成员函数

4、是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open()、write()、read()、close()等系统调用时最终被调用。驱动程序的三层界面:驱动程序与操作系统内核的接口,通过file_operations数据结构来完成;驱动程序与系统引导的接口,这部分驱动程序对设备进行初始化;驱动程序与设备的接口,描述驱动程序如何与设备进行交互,这与具体设备密切相关。3详细设计3.1cdev结构体本论文基于虚拟的globalmem设备进行字符设备驱动,globalmem意味着“全局内存”,在globalmem字符设备驱动中会分配一片大小为GLOBA

5、LMEM_SIZE(4KB)的内存空间,并在驱动中提供针对该片内存的读写、控制和定位函数,以供用户空间的进程能通过Linux系统调用访问这片内存。在Linux2.6内核中使用cdev结构体描述字符设备,cdev结构体的定义如下所示:structcdev{structkobjectkobj;/*内嵌的kobject对象*/structmodule*owner;/*所属模块*/structfile_operations*ops;/*文件操作结构体*/structlist_headlist;dev_tdev;/*设备号*/unsignedintcount;};cdev结构体

6、的dev_t成员定义了设备号,为32位,其中高12位为主设备号,低20位为次设备号。使用下列宏可以从dev_t获得主设备号和次设备号。MAJOR(dev_tdev)MINOR(dev_tdev)而使用下列宏则可以通过主设备号和设备号生成dev_t。MKDEV(intmajor,intminor)cdev结构体的另一个重要成员file_operations定义了字符设备驱动提供给虚拟文件系统的接口函数。Linux2.6内核提供了一组函数用于操作cdev结构体,如下所示:voidcdev_init(structcdev*,structfile_operations*);s

7、tructcdev*cdev_alloc(void);voidcdev_put(structcdev*p);intcdev_add(structcdev*,dev_t,unsigned);voidcdev_del(structcdev*);cdev_init()函数用于初始化cdev的成员,并建立cdev和file_operations之间的连接,其源代码如下所示。voidcdev_init(structcdev*cdev,structfile_operations*fops){memset(cdev,0,sizeof*cdev);INIT_LIST

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。