注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

内存模拟磁盘之源代码  

2012-09-22 12:29:57|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/device.h>
#include <linux/blkdev.h>
#include <linux/hdreg.h>

#include <asm/uaccess.h>
#include <asm/io.h>
#include <mach/regs-gpio.h>
#include <linux/gpio.h>

#define RAMBLK_SIZE (1024*1024)

static struct gendisk *myramblk_gendisk;
static struct request_queue *ramblk_queue;
static unsigned char *ramblk_buffer;
static int major;

static DEFINE_SPINLOCK(ramblk_lock);

static int ramblk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{
geo->heads = 2;
geo->cylinders = 36;
geo->sectors = RAMBLK_SIZE/2/36/512;
return 0;
}


struct block_device_operations ramblk_fops = {
.owner = THIS_MODULE,
.getgeo = ramblk_getgeo,//如果要实现分区的话,就必须要提供这个函数
};

static void req_handler(struct request_queue * q)
{
unsigned long offset;
unsigned long len;
struct request *req;
req = blk_fetch_request(q);
while(req)
{
offset = blk_rq_pos(req)<<9;
len = blk_rq_cur_bytes(req);
if(rq_data_dir(req) == READ)
{
memcpy(req->buffer , ramblk_buffer+offset , len);
}
else
{
memcpy(ramblk_buffer+offset , req->buffer , len);
}
if((blk_end_request_cur(req ,0))== 0)
{
req = blk_fetch_request(q);
}
}
}

static int ramblock_init(void)
{
myramblk_gendisk = alloc_disk(16);//表示能有多少个分区,16表示最多15个分区
major = register_blkdev(0 ,"ramblock");
ramblk_queue = blk_init_queue(req_handler , &ramblk_lock);
myramblk_gendisk->queue = ramblk_queue;

myramblk_gendisk->major = major; 
myramblk_gendisk->first_minor = 0; 
myramblk_gendisk->fops = &ramblk_fops;//即便没有用到其中的函数也要提供这个结构体

sprintf(myramblk_gendisk->disk_name, "ramblock");//设置磁盘的名字,这个也不能少
ramblk_buffer = kzalloc(RAMBLK_SIZE , GFP_KERNEL);

set_capacity(myramblk_gendisk, RAMBLK_SIZE/512);//这个容量是以扇区为单位的
add_disk(myramblk_gendisk);
return 0;
}

static void ramblock_exit(void)
{
del_gendisk(myramblk_gendisk);//这个要放在前面
kfree(ramblk_buffer);
blk_cleanup_queue(ramblk_queue);
unregister_blkdev(major ,"ramblock");
put_disk(myramblk_gendisk);
}

module_init(ramblock_init);
module_exit(ramblock_exit);
MODULE_LICENSE("GPL");

  评论这张
 
阅读(681)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017