天天看點

塊裝置驅動

    在Linux下,驅動裝置有字元裝置驅動、塊裝置驅動和網絡裝置驅動三種,之前學習了字元裝置驅動,現在開始學習塊裝置驅動。首先來比較看這兩種裝置驅動有何不通,為什麼要分割成不同類型的驅動。舉一個例子說明引入塊裝置驅動的必要:

假如按照字元裝置一樣的架構去構造驅動,如圖:

塊裝置驅動

則需要頻繁地對儲存設備進行擦除,如果使用另一種架構構思(塊裝置思想):

塊裝置驅動

對比之下,對于這樣的儲存設備,則引入塊裝置顯然使得操作的效果大為提高。由此可知塊裝置的特點就是:把請求放入隊列,優化後執行。

字元裝置與塊裝置I/O操作的差別:

a.塊裝置隻能按照塊為機關進行輸入輸出,而字元裝置則是以位元組為機關。大多數裝置都是字元裝置,因為它們不需要緩沖而且不是以固定塊大小操作。

b.塊裝置對應I/O請求有對應的緩沖區,是以它們可以以選擇任意順序來響應,字元裝置無需緩沖區且可以直接讀寫。對于儲存設備而言,調整順序十分重要,因為讀寫連續扇區比分離扇區快。

c.字元裝置隻能被順序讀寫,而塊裝置可以随機通路。

    類比于字元裝置,在塊裝置中,有一個類似于字元裝置中file_operations的結構體:block_device_operations;在Linux核心中,使用一個gendisk結構體來表示一個獨立的磁盤裝置或分區;在Linux核心中,使用一個queue隊列來管理這個裝置的I/O請求。這就是塊裝置的大體構架。

    編寫塊裝置驅動程式的架構主要為:

1.用alloc_disk(int minors);來配置設定gendisk結構體

2.設定gendisk結構體

3.配置設定/設定queue隊列

4.設定gendisk的其他資訊(如:容量)

5.注冊gendisk結構體:add_disk

相關操作函數:

struct gendisk *alloc_disk(int minors);//配置設定gendisk結構體

void add_disk(struct gendisk *disk);//注冊gendisk結構體

request_queue_t *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock);//配置設定隊列,rfn為一個請求處理函數,lock是一個自旋鎖

int register_blkdev(unsigned int major, const char *name);////注冊塊裝置,name在注冊驅動後,對應 cat /proc/devices裡的名字

例子:

塊裝置驅動
塊裝置驅動
塊裝置驅動

繼續閱讀