首先参考内核代码中的z2ram.c
用内存模拟一个块设备驱动
具体的块设备驱动流程:
1、向内核注册块设备
int register_blkdev(unsigned int major, const char *name)
参数1:major写0表示自动获取主设备号
参数2:注册的名称
返回值:当参数1写0时 返回申请的主设备号
2、分配disk个数
struct gendisk *alloc_disk(int minors)
返回值: 通用的块设备数据结构指针
3、初始化alloc_disk返回的gendisk指针成员
1) major 主设备号的初始化
2) first_minor 第一个次设备号的初始化 一般为0
3) struct block_device_operations *fops;
向上提供的接口
4) disk_name 名称的初始化
5) 设置disk容量
static inline void set_capacity(struct gendisk *disk, sector_t size)
6) struct request_queue *queue;
请求队列的初始化
使用如下函数进行初始化:
struct request_queue *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock)
参数1:回调函数
参数2:用于解决竞态的
回调函数 request_fn_proc *rfn
1.获取请示 req = blk_fetch_request(q);
2.根据请求判断读和写操作 进行相应的memcpy
blk_init_queue
---->blk_init_queue_node
----> blk_init_allocated_queue
---> blk_queue_make_request(q, blk_queue_bio);
--->blk_queue_bio 电梯优化算法
4、将已初始化好的gendisk指针添加到内核
add_disk(struct gendisk *)
5、 blk_register_region 在dev目录下创建设备结点 名称为disk_name
6、 反向操作
blk_unregister_region 销毁设备结点
unregister_blkdev 注销块设备
del_gendisk(z2ram_gendisk); 删除gendisk
put_disk(z2ram_gendisk); 释放disk
blk_cleanup_queue(z2_queue); 释放请求队列
测试方法:
1、mkdosfs /dev/fs_blk0
2、mount /dev/fs_blk0 /mnt
3、cd /mnt
touch 1.c 2.c 3.c
4、cd ..
umount /mnt
ls查看/mnt下内容
5、再次挂载查看mnt下内容 有1.c 2.c 3.c