《设备管理--Linux设备驱动程序安装(共5页).doc》由会员分享,可在线阅读,更多相关《设备管理--Linux设备驱动程序安装(共5页).doc(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上集美大学计算机工程学院实验报告课程名称:操作系统班级:xxx实验成绩:指导教师: 姓名:xxx实验项目名称:设备管理Linux设备驱动程序安装学号:xxxx上机实践日期:xxx实验项目编号:组号:上机实践时间: 2 学时一、 目的(本次实验所涉及并要求掌握的知识点)1. 认识Linux的设备的种类和设备工作方式;2. 理解设备驱动程序的工作原理;3. 掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。 二、 实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)实验内容:在Linux系统中,编写一个简单的字符型设备驱动程序模块,设
2、备具有独占特性,可执行读和写操作,相关系统调用为open, close, read, write,open和close分别相当于请求和释放设备,read和write内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件/dev/mydev。实验设计:1.按照要求编写设备驱动模块,同时编写一个测试程序2.分别对其编译,注意编译时的项3.设备模块加载4.创建特殊文件5.分析执行结果6.设备模块卸载 三、实验使用环境(本次实验所使用的平台和相关软件)Linux四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)/mydev.c #ifndef _KERNEL_#
3、define _KERNEL_#endif#ifndef MODULE#define MODULE#endif#define _NO_VERSION_#include #include #include #include #if CONFIG_MODVERSIONS = 1#define MODVERSIONS#include #endif#include #include #include #include #ifndef KERNEL_VERSION#define KERNEL_VERSION(a,b,c) (a)*65536+(b)*256+(c)#endif/* Conditional
4、 compilation. LINUX_VERSION_CODE is * the code (as per KERNEL_VERSION) of this version.*/#if LINUX_VERSION_CODE KERNEL_VERSION(2,2,0)#include /* for put_user */#endif#define SUCCESS 0#define DEVICE_NAME kueng_char_dev#define BUF_LEN 50static int Device_Open =0;static char MessageBUF_LEN;static int M
5、ajor;static int mydev_open(struct inode *inode,struct file *file) if(Device_Open) return -EBUSY; Device_Open=1; MOD_INC_USE_COUNT; / 模块使用者数加,非0不能卸载return 0;static int mydev_release(struct inode *inode,struct file *file) Device_Open=0;MOD_DEC_USE_COUNT; / 模块使用者数减 return 0;static ssize_t mydev_read(st
6、ruct file *file,char *buffer, size_t length ,loff_t *f_pos) int bytes_read=0; /确认访问用户内存空间合法性 if(verify_area(VERIFY_WRITE,buffer,length)=-EFAULT) return -EFAULT; /由用户空间到系统空间复制 bytes_read=copy_to_user(buffer,Message,length); return bytes_read; static ssize_t mydev_write(struct file *file, const char *
7、buffer,size_t length,loff_t *f_pos) int len = BUF_LENlength?BUF_LEN:length; /确认访问用户内存空间合法性 if(verify_area(VERIFY_READ,buffer,length)=-EFAULT) return EFAULT; /由用户空间到系统空间复制 copy_from_user(Message,buffer,len); return length;struct file_operations Fops = release: mydev_release, open: mydev_open, read: m
8、ydev_read, write: mydev_write;int init_module(void) /设备注册 Major = register_chrdev(0,DEVICE_NAME,&Fops);if(Major0) printk(Registering character device failed with %dn,Major); return Major; printk(Registration success with Major device number %dn,Major); return 0;void cleanup_module(void) int ret; /设备
9、注销 ret = unregister_chrdev(Major,DEVICE_NAME); if(ret0) printk(Error in unregister_chrdev: %dn,ret);MODULE_LICENSE(GPL);MODULE_AUTHOR(KUENG); /test.c #include #include #include #include #include main() int testdev; int i ; char buf50= pear to dev!; printf(program test is running!n); testdev = open(/
10、dev/mydev,O_RDWR); if(testdev=-1) printf(cant open file n); exit(0); /向设备写入pear to dev! write(testdev,buf,50); printf(write %sn,buf,50); /更改buf内容为apple to dev!strcpy(buf,apple to dev!);printf(buffer is changed to %sn,buf,50); /由设备读出内容, 比较与buf不同 read(testdev,buf,50); printf(read from dev is %sn,buf); /释放设备 close(testdev);运行结果:专心-专注-专业