- 17
- 0
- 约1.81万字
- 约 19页
- 2016-12-08 发布于湖北
- 举报
广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室 2013年6月 15日
学院 计算机科学与教育软件学院 年级/专业/班 软工104 姓名 曾帆 学号 1006100012 实验课程名称 Linux操作系统分析实验 成绩 实验项目名称 Linux系统下的字符设备驱动程序编程 指导老师
一、实验目的
通过一个简单的设备驱动的实现过程。学会Linux中设备驱动程序的编写
二、实验内容
设计和实现一个虚拟命名管道(FIFO)的字符设备。写一个模块化的字符设备驱动程序
三、实验原理
Linux基本原理
四、实验设备
红旗linux ,计算机
五、实验要求
设计和实现一个虚拟命名管道(FIFO)的字符设备。我们知道,管道是进程间通信的一种方式:一个进程向管道中写数据,另一个进程从管道中读取数据,先写入的数据先读出。我们的驱动程序要实现N(N=4)个管道,每个管道对应两个设备,次设备号是偶数的设备是只写设备,次设备号是奇数的是只读设备。写入设备i(i是偶数)的字符可以从设备i+1读出。这样,我们一共就需要2N个次设备号。 我们的目标是写一个模块化的字符设备驱动程序。设备所使用的主设备号可以从尚未分配的主设备号中任选一个,/Documentation/devices.txt记录了当前版本内核的主设备号分配情况。如果设备文件系统(devfs)尚未激活,我们在加载模块之后,还必须用mknod命令创建相应的设备文件节点。 如果FIFO的写入端尚未打开,FIFO中就不会有数据可读,所以此时试图从FIFO中读取数据的进程应该返回一个错误码。如果写入端已经打开,为了保证对临界区的互斥访问,调用读操作的进程必须被阻塞。如果存在被阻塞的读者,在写操作完成后(或者关闭一个写设备时)必须唤醒它。 如果写入的数据太多,超出了缓冲区中空闲块的大小,调用写操作的进程必须睡眠,以等待缓冲区中有新的空闲块。
设备的实现
1、数据结构:
首先,我们要包含一些必要的头文件、宏和全局变量。
/*vfifo.c*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#define __NO_VERSION__
#includelinux/config.h
#includelinux/module.h
#includelinux/kernel.h
#includelinux/malloc.h
#includelinux/fs.h
#includelinux/proc_fs.h
#includelinux/errno.h
#includelinux/types.h
#includelinux/fcntl.h
#includelinux/init.h
#includeasm/system.h
#includeasm/uaccess.h
#ifndef VFIFO_MAJOR
#define VFIFO_MAJOR 241
#endif
#ifndef VFIFO_NR_DEVS
#define VFIFO_NR_DEVS 4
#endif
#ifndef VFIFO_BUFFER
#define VFIFO_BUFFER 4000
#endif
#includelinux/devfs_fs_kernel.h
devfs_handle_t vfifo_devfs_dir;
struct file_operations vfifo_fops;
int vfifo_major=VFIFO_MAJOR;
int vfifo_nr_devs=VFIFO_NR_DEVS;
int vfifo_buffer=VFIFO_BUFFER;
MODULE_PARM(vfifo_major,i);
MODULE_PARM(vfifo_nr_devs,i);
MODULE_PARM(vfifo_buffer,i);
MODULE_AUTHOR(EBUDDY);
每个实际的FIFO设备都对应于一个Vfifo_Dev{ }结构体。其中,rdq是阻塞读的等待队列,wrq是阻塞写的等待队列,base是所分配缓冲区的起始地址,buffersize是缓冲区的大小,len表示管道中已有数据块的长度,start表示当前应该读取的缓冲区位置相对于base的偏移量,即缓冲区起始数据的偏移量,readers和writers分别表示VFIFO设备当前的读者个数和写者个数,sem是用于互斥访问的信号量,r_han
原创力文档

文档评论(0)