Linux2 6核心 對塊IO層操作的討論

2021-09-07 22:01:53 字數 1354 閱讀 6746

當乙個塊被調入記憶體時(也就是說,在讀入後或等待寫出時),它要儲存在緩衝區中。每個緩衝區與乙個塊對應,它相當於是磁碟塊在記憶體中的表示。塊包含乙個或多個扇區,但大小不能超過一頁,所以一頁可以容納乙個或多個記憶體塊。由於核心在處理資料時需要一些相關的控制資訊(比如塊屬於哪個裝置,塊對應於哪個緩衝區),所以,每乙個緩衝區都有乙個對應的描述符。該描述符用 buffer_head 結構體表示,稱作緩衝區頭,在檔案  中定義,它包含了核心操作緩衝區的全部資訊。

下面給出緩衝區頭結構體和其中每乙個域的說明:

緩衝區頭的目的在於描述磁碟塊和物理記憶體緩衝區之間的對映關係。這個結構體在核心中只是扮演乙個描述符的角色,說明從緩衝區到塊的對映關係。

在2.6核心以前,緩衝區頭的作用比現在還要重要。因為緩衝區頭作為核心中的 io 操作單元,不僅僅描述了從磁碟塊到物理記憶體的對映,而且還是所有塊 io 操作的容器。但是在2.6核心以後改變了這種策略,它使用乙個新的結構 -- bio 來作為操作容器。

bio 結構體定義於 中,下面給出 bio 結構體和每個域的描述:

使用 bio 結構體的目的主要是代表正在現場執行的 io 操作,所以該結構體中的主要域都是用來管理相關資訊的,其中最重要的幾個域是 bi_io_vecs , bi_vcnt 和 bi_idx 。下圖顯示了 bio 結構體及其他結構體之間的關係。

說明:每乙個塊 io 請求都通過乙個 bio 結構體表示。每個請求包含乙個或多個塊,這些塊儲存在 bio_vec 結構體陣列中。這些結構體描述了每個片段在物理頁中的實際位置,並且像向量一樣被組織在一起。 io 操作的第乙個片段由 b_io_vec 結構體所指向,其他的片段在其後依次放置,共有 bi_vcnt個片段。當塊 io 層開始執行請求,需要使用各個片段時, bi_idx 域會不斷更新,從而指向當前片段。

新老方法的比較:

緩衝區頭和新的 bio 結構體之間存在顯著差別。bio 結構體代表的是 io操作,它可以包括記憶體中的乙個或多個頁;而另一方面,buffer_head 結構體代表的是乙個緩衝區,它描述的僅僅是磁碟中的乙個塊,所以他可能會引起不必要的分割,將請求按塊為單位劃分,只能靠以後再重新組合。由於 bio 結構體是輕量級的,它描述的塊可以不需要連續儲存區,並且不需要分割 io 操作。

Linux 2 6核心編譯,核心公升級

本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...

Linux2 6核心啟動分析

我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...

Linux 2 6 核心驅動移植

隨著 linux 2.6的發布,由於2.6核心做了教的改動,各個裝置的 驅動程式在不同程度上要進行改寫。為了方便各位linux愛好者我把自己整理的這分文件share出來。該文當列舉了2.6核心同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個函式的用法。1 使用新的入口 必須包含 ...