linux简单虚拟硬盘驱动分析报告.docVIP

  • 2
  • 0
  • 约6.19千字
  • 约 11页
  • 2018-11-14 发布于江苏
  • 举报
linux简单虚拟硬盘驱动分析报告

HYPERLINK /gui694278452/article/details/7638745 linux简单虚拟硬盘驱动分析 2012-06-06 16:15 122人阅读 HYPERLINK /gui694278452/article/details/7638745 \l comments#comments 评论(0) HYPERLINK javascript:void(0); \o 收藏 收藏 HYPERLINK /gui694278452/article/details/7638745 \l report#report \o 举报 举报 #include linux/init.h #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/errno.h #include linux/types.h #include linux/fcntl.h #include linux/vmalloc.h #include linux/hdreg.h #include linux/blkdev.h #include linux/blkpg.h #include asm/uaccess.h #define VHDD_DEV_NAME vhdd #define VHDD_DEV_MAJOR 220 #define VHDD_MAX_DEVICE 2 #define VHDD_MAX_PARTITONS 16 /*vhdd可以进行分区,允许的分区总共为15个,因此总分区数应为16*/ //#define VHDD_DEVICE_SIZE (4*1024*1024) /*vhdd ram disk模拟了硬盘,因此要定义相应的内容。 扇区大小为512字节,可以任意指定 圆柱面(cylinder)书设定为256 每个cylinder的扇区数设定为16 磁头数(VHDD_HEADS)设为2 一台设备容量为(扇区大小*圆柱面数*扇区数*磁头数),这里=4M,应为disk提供的大小相一致 */ #define VHDD_SECTOR_SIZE 512 #define VHDD_SECTORS 16 #define VHDD_HEADS 2 #define VHDD_CYLINDERS 256 #define VHDD_SECTOR_TOTAL (VHDD_SECTORS*VHDD_HEADS*VHDD_CYLINDERS) #define VHDD_SIZE (VHDD_SECTOR_SIZE*VHDD_SECTOR_TOTAL) typedef struct { unsigned char *data; struct request_queue *queue; spinlock_t lock;/*分别管理自己的lock*/ struct gendisk *gd; }vhdd_device; //char *vdisk[VHDD_MAX_DEVICE] = {NULL,}; extern char *vdisk[VHDD_MAX_DEVICE]; static vhdd_device device[VHDD_MAX_DEVICE]; /*vhdd为模拟硬盘的运行,使用内核定时器启动中断(interrupt)。为了使用内核定时器,定义 了timer_list结构体变量vhdd_timer。另外,为了处理请求函数的重入定义了vhdd_busy变量。该值不为0时,块设备驱动程序的请求处理函数vhdd_request()就会处于运行状态。这不仅仅是中断的启动方式,也是必要的变量,因为整体设备会因一个中断而运行*/ static struct timer_list vhdd_timer; static int vhdd_busy=0; static void vhdd_request(struct request_queue *q) { vhdd_device *pdevice; struct request *vhdd_req; char *pData; int size; if(vhdd_busy) return;/*先检查当前块设备是否处于处理请求的状态,如果处于处理状态,就立即终止函数。这是因为处理中断的过程中还会调用vhdd_request函数*/ while(1) { vhdd_req = elv_next_request(q); if(!vhdd_req) return;/*vhdd_request函数反复执行,知道处理完等待中的所有请求。使用elv_next_request函数获得处理请求。若处理请求的request结构体地

文档评论(0)

1亿VIP精品文档

相关文档