學寫塊裝置驅動(二) 更換IO排程器

2021-06-03 00:34:55 字數 1634 閱讀 2262

上節我們的塊裝置驅動已經可以使用了,本節我們對其進行一點小的改動,修改其使用的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 當使用者開啟塊裝置檔...