上節我們的塊裝置驅動已經可以使用了,本節我們對其進行一點小的改動,修改其使用的io排程器。我們知道,標準磁碟的尋道延時很高,故有了io排程器存在的必要,它通過對io請求進行合併或者排序來提高塊裝置的使用效率。但是因為我們目前的塊裝置在記憶體中,即沒有通常的磁碟尋道延時,且讀寫迅速,所以我們不需要io排程器為我們做多餘的事情浪費資源。目前linux有四種io排程器,anticipatory、cfq、deadline和noop。例子這裡最適合我們的是noop,它基本對io請求什麼都不做。
我們想要更換io排程器,關鍵的函式是這麼兩個:
首先,為請求佇列選擇io排程器
int elevator_init(struct request_queue *q, char *name)
其次,由於我們使用blk_init_queue(request_fn_proc *)初始化io請求佇列時,通用塊層為我們初始化了預設的io排程器,所以我們需要下面的函式來釋放它:
void elevator_exit(struct elevator_queue *old_eq) 釋放某個請求佇列上的io排程器
更改後的simp_blkdev_init 函式 如下:
static int simp_blkdev_init(void)
//init a new io scheduler
old_e = simp_blkdev_queue->elevator;
if(is_err_value( elevator_init(simp_blkdev_queue,"noop") ) )else
//alloc the resource of gendisk
simp_blkdev_disk = alloc_disk(1);
if(!simp_blkdev_disk)
//populate the gendisk structure
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);
printk("module simp_blkdev added.\n");
return 0;
error_init_queue:
blk_cleanup_queue(simp_blkdev_queue);
error_alloc_disk:
return ret;
}
效果
沒有更換io排程器之前(cfq):
更換io排程器(noop)
linux 塊裝置驅動(二) 塊裝置資料結構
本文 於 1.塊裝置相關的資料結構以及介面 塊裝置介面則相對複雜,讀寫api沒有直接到塊裝置層,而是直接到檔案系統層,然後再由檔案系統層發起讀寫請求。一 block device block device結構代表了核心中的乙個塊裝置。它可以表示整個磁碟或乙個特定的分割槽。當這個結構代表乙個分割槽時,...
Linux裝置驅動 塊裝置(二)之相關結構體
上回最後面介紹了相關資料結構,下面再詳細介紹 核心用結構block device例項代表乙個塊裝置物件,如 整個硬碟或特定分割槽。如果該結構代表乙個分割槽,則其成員bd part指向裝置的分割槽結構。如果該結構代表裝置,則其成員bd disk指向裝置的通用硬碟結構gendisk 當使用者開啟塊裝置檔...
Linux裝置驅動 塊裝置(二)之相關結構體
上回最後面介紹了相關資料結構,下面再詳細介紹 核心用結構block device例項代表乙個塊裝置物件,如 整個硬碟或特定分割槽。如果該結構代表乙個分割槽,則其成員bd part指向裝置的分割槽結構。如果該結構代表裝置,則其成員bd disk指向裝置的通用硬碟結構gendisk 當使用者開啟塊裝置檔...