集美大学计算机工程学院实验报告
班级:xxx 姓名:xxx 学号:xxxx 组号:
课程名称:操作系统 指导教师: 实验项目名称:
设备管理——Linux设备驱动程序安装 实验项目编号:
一、 目的(本次实验所涉及并要求掌握的知识点)
实验成绩:
上机实践日期:xxx 上机实践时间: 2 学时
1. 认识Linux的设备的种类和设备工作方式;
2. 理解设备驱动程序的工作原理; 3. 掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。
二、 实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析、电路图)
实验内容:
在Linux系统中,编写一个简单的字符型设备驱动程序模块,设备具有独占特性,可执行读和写操作,相关系统调用为open, close, read, write,open和close分别相当于请求和释放设备,read和write内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件/dev/mydev。
实验设计:
1.按照要求编写设备驱动模块,同时编写一个测试程序 2.分别对其编译,注意编译时的项 3.设备模块加载 4.创建特殊文件 5.分析执行结果 6.设备模块卸载
三、实验使用环境(本次实验所使用的平台和相关软件)
Linux
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
///////////////////////////////////////////////////
mydev.c
#ifndef __KERNEL__ #define __KERNEL__ #endif
#ifndef MODULE #define MODULE #endif
#define __NO_VERSION__ #include
#include
#include
#include
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c)) #endif
/* Conditional 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 \#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, read: mydev_read, write: mydev_write }; int init_module(void) { //设备注册 Major = register_chrdev(0,DEVICE_NAME,&Fops); if(Major<0) { printk(\ return Major; } printk(\ return 0; } void cleanup_module(void) { int ret; //设备注销 ret = unregister_chrdev(Major,DEVICE_NAME); if(ret<0) printk(\} MODULE_LICENSE(\MODULE_AUTHOR(\ /////////////////////////////////////////////////////// test.c #include int testdev; int i ; char buf[50]= \ printf(\ testdev = open(\ if(testdev==-1) { printf(\ exit(0); } //向设备写入\ write(testdev,buf,50); printf(\ //更改buf内容为\ strcpy(buf,\ printf(\ //由设备读出内容, 比较与buf不同 read(testdev,buf,50); printf(\ //释放设备 close(testdev); } 运行结果: