第 16 章 塊驅動

2018-02-23 16:24 更新

第?16?章?塊驅動

至今, 我們的討論一直限于字符驅動. 但是, 在 Linux 系統(tǒng)中有其他類型的驅動, 并且到時候要開闊我們的視野了. 因此, 本章討論塊驅動.

一個塊驅動提供設備的存取, 這個設備可隨機地以固定大小的塊傳送數(shù)據(jù)--主要的是, 磁盤驅動. Linux 內(nèi)核看待塊設備根本上不同于字符設備; 結果, 塊驅動有明顯不同的接口和它們自己的特殊的挑戰(zhàn).

高效的塊驅動對于性能是重要的 -- 不只是為在用戶應用程序的明確的讀和寫. 現(xiàn)代的有虛擬內(nèi)存的系統(tǒng)將不需要的數(shù)據(jù)移向(希望地)二級存儲中, 它常常是一個磁盤驅動器. 塊驅動是核心內(nèi)存和二級存儲之間的導管; 因此, 它們可組成虛擬內(nèi)存子系統(tǒng)的一部分. 雖然可能編寫一個塊驅動不必知道 struct page 和其他重要的內(nèi)存概念, 任何需要編寫一個高性能驅動的人必須使用 15 章所涉及的內(nèi)容.

許多塊層的設計圍繞性能. 許多字符設備可在它們的最大速率以下運行, 并且系統(tǒng)的總體性能不被影響. 但是如果它的塊 I/O 子系統(tǒng)沒有調整好, 系統(tǒng)不能很好地運行. Linux 塊驅動接口允許你從一個塊設備中獲得最多輸出, 但是有必要, 施加一些你必須處理的復雜性. 好的是, 2.6 的塊接口比之前的內(nèi)核很大提高.

如你會期望的, 本章的討論集中在一個例子驅動, 它實現(xiàn)了一個面向塊的, 基于內(nèi)存的設備. 基本上, 它是一個 ramdisk. 內(nèi)核硬件包含了一個很高級的 ramdisk 實現(xiàn), 但是我們的驅動(稱為 sbull)讓我們演示創(chuàng)建一個塊驅動, 同時最小化無關的復雜性.

在進入細節(jié)之前, 我們精確定義幾個詞語. 一個塊是一個固定大小的數(shù)據(jù)塊, 大小由內(nèi)核決定. 塊常常是 4096 字節(jié), 但是這個值可依賴體系和使用的文件系統(tǒng)而變化. 一個扇區(qū), 相反, 是一個小塊, 它的大小常常由底層的硬件決定. 內(nèi)核期望處理實現(xiàn) 512-字節(jié)扇區(qū)的設備. 如果你的設備使用不同的大小, 內(nèi)核調整并且避免產(chǎn)生硬件無法處理的 I/O 請求. 但是, 它值得記住, 任何時候內(nèi)核給你一個扇區(qū)號, 它是工作在一個 512-字節(jié)扇區(qū)的世界. 如果你使用不同的硬件扇區(qū)大小, 你必須相應地調整內(nèi)核的扇區(qū)號. 我們在 sbull 驅動中見如何完成這個.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號