设备管理--Linux设备驱动程序
安装(总4页)
--本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小--
集美大学计算机工程学院实验报告
课程名称:操作系统 指导教师: 实验项目名称:
设备管理——Linux设备驱动程序安装 实验项目编号:
一、 目的(本次实验所涉及并要求掌握的知识点)
班级:xxx 姓名:xxx 学号:xxxx 组号:
实验成绩:
上机实践日期:xxx 上机实践时间: 2 学时
1. 认识Linux的设备的种类和设备工作方式;
2. 理解设备驱动程序的工作原理;
3. 掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。
二、 实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)
实验内容:
在Linux系统中,编写一个简单的字符型设备驱动程序模块,设备具有独占特性,可执
行读和写操作,相关系统调用为open, close, read, write,open和close分别相当于请求和释放设备,read和write内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件/dev/mydev。
实验设计:
1.按照要求编写设备驱动模块,同时编写一个测试程序 2.分别对其编译,注意编译时的项 3.设备模块加载 4.创建特殊文件 5.分析执行结果 6.设备模块卸载
三、实验使用环境(本次实验所使用的平台和相关软件)
Linux
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
LINUX_VERSION_CODE is
* the code (as per KERNEL_VERSION) of this version. */
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0) #include
#define SUCCESS 0
#define DEVICE_NAME \
2
#define BUF_LEN 50
static int Device_Open =0; static char Message[BUF_LEN]; static int Major;
static int mydev_open(struct inode *inode,struct file *file) {
if(Device_Open) return -EBUSY; Device_Open=1;
MOD_INC_USE_COUNT; // 模块使用者数加1,非0不能卸载 return 0; }
static int mydev_release(struct inode *inode,struct file *file) {
Device_Open=0;
MOD_DEC_USE_COUNT; // 模块使用者数减1 return 0; }
static ssize_t mydev_read(struct 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 *buffer,size_t length,loff_t *f_pos) {
int len = BUF_LEN 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, 3