首页 > 代码库 > Ramdisk驱动的实现

Ramdisk驱动的实现

文件gao_rd.c如下

#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 GAO_RD_DEV_NAME "gao_rd" //设备名称#define GAO_RD_DEV_MAJOR 220  //主设备号#define GAO_RD_MAX_DEVICE 2    //最大设备数#define GAO_BLOCKSIZE  1024#define GAO_RD_SECTOR_SIZE 512   //扇区大小#define GAO_RD_SIZE (4*1024*1024)  //总大小#define GAO_RD_SECTOR_TOTAL (GAO_RD_SIZE/GAO_RD_SECTOR_SIZE)  //总扇区数typedef struct{   unsigned char *data;   struct request_queue *queue;   struct gendisk *gd;}gao_rd_device;static char *vdisk[GAO_RD_MAX_DEVICE];static gao_rd_device device[GAO_RD_MAX_DEVICE];static int gao_rd_make_request(struct request_queue *q, struct bio *bio)/*制造请求函数*/{   gao_rd_device *pdevice;       char *pVHDDData;   char *pBuffer;   struct bio_vec *bvec;   int i;         if(((bio->bi_sector*GAO_RD_SECTOR_SIZE) + bio-> bi_size) > GAO_RD_SIZE)   {       bio_io_error(bio/*, bio->bi_size*/);       return 0;   }   else   {              pdevice = (gao_rd_device *) bio->bi_bdev->bd_disk-> private_data;       pVHDDData = http://www.mamicode.com/pdevice->data + (bio-> bi_sector*GAO_RD_SECTOR_SIZE);>


文件Makefile如下

KERNELDIR = /usr/src/kernels/2.6.27.5-117.fc10.i686/

PWD := $(shell pwd)

CC  =gcc
obj-m := gao_rd.o
modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

    rm -rf *.o *.mod.c *.mod.o *.o *.order *.symvers

 

编译通过后,再终端依次输入

#mkdir  /root/Desktop/ramdisk/gao_rd

 

#mknod  /dev/gao_rd0 b 220 0

 

#mke2fs /dev/gao_rd0

 

#mount /dev/gao_rd0 /root/Desktop/ramdisk/gao_rd

 

Ramdisk驱动的实现