裝置驅動程式與核心模組

區塊裝置(block device)

想像一整面編了號的置物櫃,而不是流動的水龍頭:你可以先開 5 號櫃、再開 900 號、再開 12 號,順序任意,而每個櫃子都放固定份量。區塊裝置是核心對「以固定大小區塊定址、可任意順序存取的儲存」的模型——硬碟、SSD、USB 隨身碟。不像字元裝置那種嚴格的位元組串流,區塊裝置支援隨機存取:讀第 1000 個區塊、寫第 7 個、跳到任何地方。

區塊驅動程式不像字元驅動程式那樣提供簡單的 read/write 處理常式。取而代之,核心的區塊層會收集、排序並合併 I/O 成一個請求佇列(request queue),並交給驅動程式一些 bio 或 request 結構,描述「把這些磁區搬到/搬出這些記憶體分頁」。驅動程式的工作是從佇列取下一個請求、設定硬體去搬那些磁區(通常透過 DMA),並在傳輸完成時發出完成信號。位於應用程式與驅動程式之間的是分頁快取與 I/O 排程器,這正是為什麼寫入能被緩衝並重新排序以提升效率,也是為什麼 write() 可能在資料真正落到碟片前就回傳。

區塊裝置之所以重要,是因為所有持久儲存與其上的檔案系統都建立在這個模型上。一個重要的誠實:本領域涵蓋的是區塊「驅動程式」——與單一儲存硬體溝通的最底層。它上方龐大的機制(分頁快取、I/O 排程器、日誌、檔案系統)是另一個獨立的堆疊。此外,區塊裝置裡的「區塊」與阻塞或非阻塞呼叫毫無關係;它指的是作為定址單位的固定大小區塊。

// 區塊層交給驅動程式的是請求,而非位元組層級的 read(): // request:把磁區 2048..2055 讀進分頁 P // 驅動程式:設定 DMA、命令磁碟搬那些磁區, // 然後在中斷時 blk_mq_end_request(rq, status)

區塊驅動程式消耗的是描述磁區傳輸的佇列請求,而非逐位元組讀取;完成是非同步發出信號的。

此處的「區塊」指固定大小的可定址單位,不是「會阻塞的呼叫」。本領域只涵蓋區塊「驅動程式」;其上的分頁快取、I/O 排程器與檔案系統是另一層。

又称
block device driver區塊型裝置