/*参考drivers/block/xd.c
*以及drivers/block/z2ram.c
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/genhd.h>
#include <linux/hdreg.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/wait.h>
#include <linux/blkdev.h>
#include <linux/mutex.h>
#include <linux/blkpg.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/gfp.h> #include <asm/uaccess.h>
#include <asm/dma.h> static struct gendisk *ramblock_disk;
static struct request_queue *ramblock_queue;
static DEFINE_SPINLOCK(ramblock_lock); #define RAMBLOCKSIZE (1024*1024)
static int major;
static unsigned char *ramblock; static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{ geo->heads = ;
geo->sectors = ;
geo->cylinders = RAMBLOCKSIZE///;
return ;
} static const struct block_device_operations ramblock_fops = {
.owner = THIS_MODULE,
.getgeo = ramblock_getgeo,
}; static void do_ramblock_request (struct request_queue * q)
{
static int cnt = ;
struct request *req; printk("do_ramblock_request %d : \n",++cnt);
req = blk_fetch_request(q);
while(req){
unsigned long start = blk_rq_pos(req) << ; //源
unsigned long len = blk_rq_cur_bytes(req); //长度
/*目的:req->buffer*/
if (rq_data_dir(req) == READ)
memcpy(req->buffer, ramblock+start, len);
else
memcpy(ramblock+start, req->buffer, len); if (!__blk_end_request_cur(req, ))
req = blk_fetch_request(q);
}
} static int ramblock_init(void)
{
ramblock_disk = alloc_disk(); //次设备号个数,分区数+1 ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock); major = register_blkdev(, "ramblock"); // /dev/ramblock ramblock_disk->major = major;
ramblock_disk->first_minor = ;
sprintf(ramblock_disk->disk_name, "ramblock");
ramblock_disk->fops = &ramblock_fops;
ramblock_disk->queue = ramblock_queue;
set_capacity(ramblock_disk, RAMBLOCKSIZE/); //设置容量,以扇区512字节为单位 ramblock = kzalloc(RAMBLOCKSIZE,GFP_KERNEL);
if(ramblock == NULL){
printk("alloc ramblock failed!\n");
return -;
}
add_disk(ramblock_disk);
return ;
} static void ramblock_exit(void)
{
del_gendisk(ramblock_disk);
unregister_blkdev(major,"ramblock");
blk_cleanup_queue(ramblock_queue);
put_disk(ramblock_disk);
kfree(ramblock);
} module_init(ramblock_init);
module_exit(ramblock_exit); MODULE_LICENSE("GPL");
MODULE_AUTHOR("1653699780@qq.com");

最新文章

  1. 介绍对称加密的另一个算法——PBE
  2. RAC Concept
  3. Jmeter函数 唯一取值 笔记
  4. fifter常见的运用场景
  5. html及css常用的单词
  6. Mac下Erlang环境安装
  7. VS2010安装中遇到的错误
  8. 10409 - Die Game
  9. Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
  10. new关键字在虚方法的动态调用中的阻断作用
  11. 2014:超越炒作,进入部署SDN的时代
  12. hdu4300之KMP&amp;&amp;EKMP
  13. OI不得不知的那些数学定理
  14. Fedora 17 安装 完全 指南
  15. VC实现URL编解码器
  16. DRP——Servlet(一)
  17. Android View系统解析(上)
  18. Winform制作圆弧panel
  19. [国嵌笔记][029][ARM处理器启动流程分析v2]
  20. IP判断

热门文章

  1. SQL Server -&gt;&gt; 尝试优化ETL中优化Merge性能
  2. Stack vs Heap
  3. .Net中初探Redis
  4. 【Leetcode】【Easy】Path Sum
  5. Mac os下profile设置
  6. 【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.3.函数调用与执行
  7. shared_ptr 的使用及注意事项
  8. 自开发Web应用和SAP Customer Data Cloud Identity服务的集成
  9. maven构建报错org.apache.maven.lifecycle.LifecycleExecutionException
  10. c++由string组成的struct初始化崩溃