中南大学操作系统设备驱动程序设计实验报告【可编辑范本】.doc
《中南大学操作系统设备驱动程序设计实验报告【可编辑范本】.doc》由会员分享,可在线阅读,更多相关《中南大学操作系统设备驱动程序设计实验报告【可编辑范本】.doc(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中南大学操作系统课程设计实验报告选题: 设备驱动程序设计一、概述:设计主要完成的任务和解决的主要问题;。任务:设备驱动程序设计,要求如下:(1) 设计WindosP或者inu操作系统下的设备驱动程序;(2) 设备类型可以是字符设备、块设备或者网络设备;(3) 设备可以是虚拟的也可以是实际设备;(4) 编写测试应用程序,测试对该设备的读写等操作。2.解决的主要问题: (1)各个相关函数的重写 (2)虚拟字符设备的挂载 (3)虚拟字符设备的测试二. 设计的基本概念和原理;1. 基本概念(1) Lnux系统设备概述Linux核心与设备驱动之间有一个以标准方式进行互操作的接口。每一类设备(字符设备、块
2、设备以及网络设备)都提供了通用接口,以便在需要时为内核提供服务。这种通用接口使得内核可以以相同的方式来对待不同的设备以及设备驱动.设备驱动程序只是处理硬件,将如何使用硬件的问题留给应用程序。可以从不同的角度来看待设备驱动程序:它是位于应用层和实际设备之间的软件。设备驱动程序在u内核中扮演着特殊的角色,它们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节。用户操作通过一组标准化的调用完成,而这些调用是和特定的驱动程序无关的.将这些调用映射到作用于实际硬件的设备特定的操作上,则是设备驱动程序的任务。针对不同的设备驱动程序分为3类:字符设备驱动、
3、块设备驱动、网络设备驱动。(2) 字符设备可以像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。这样的驱程序通常实现opn、lose、ead和wite系统调用。通过文件系统节点可以访问字符设备,例如/ev/tty1和dv/lp1。在字符设备和普通文件系统间的唯一区别是:普通文件允许在其上来回读写,而大多数字符设备仅仅是数据通道,只能顺序读写。当然,也存在这样的字符设备,看起来像个数据区,可以来回读取其中的数据。(3) 设备驱动程序设备驱动程序就是一组由内核中的相关子例程和数据组成的O设备软件接口.每当内核意识到要对某个设备进行特殊的操作时,它就调用相应的驱动例程。这就使得控制从用户进程
4、转移到了驱动例程,当驱动例程完成后又被返回至用户进程。(4) 模块化Liux中的可加载模块(mdule)是Lx内核支持的动态可加载模块,他们是核心的一部分(通常是设备驱动程序),单是并没编译到核心里面去。Modul可以单独编译成为目标代码,moul是个目标文件。它可以根据需要在系统启动后动态地加载到系统核心之中。当modle不再被需要时,可以动态地卸载出系统核心。在i中大多数设备驱动程序或文件系统都是作为oule的。超级用户可以通过ismod和rmmod命令显示地将odle载入核心或者卸载。2。原理系统调用是操作系统内核、应用程序之间的接口,设备驱动程序是操作系统内核、机器硬件之间的接口。设备
5、为应用程序屏蔽了硬件的细节,这样从应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:(1) 对设备初始化和释放(2) 把数据从内核传送到硬件和从硬件读取数据(3) 读取应用程序传送给设备文件的数据和回送应用程序请求的数据(4) 检测和处理设备出现的错误另外,为了让驱动程序能够正常的工作,操作系统内核为驱动程序提供一系列的支持,这些支持包括许多方面。例如,驱动程序需要向内核申请使用系统内存,驱动程序需要向内核申请使用系统硬件资源,驱动程序需要向内核注册自己。下面是内核提供的可供驱动程序使用的几个重要的函数。(1
6、) 内存分配函数maloc(2) IO端口相关函数equestrion、relee_region、heko等(3) 内核打印函数prt此外操作系统将每个外部设备当做文件来处理,内核通过file_ratis结构来访问driver的功能。ilepratns的定义在文件中。每个字符设备都有一个il_operatis结构.这个结构指向一组操作函数(oen、read。).每个函数的定义由drive提供。当然,有些标准操作某些设备并不支持,这时,fie_peratio结构中对应的表项为ULL。随着Linux内核的不断升级,i_operatos结构也不断变大。在最新的版本中,函数原型也发生了一些变化当然,新
7、版本总会向下兼容。这个结构每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如a/wrte操作,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是Linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填写filepeatios的各个域。三. 总体设计:实现的方法和主要技术路线;预先设计好内存大小,利用Liux内核提供的几个重要函数,为自己的虚拟字符设备申请设备号,进行内存分配,进行cdev的注册,重写cde中的fle_opratons结构中的wrie、ead
8、、open、clse等方法,以实现自定义的对设备的读写操作.最后,当不用设备时,利用Linu的rmm命令将该字符设备卸载.四.详细设计;字符设备结构strut goamedevsct cdev cdv;cd结构体*/unigednt cnt;1.模块加载(1)在loamm_nt(oi)中先申请设备号、后分配内存,最后进行cev的注册。这三个步骤Linux内核都有提供相应的基本函数以来完成,直接调用即可。(2)cdev的注册通过globalem_stu_dv函数完成,在其中把我们自定义的fle_optins结构连接到cdv中的fl_operaons中(3)将自定义的模块初始化注册方法放到mde_
9、init()中函数如下:/初始化并注册 dev*/saicvoidgbalmem_setp_dev(structgobalm_dev *dev,intndex)pnk(KEN_INFO lobalmemsetpcdv() beginn);it err,dev=MKEV(glbalem_majo,index);cevnit(devdev,gobalmem_fps);de-cdev。owner=THIS_MDLE;v-de.ps=&loalme_fop;ecev_add(&dvcdev,deo,1);i(err) pritk(_NOTIE Eror %d ading ED d”,err,nex);
10、/*初始化加载模块*int globalmem_init(voi)pintk(RN_IFO ”globalmem_nit() beinn”);it reut;dev_tdevno MKDEV(gobalmemmajor,0);f(gloamemajor)reult=rse_rde_reion(devn,1,gbalem);elseesult=alo_crde_egi(&deo,0,1,loblmem);glbalmm_major=AJOR(dvno);if(rsut) retu reult;globalmemvp kmalloc(sizeof(stuct globme_dev),GFP_ERE
11、);if(!globamem_dep)sul=ENOME;otofail_malloc;emse(gloaledevp,0,sizeof(srct globlme_de));loalem_setupcv(globlem_devp,0);rturn ;alalloc:unrgister_chrdevrein(devno,1);trn esult;2. 设备操作 自己重写write、read、pen、lose方法,然后就像填表一样放到自己声明的file_opatios中,再把该结构体连接到dev的ilopatios结构中。(1) 文件打开利用Linux调用打开方法时传入的参数,将其中的指向这一设备
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 可编辑范本 中南 大学 操作系统 设备 驱动程序 设计 实验 报告 编辑 范本
限制150内