曾帆_1006100012_设备驱动论述.docVIP

  • 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)

1亿VIP精品文档

相关文档