
用内存代替块设备的总结,相对来简单得多,对内存操作想必大家都很熟悉,直接分配一块内存就可以直接读写操作了
/* 参考:
* drivers\block\xd.c
* drivers\block\z2ram.c
*/
#define RAMBLOCK_SIZE (1024*1024)//一个扇区是512字节
static struct gendisk *ramblock_disk;
static struct request_queue *ramblock_queue;
static DEFINE_SPINLOCK(ramblock_lock);//定义一个自旋锁
static unsigned char *ramblock_buf;
static struct block_device_operations ramblock_fops = {//fops结构体,必须要。struct hd_geometrystruct hd_geometry
.owner= THIS_MODULE,
.getgeo= ramblock_getgeo,//设置heads /cylinders/sectors
};
static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{
/* 容量=heads*cylinders*sectors*512 */
geo->heads = 2;//柱头
geo->cylinders = 32;//柱面
geo->sectors = RAMBLOCK_SIZE/2/32/512;//扇区
return 0;
}
static int ramblock_init(void)
{
/* 1. 分配一个gendisk结构体 */
ramblock_disk = alloc_disk(16); /* 次设备号个数: 分区个数+1 */
/* 2. 设置 */
/* 2.1 分配/设置队列: 提供读写能力 */
ramblock_queue = blk_init_queue(do_ramblock_request, &ramblock_lock);//do_ramblock_request请求队列函数
ramblock_disk->queue = ramblock_queue;
/* 2.2 设置其他属性: 比如容量 */

major = register_blkdev(0, "ramblock"); /* cat /proc/devices */
ramblock_disk->major = major;
ramblock_disk->first_minor = 0;
sprintf(ramblock_disk->disk_name, "ramblock");//把ramblock打印到ramblock_disk->disk_name
ramblock_disk->fops = &ramblock_fops;
set_capacity(ramblock_disk, RAMBLOCK_SIZE / 512);//设置容量
. 硬件相关操作 */
ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);//分配一个读写缓冲区
/* 4. 注册 */
add_disk(ramblock_disk);
}
static void do_ramblock_request(struct request_queue * q)//当读写的时候调用这个函数
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-48359-1.html
我是卖假货起家的
当然来鬼城的难民是限制条件的