设备管理--Linux设备驱动程序安装

2020-08-09 18:55

集美大学计算机工程学院实验报告

班级: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 #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 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 #include #include #include #include main() {

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); }

运行结果:


设备管理--Linux设备驱动程序安装.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:嘉禾博研MBA模考试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: