塊裝置驅動之記憶體模擬硬碟

2021-09-07 12:16:15 字數 1949 閱讀 8330

一.塊裝置驅動框架

與字元裝置相比什麼差別:

1.塊裝置僅僅能以塊為單位接受輸入和返回輸出。而字元裝置則以位元組為單位。大多數裝置是字元裝置,由於它們不須要緩衝並且不以固定塊大小進行操作。

2.塊裝置對於i/o請求有相應的緩衝區。因此它們能夠選擇以什麼順序進行響應,字元裝置無需緩衝且被直接讀寫。對於儲存裝置而言調整讀寫的順序作用巨大,由於在讀寫連續的扇區比分離的扇區更快。

3.符裝置僅僅能被順序讀寫,而塊裝置能夠隨機訪問。儘管塊裝置可隨機訪問,可是對於磁碟這類機械裝置而言。順序地組織塊裝置的訪問能夠提高效能。

二.驅動**

/* 參考:

* drivers\block\xd.c

* drivers\block\z2ram.c

*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static struct gendisk *ramblock_disk;

static request_queue_t *ramblock_queue;

static int major;

static define_spinlock(ramblock_lock);

#define ramblock_size (1024*1024)

static unsigned char *ramblock_buf;

/*幾何屬性*/

static int ramblock_getgeo(struct block_device *bdev, struct hd_geometry *geo)

static struct block_device_operations ramblock_fops = ;

static void do_ramblock_request(request_queue_t * q)

else //假設是寫

end_request(req, 1); }}

static int ramblock_init(void) //入口函式

static void ramblock_exit(void) //出口函式

module_init(ramblock_init);

module_exit(ramblock_exit);

module_license("gpl");

三.驅動分析

我們的驅動程式要實現的功能就是將記憶體模擬硬碟進行操作。

1. 分配gendisk結構體

2. 設定

2.1 分配/設定佇列,並將它放入結構體中,用來提供讀寫能力

2.2 設定gendisk其它資訊(主裝置號、次裝置號、名字、操作函式、容量)

操作函式:這裡面主要呼叫了ramblock_getgeo函式用來設定硬碟的屬性(儘管是ram模擬的,為了使用 老的工具還是要假裝設定一下)

3.硬體相關的操作(就是分配一塊記憶體。比較簡單)         

4. 註冊: add_disk

4.請求處理函式(塊裝置驅動的核心)

當核心須要驅動程式處理讀取、寫入以及其它的操作時。就會呼叫改函式。

static void do_ramblock_request(request_queue_t * q)

else //假設是寫

end_request(req, 1);

}}

這段**首先推斷是否有請求,假設有依據傳輸資料三要素進行設定,然後推斷讀寫,進行對應的操作。

ldd3

Linux塊裝置驅動之記憶體模擬塊裝置

用記憶體代替塊裝置的總結,相對來簡單得多,對記憶體操作想必大家都很熟悉,直接分配一塊記憶體就可以直接讀寫操作了 參考 drivers block xd.c drivers block z2ram.c define ramblock size 1024 1024 乙個扇區是512位元組 static ...

塊裝置驅動(記憶體模擬硬碟)

搜尋 blk init queut 參考 drivers block xd.c 和 drivers block z2ram.c 兩個檔案。看乙個驅動程式從 入口函式 開始看。處理函式 放到佇列 放到gendisk 其他屬性 gengdisk 最終效果,檔案系統通過處理函式來實現相應的功能.塊裝置驅動...

編寫塊裝置驅動之記憶體模擬磁碟

可以參考一下核心裡面的檔案 在核心裡面收索blk init queue 然後就會發現xd.c和z2ram.c 大概看一眼,看乙個去驅動程式從入口開始看,這裡有個register blkdev註冊塊裝置驅動,跟我們字元裝置相比少了乙個fops,註冊塊裝置已經退化了,它只不過是cat prok devi...