实验四-linux驱动程序的编写(共7页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《实验四-linux驱动程序的编写(共7页).doc》由会员分享,可在线阅读,更多相关《实验四-linux驱动程序的编写(共7页).doc(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上中国石油大学(北京)计算机科学与技术系实 验 报 告评定成绩指导教师实验课程: 软件系统设计与开发实践 实验名称: linux驱动程序的编写 学号: 姓名: 于宁 班级: 信息研17-4班 完成日期: 2018 年 4 月 16 日 一、实验目的1. 掌握linux驱动程序的编写方法;2. 掌握驱动程序动态模块的调试方法;3. 掌握驱动程序填加到内核的方法。二、实验内容1. 学习linux驱动程序的编写流程;2. 学习驱动程序动态模块的调试方法;3. 学习驱动程序填加到内核的流程。三、实验设备1. PentiumII以上的PC机,LINUX操作系统,EL-ARM830
2、实验箱。四、linux的驱动程序的编写嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文
3、件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备两类主要的设备文件类型。字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。4.1 设备驱动程序的 file_
4、operations 结构通常,一个设备驱动程序包括两个基本的任务:驱动设备的某些函数作为系统调用执行;而某些函数则负责处理中断(即中断处理函数)。而file_operations 结构的每一个成员的名称都对应着一个系统调用。用户程序利用系统调用,比如在对一个设备文件进行诸如read操作时,这时对应于该设备文件的驱动程序就会执行相关的ssize_t (*read) (struct file *, char *, size_t, loff_t *);函数。在操作系统内部,外部设备的存取是通过一组固定入口点进行的,这些入口点由每个外设的驱动程序提供,由file_operations结构向系统进行说
5、明,因此,编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。file_operations结构在kernel/include/linux/fs.h中可以找到。struct file_operations struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, size_t,
6、 loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int
7、 (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff
8、_t *);ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);#ifdef MAGIC_ROM_PTRint
9、(*romptr) (struct file *, struct vm_area_struct *);#endif /* MAGIC_ROM_PTR */;其中主要的函数说明如下:1. open 是驱动程序用来完成设备初始化操作的, open还会增加设备计数,以防止文件在关闭前模块被卸载出内核。open主要完成以下操作:检查设备错误(诸如设备未就绪或相似的硬件问题);如果是首次打开,初始化设备;标别次设备号;分配和填写要放在fileprivate_data内的数据结构;增加使用计数。2. read 用来从外部设备中读取数据。当其为指针时,将引起read系统调用返回-EINVAL(“非法参数”)
10、。函数返回一个非负值表示成功地读取了多少字节。3. write 向外部设备发送数据。如果没有这个函数,write 系统调用向调用程序返回一个-EINVAL。如果返回值非负,就表示成功地写入的字节数。4. release是当设备被关闭时调用这个操作。release的作用正好与open相反。这个设备方法有时也称为close。它应该完成以下操作:使用计数减1;释放open分配在fileprivate_data中的内存,在最后一次关闭操作时关闭设备。5. llseek 是改变当前的读写指针。6. readdir 一般用于文件系统的操作。7. poll 一般用于查询设备是否可读可写或处于特殊的状态。8.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 linux 驱动程序 编写
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内