這個是對CU上OstrichFly的“寫一個塊設備驅(qū)動“文章的讀書筆記站宗。
首先建立一個”常規(guī)”的塊驅(qū)動程序: ? ? ? ? ? ? ? ? ? ?
為設備申請一塊連續(xù)的內(nèi)存窘问,作為磁盤:
unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES]; /* 16*1024*1024 */
創(chuàng)建一個塊設備:
struct gendisk *alloc_disk(int minors); /*minors是該磁盤使用的次設備號的數(shù)目*/
simp_blkdev_disk = alloc_disk(1);
初始化請求隊列:
struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *);/*request_fn_proc是處理函數(shù)*/
simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,NULL);
塊設備相關(guān)操作:
static struct block_device_operations simp_blkdev_fops={
? ? ? ? ? ? .owner? ? ? ? = THIS_MODULE,
};
初始化塊設備參數(shù):
strcpy(simp_blkdev_disk->disk_name,SIMP_BLKDEV_DISKNAME); /*設置設備名*/
simp_blkdev_disk->major = SIMP_BLKDEV_DEVICEMAJOR; /*主設備號*/
simp_blkdev_disk->first_minor = 0; /*第一個次設備號*/
simp_blkdev_disk->fops = &simp_blkdev_fops; /*塊設備的相關(guān)操作*/
simp_blkdev_disk->queue = simp_blkdev_queue; /*上面的請求隊列*/
set_capacity(simp_blkdev_disk,SIMP_BLKDEV_BYTES>>9);/*設置容量*/
然后向模塊添加這個設備:
add_disk(simp_blkdev_disk);
不要忘了在模塊退出函數(shù)中移除相關(guān)的結(jié)構(gòu):
del_gendisk(simp_blkdev_disk);
put_disk(simp_blkdev_disk);
blk_cleanup_queue(simp_blkdev_queue);
最后還有一個請求隊列處理函數(shù):
void simp_blkdev_do_request(struct request_queue*q)
這個函數(shù)對我們塊設備(實質(zhì)上是一塊內(nèi)存)的請求進行處理线衫。但是后面會被改掉玖绿。
總結(jié):
這是整個塊驅(qū)動程序的框架照宝,最關(guān)鍵的是對塊設備gendisk結(jié)構(gòu)參數(shù)的設置杨赤,包括一些操作函數(shù)和一個請求隊列茧痕。
2016.04.10