讀書筆記:寫一個塊設備驅動(1)

這個是對CU上OstrichFly的“寫一個塊設備驅動“文章的讀書筆記。

首先建立一個”常規”的塊驅動程序: ? ? ? ? ? ? ? ? ? ?

為設備申請一塊連續的內存,作為磁盤:

unsigned char simp_blkdev_data[SIMP_BLKDEV_BYTES]; /* 16*1024*1024 */

創建一個塊設備:

struct gendisk *alloc_disk(int minors); /*minors是該磁盤使用的次設備號的數目*/

simp_blkdev_disk = alloc_disk(1);

初始化請求隊列:

struct request_queue *blk_init_queue(request_fn_proc *, spinlock_t *);/*request_fn_proc是處理函數*/

simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,NULL);

塊設備相關操作:

static struct block_device_operations simp_blkdev_fops={

? ? ? ? ? ? .owner? ? ? ? = THIS_MODULE,

};

初始化塊設備參數:

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; /*塊設備的相關操作*/

simp_blkdev_disk->queue = simp_blkdev_queue; /*上面的請求隊列*/

set_capacity(simp_blkdev_disk,SIMP_BLKDEV_BYTES>>9);/*設置容量*/

然后向模塊添加這個設備:

add_disk(simp_blkdev_disk);

不要忘了在模塊退出函數中移除相關的結構:

del_gendisk(simp_blkdev_disk);

put_disk(simp_blkdev_disk);

blk_cleanup_queue(simp_blkdev_queue);

最后還有一個請求隊列處理函數:

void simp_blkdev_do_request(struct request_queue*q)

這個函數對我們塊設備(實質上是一塊內存)的請求進行處理。但是后面會被改掉。

總結:

這是整個塊驅動程序的框架,最關鍵的是對塊設備gendisk結構參數的設置,包括一些操作函數和一個請求隊列。

2016.04.10

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容