LINUX塊裝置驅動 1

2021-06-26 03:58:15 字數 833 閱讀 3859

編寫塊裝置驅動的關鍵步驟:

1 呼叫register_blkdev申請或註冊主裝置號及裝置名稱,詳見核心原始碼中該函式的注釋。不過下面這篇文章裡並未用到這一步

2 呼叫blk_init_queue函式建立並初始化乙個 request_queue 結構,該函式需要乙個用來處理請求的do_request函式指標和乙個控制佇列訪問的自旋鎖作為引數(自旋鎖也是必須的,但文中沒有提及而且直接使用了null,這一點似乎不太合理);

3 建立乙個block_device_operations結構,實現其中必要的函式;

4 呼叫alloc_disk建立乙個 gendisk 結構 ,  設定其主要引數如主次裝置號、最大分割槽數(次裝置號數量minors)和容量(用set_capacity函式設定)等,並用剛才建立的request_queue 結構和block_device_operations結構設定gendisk的相應字段;

5 實現 do_request 函式

6 在驅動的exit函式中,del_gendisk+put_disk可釋放gendisk結構,blk_cleanup_queue可釋放request_queue 結構,unregister_blkdev釋放裝置編號

有個疑點是,do_request函式的實現中,對request的處理有兩種方式,一種是直接使用request結構的buffer欄位來傳輸資料(這種實現方式比較簡單,本文就是使用這種方式),另一種是遍歷request結構的bio,那這兩種方式的結果一致嗎?乙個request結構中的多個bio所對應的記憶體區域並不是連續的,而如果直接使用buffer欄位也能完成相同的傳輸的話,這背後是不是還有別的機制(先將所有bio對應的資料整合到一塊,用buffer訪問)?

原文:

Linux塊裝置驅動

塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096 位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register blkdev向...

linux驅動之塊裝置驅動

塊裝置驅動的系統架構 塊裝置註冊過程 1,註冊裝置塊驅動程式 register blkdev 2,初始化請求佇列 blk init queue 3,指明扇區的大小 blk queue logical block size dev queue,sect size 4,申請乙個gendisk結構,初始化...

塊裝置驅動1 塊裝置基礎知識

塊裝置與字元裝置 1.訪問方式的不同 字元裝置按照位元組進行讀取,塊裝置按塊進行讀取 2.緩衝區 塊裝置本身驅動層支援緩衝區 軟體實現的緩衝區 所以塊裝置驅動最適合儲存裝置 儲存裝置按塊進行讀寫的特點決定 而字元裝置驅動層沒有緩衝 3.訪問的順序 塊裝置可以實現隨機的訪問,不連續塊的訪問,而字元裝置...