中南大学操作系统设备驱动程序设计实验报告.docx
《中南大学操作系统设备驱动程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《中南大学操作系统设备驱动程序设计实验报告.docx(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中南大学操作系统课程设计试验报告选题:设备驱动程序设计1 / 10一、概述:设计主要完成的任务和解决的主要问题;1. 任务:设备驱动程序设计, 要求如下:(1) 设计 Windows XP 或者 Linux 操作系统下的设备驱动程序;(2) 设备类型可以是字符设备、块设备或者网络设备;(3) 设备可以是虚拟的也可以是实际设备;(4) 编写测试应用程序,测试对该设备的读写等操作.2. 解决的主要问题:(1) 各个相关函数的重写(2) 虚拟字符设备的挂载(3) 虚拟字符设备的测试二.设计的根本概念和原理;1. 根本概念(1) Linux 系统设备概述Linux 核心与设备驱动之间有一个以标准方式进
2、展互操作的接口。每一类设备字符设备、块设备以及网络设备都供给了通用接口,以便在需要时为内核供给效劳。这种通用接口使得内核可以以一样的方式来对待不同的设备以及设备驱动。设备驱动程序只是处理硬件,将如何使用硬件的问题留给应用程序。可以从不同的角度来对待设备驱动程序:它是位于应用层和实际设备之间的软件。设备驱动程序在Linux 内核中扮演着特别的角色,它们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节。用户操作通过一组标准化的调用完成,而这些调用是和特定的驱动程序无关的。将这些调用映射到作用于实际硬件的设备特定的操作上,则是设备驱动程序的任务。
3、针对不同的设备驱动程序分为 3 类:字符设备驱动、块设备驱动、网络设备驱动。(2) 字符设备可以像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。这样的驱程序通常实现 open、close、read 和 write 系统调用。通过文件系统节点可以访问字符设备,例如/dev/tty1 和/dev/lp1。在字符设备和一般文件系统间的唯一区分是:一般文件允许在其上来回读写,而大多数字符设备仅仅是数据通道,只能挨次读写。固然,也存在这样的字符设备,看起来像个数据区,可以来回读取其中的数据。(3) 设备驱动程序设备驱动程序就是一组由内核中的相关子例程和数据组成的IO 设备软件接口。每当内核意识
4、到要对某个设备进展特别的操作时,它就调用相应的驱动例程。这就使得把握从用户进程转移到了驱动例程,当驱动例程完成后又被返回至用户进程。(4) 模块化Linux 中的可加载模块module是 Linux 内核支持的动态可加载模块,他们是核心的一局部通常是设备驱动程序,单是并没编译到核心里面去。Module 可以单独编译成为目标代码,module 是个目标文件。它可以依据需要在系统启动后动态地加载到2 / 10系统核心之中。当 module 不再被需要时,可以动态地卸载出系统核心。在 Linux 中大多数设备驱动程序或文件系统都是作为module 的。超级用户可以通过insmod 和 rmmod 命
5、令显示地将 module 载入核心或者卸载。2. 原理系统调用是操作系统内核、应用程序之间的接口,设备驱动程序是操作系统内核、机器硬件之间的接口。设备为应用程序屏蔽了硬件的细节,这样从应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作一般文件一样对硬件设备进展操作。设备驱动程序是内核的一局部,它完成以下的功能:(1) 对设备初始化和释放(2) 把数据从内核传送到硬件和从硬件读取数据(3) 读取应用程序传送给设备文件的数据和回送应用程序恳求的数据(4) 检测和处理设备消灭的错误另外,为了让驱动程序能够正常的工作,操作系统内核为驱动程序供给一系列的支持,这些支持包括很多方面。例如,驱动程序
6、需要向内核申请使用系统内存,驱动程序需要向内核申请使用系统硬件资源,驱动程序需要向内核注册自己。下面是内核供给的可供驱动程序使用的几个重要的函数。(1) 内存安排函数 kmalloc(2) I/O 端口相关函数 request_region、release_region、check_region 等(3) 内核打印函数 printk此外操作系统将每个外部设备当做文件来处理,内核通过file_operations 构造来访问 driver 的功能。File_operations 的定义在文件中。每个字符设备都有一个 file_operations 构造。这个构造指向一组操作函数open、read
7、.。每个函数的定义由 driver 供给。固然,有些标准操作某些设备并不支持,这时, file_operations 构造中对应的表项为 NULL。随着 Linux 内核的不断升级,file_operations 构造也不断变大。在最的版本中,函数原型也发生了一些变化。固然,版本总会向 下兼容。这个构造每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进展诸如 read/write 操作,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据构造相应的函数指针,接着把把握权交给该函数。这是 Linux 的设备驱动程序工作的根本原理。既然是这样,则编写设备驱动
8、程序的主要工作就是编写子函数,并填写 file_operations 的各个域。三.总体设计:实现的方法和主要技术路线;预先设计好内存大小,利用Linux 内核供给的几个重要函数,为自己的虚拟字符设备申请设备号,进展内存安排,进展 cdev 的注册,重写 cdev 中的 file_operations 构造中的 write、read、open、close 等方法,以实现自定义的对设备的读写操作。最终,当不用设备时,利用 Linux 的 rmmod 命令将该字符设备卸载。四.具体设计;字符设备构造struct globalmem_devstruct cdev cdev;/*cdev 构造体*/
9、unsigned int count;1. 模块加载(1) 在 globalmem_init(void)中先申请设备号、后安排内存,最终进展 cdev 的注册。这三个步骤 Linux 内核都有供给相应的根本函数以来完成,直接调用即可。(2) cdev 的注册通过 globalmem_setup_cdev 函数完成,在其中把我们自定义的file_operations 构造连接到 cdev 中的 file_operations 中(3) 将自定义的模块初始化注册方法放到module_init中函数如下:/*初始化并注册 cdev*/static void globalmem_setup_cdev(
10、struct globalmem_dev *dev,int index)printk(KERN_INFO “globalmem_setup_cdev beginn“); int err,devno=MKDEV(globalmem_major,index); cdev_init(&dev-cdev,&globalmem_fops);dev-cdev.owner=THIS_MODULE;dev-cdev.ops=&globalmem_fops;err=cdev_add(&dev-cdev,devno,1); if(err) printk(KERN_NOTICE “Error %d adding L
11、ED %d“,err,index);/*初始化加载模块*/ int globalmem_init(void)printk(KERN_INFO “globalmem_init beginn“); int result;dev_t devno= MKDEV(globalmem_major,0); if(globalmem_major) result=register_chrdev_region(devno,1,“globalmem“);else result=alloc_chrdev_region(&devno,0,1,“globalmem“); globalmem_major=MAJOR(dev
12、no);if(resultprivate_data=globalmem_devp;printk(KERN_INFO “globalmem_open beginn“); return 0;(2) 读操作利用读操作时会自动传入的参数来定义我们自己的对设备的操作方式。其中 filp 是指向这一设备的文件构造的指针,buf 为缓冲区,size 是用户进程要求读取的字节数, ppos 是文件当前位移。先初始化各系列条件,p 为当前偏移,count 为要读取的字节数。然后获得设备构造体指针,接着分析和猎取有效的写长度。假设返回ENXIO,则代表某种错误,意思大致是没有这样的设备或地址,就是说文件不能被读取
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 操作系统 设备 驱动程序 设计 实验 报告
限制150内