首先參考內核代碼中的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