塊設備驅動程式
塊設備驅動程式負責實作對塊設備資料的讀寫功能,內核代碼統一使用緩沖塊間接和塊設備(如磁盤)交換資料,緩沖區資料通過塊設備驅動程式和塊設備交換資料,

塊設備的管理
塊設備表
內核通過一張塊設備表blk_dev[]管理各種塊設備,每個表項對應一個塊設備,并為每一個塊設備維護一個請求佇列,

- current_request:指向設備請求佇列第一個節點,請求佇列通過鏈表實作,
- request_fn:函式指標,用于處理請求佇列里面的讀寫請求,
設備請求佇列
內核為每個塊設備維護一個請求佇列,請求佇列中請求等待被處理,current_request指向設備請求佇列,
- 請求項
用于描述請求操作,包含讀寫磁盤扇區位置資訊、緩沖區地址資訊、操作類別(讀/寫)資訊等,
請求項資料結構:

- 請求項陣列
一塊連續記憶體,被分割為請求項大小的塊,形成陣列,充當記憶體池的角色,請求佇列中的請求項的記憶體從請求項陣列中進行分配,請求操作完成后,請求項會被釋放回該記憶體池中,
- 請求佇列
處理讀寫設備請求時,從請求項陣列中獲取一個空閑塊,建立請求項,并插入設備請求佇列中,

塊設備操作方式
在內核與塊設備進行資料交換(IO)時,涉及到三個物件之間的互動作用,其中主要需要了解系統和控制器之間的互動程序,
- 系統(內核):內核可以向控制器發送命令(發出請求)或等待設備控制器發出中斷請求(完成請求),
- 控制器:完成讀寫操作后,向系統(CPU)發出中斷,
- 驅動器:受設備控制器控制

寫資料程序
- 系統向控制器發出寫命令后,等待塊設備準備好接收資料,期間CPU需要主動查詢控制器的狀態暫存器判斷是否準備好接收資料(忙等待),
- 控制器準備好后,CPU將資料寫入控制器的快取中,(控制器具有一塊快取)
- 控制器將快取中的資料通過驅動器全部寫入塊設備,
- 向CPU發出中斷,中斷處理程式完成寫資料后的處理
讀資料程序
- 向控制器發出讀命令
- 控制器讀取磁盤資料到其快取中
- 向系統發起中斷,中斷處理程式從控制器快取中取走資料
請求佇列處理程序
ll_rw_block函式將請求放入塊設備請求佇列,設備中斷處理程式會不斷處理請求佇列,直到佇列為空,
- 寫請求的處理程序
-
ll_rw_block為寫請求建立請求項,并插入設備的請求佇列,若插入前佇列為空,則呼叫請求項操作函式(request_fn)處理當前寫請求,對塊設備進行寫操作,
-
設備塊設備完成一個寫請求后,向CPU發出中斷信號,CPU運行中斷處理函式,
-
中斷處理程式判斷是否還有資料要寫(一個請求會可能寫多個扇區),如果有則繼續寫,然后等待下一次中斷,這一程序重復直到該寫請求資料全部寫入設備,
-
完成資料寫之后,中斷處理程式將喚醒一些等待行程
- 喚醒等待該請求項有關資料的相關行程
- 喚醒等待請求項的行程(當記憶體池沒有空閑請求項時,將導致某些請求讀寫的行程睡眠)
- 釋放當前請求項并從鏈表中洗掉該請求項以及釋放鎖定的相關緩沖區,
-
喚醒等待行程后,中斷處理程式將呼叫請求項操作函式處理下一個讀/寫請求,
- 讀請求處理程序
與寫請求處理程序類似
- ll_rw_block與中斷處理程式
ll_rw_block,負責將讀寫請求放入佇列中,并啟動對請求佇列的處理,
中斷處理程式,設備完成讀寫操作后,發出中斷,不斷處理請求佇列中的請求操作,直到請求佇列為空,
相關知識
- I/O調度演算法,讀寫請求不是按訪問順序放入請求佇列的,0.11內核使用電梯演算法調度讀寫請求
總結
- 每個塊設備具有一個請求佇列,對塊設備的讀寫請求被插入到佇列中,
- 中斷處理程式不斷處理請求佇列中的請求,直到佇列為空,完成某個請求后,會喚醒一些等待的行程,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/452801.html
標籤:其他
上一篇:Rabbitmq安裝與部署
