塊裝置只能以快為單位接收輸入和返回輸出。
假設我應用程式也是open read write,塊裝置裡面也是給它提供open read write函式,然後來操作硬體
我們舉例來驗證
1.硬碟
硬碟的格式像光碟一樣乙個乙個盤面
然後這一面上有乙個乙個的環像跑到一樣的東西,這一環一環一樣的東西稱為柱面
跑道上面有乙個乙個的塊稱為扇區,分別是扇區0,扇區1。
我們假設有這麼一種操作
讀扇區0 寫扇區n 讀扇區1
如果我們也想字元裝置驅動一樣,直接提供讀寫函式,它會怎麼做呢?
讀扇區0 然後跳到扇區n,然後又跳回去讀扇區1
跳了兩次,實際上我們磁碟的讀寫是非常快的,慢在這個機械結構的讀寫裝置的定位上面,從扇區0跳到扇區n然後又跳到扇區1非常浪費時間,如果按照字元裝置的1 2 3 來做的話總體效率就會非常的低。那麼假設調整優化一下,我1 2 3 先不執行,我們把它改為 1 3 2。我讀完扇區0 就可以讀扇區1 然後寫扇區n 就不需要跳來跳去了,那我只需要跳動一次。因為扇區0 和1 是緊接的 扇區n和0 1 不在同乙個柱面上。只需要跳動一次,整體效率就大為提高。
我們這裡注意乙個概念,先不執行,優化後在執行,對硬碟有這個要求。對這個我們先不執行,先放到乙個佇列裡面去,然後優化後再執行。
這是硬碟,那麼對於不是硬碟有這個要求沒,我們來看看flash
它也有這個要求。對於乙個flash也有乙個乙個塊,塊裡面有若干個扇區,我假設我有這麼兩個要求,1.寫扇區0,2寫扇區1.如果我們像字元裝置一樣讀寫這些扇區會導致什麼後果呢???
對於flash要先擦除才能寫,但是擦除是整塊整塊擦除的,但不能破環其他塊的資料,先讀出整塊,讀到某個buffer裡。然後修改buffer裡扇區0的資料,3.擦除整塊 4.燒寫整塊。
寫扇區1也是一樣的。如果像字元裝置那樣,就比較麻煩。我們優化一下,1先不執行,放入佇列 2.優化後執行. 就是合併。怎麼合併呢,我們經過一下幾步 1.讀出整塊,2.修改2個扇區,3.擦除 4 燒寫 如果我們何必的話就只要操作一次,不合併的話要操作兩次,速度大為降低。
所以塊裝置不能像字元裝置一樣直接提供讀寫函式,而是1.把讀寫放入佇列先不執行
2.優化後再執行
塊裝置驅動
若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...
塊裝置驅動程式的引入和簡單應用
先說說為什麼要引入塊裝置驅動程式。以flash為例,如果對flash的讀寫採用字元裝置驅動程式的那一套的話,會產生效率低下的問題。flash是以塊為單位進行操作的,假如在flash乙個塊中,要完成對扇區0和扇區1的改寫,如果按照字元裝置的方式,需要完成以下步驟 讀出整個塊到buffer 修改buff...
裝置驅動 塊裝置驅動程式
塊裝置驅動程式提供對面向塊的裝置的訪問,這種裝置以隨機訪問的方式傳輸資料,並且資料總是具有固定大小的塊。典型的塊裝置是磁碟驅動器,也有其它型別的塊裝置。塊裝置和字元裝置有很大區別。比如塊裝置上可以掛載檔案系統,字元裝置不可以。這是隨機訪問帶來的優勢,因為檔案系統需要能按塊儲存資料,同時更需要能隨機讀...