Linux塊裝置驅動

2021-06-14 14:09:29 字數 1075 閱讀 4258

塊裝置提供塊裝置提供裝置的訪問,裝置的訪問,可以隨機的以固定大小的塊傳輸資料,例如我們最為常見的磁碟裝置,當然塊裝置和字元裝置有較大差別,塊裝置有自己的驅動介面。簡單來說,核心決定乙個塊是固定的4096

位元組,當然該值可以隨著依賴檔案系統的變化而改變。塊裝置驅動採用register_blkdev向系統進行註冊,unregister_blkdev取消註冊,塊裝置採用操作結構 struct block_device_operations,此例子中我實現乙個面向塊的、基於記憶體的裝置驅動(下面成為sbull_drv

)。 在核心中,用struct gendisk表示單個磁碟驅動器。 struct gedisk 中的一些成員, 

塊裝置驅動必須初始化它們: major,first_minor,minors(描述被磁碟使用的裝置號,乙個驅動器必須使用最少乙個次編號),disk_name,block_device_operations,request_queue (io

請求管理結構),private_data,gendisk(需要核心操作初始化,驅動無法自行初始化該結構,而是呼叫)。

a, register_blkdev註冊塊裝置

b,初始化 struct sbull_dev,確定裝置記憶體大小,分配底層記憶體

c,初始化自旋鎖,blk_init_queue分配請求佇列,實現請求佇列和請求函式關聯

d,alloc_disk分配裝置的gendisk

,安裝初始化對應的

gendisk

結構,f

,編寫block_device_operations成員對應的功能介面函式實現,add_disk呼叫該磁碟

塊裝置驅動高效能的地方關鍵在於其請求佇列(簡單講即塊io

請求的佇列),請求佇列對等候的

io請求進行跟蹤,也可以對請求佇列進行配置成你希望處理的請求型別。請求佇列實現插入介面,使用多

i/o排程器,

i/o排程器以最大效能的方式向驅動提交請求,累計足夠多的的請求並將它們塊索引以順序排列提交給驅動,

i/o排程器還負責合併鄰近的請求。乙個請求結構被實現為乙個 bio 

結構的鍊錶,結合一些維護資訊來使驅動可以跟蹤它的位置。

linux驅動之塊裝置驅動

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

LINUX塊裝置驅動 1

編寫塊裝置驅動的關鍵步驟 1 呼叫register blkdev申請或註冊主裝置號及裝置名稱,詳見核心原始碼中該函式的注釋。不過下面這篇文章裡並未用到這一步 2 呼叫blk init queue函式建立並初始化乙個 request queue 結構,該函式需要乙個用來處理請求的do request函...

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

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