頁快取記憶體 二

2021-06-01 08:06:23 字數 1961 閱讀 8795

五. 把塊放在頁快取記憶體中

在舊的linux核心版本中,有兩種不同的磁碟快取記憶體,分別是頁快取記憶體和緩衝區快取記憶體,前者用來存放訪問磁碟檔案內容時生成的磁碟資料頁,後者把通過vfs訪問的塊的內容保留在記憶體中。從2.4.10版本開始,緩衝區快取記憶體不存在了,把它們存放在叫做」緩衝區頁」的專門頁中,頁緩衝區頁儲存在頁高速緩衝中。緩衝區頁在形式上就是與稱做」緩衝區首部」的附加描述符相關的資料頁,主要目的是快速確定頁中的乙個塊在磁碟中的位址。

(1) 塊緩衝區和緩衝區首部

每個塊緩衝區是由buffer_head結構體來描述的。其實資料結構如下。

struct buffer_head ;
b_bdev欄位表示包含塊的塊裝置,通常是磁碟或分割槽;b_blocknr欄位存放邏輯塊號,即塊在磁碟或分割槽中的編號。b_data欄位表示塊緩衝區在緩衝區中的位置。如果在高階記憶體,b_data欄位存放的是塊緩衝區相對於頁的起始位置的偏移量,否則,b_data存放的是塊緩衝區的線性位址。

(2) 管理緩衝區首部

緩衝區首部的空間分配是slab分配器來完成的,其描述符kmem_cache_s存在變數bh_cachep中。使用alloc_buffer_head()和free_buffer_head()函式來完成緩衝區首部的空間分配和釋放。

當核心控制路徑訪問塊緩衝區時,應該先遞增引用計數器,就也是緩衝區首部的b_count欄位。確定塊在頁高速緩衝中的位置函式(__getblk())自動完成這個工作。當核心控制路徑停止訪問塊緩衝區時,應該呼叫__breles()或__bforget()函式遞減相應的引用計數器。

(3) 緩衝區頁

只要核心必須單獨訪問乙個塊,就要涉及存放塊緩衝區的緩衝區頁,並要檢查相應的緩衝區首部。第一,當讀或寫的檔案頁在磁碟塊中不相鄰時,第

二、當訪問乙個單獨的磁碟塊時。都需要建立緩衝區頁。

重點說第二種,因為是塊裝置驅動,乙個緩衝區頁可以包括1到8個緩衝區,乙個緩衝區的的大小為1k,而頁的大小為4k,所以可以包括四個緩衝區。其圖如下

(4) 分配塊裝置緩衝區頁

前面說分配緩衝的首部,其實原理都是一樣的,都是在什麼時候分配什麼空間,核心發現指定塊的緩衝區所在頁不在頁快取記憶體中時,就分配乙個新的塊裝置緩衝區頁。

六. 向通用塊層提交緩衝區首部

submit_bh()和ll_rw_block函式用來向通過塊傳遞乙個或多個緩衝區首部,並由此請求傳輸乙個資料塊,引數為傳輸的方向(讀或寫)

int submit_bh(int rw, struct buffer_head * bh)

第14行呼叫bio_alloc()函式分配乙個新的bio描述符

第16行把塊中的第乙個扇區的號賦給bi_sector欄位

第17行把塊裝置描述的位址賦給bi_bdev欄位

第18-20行初始化bi_io_vec陣列的第乙個元素。

第22行把bi_vcnt置為1

第23行把bi_idx置為0(將要傳輸的當前段)

第24行把塊大小賦給bi_size欄位

第26行把end_bio_bh_io_sync()的位址賦給bi_end_io欄位。

第27行把緩衝區首部的位址賦給bi_private欄位。

第29行遞增bio的引用計數器

第30行呼叫submit_bio函式,把bi_rw標誌設定為資料傳輸的方向,更新每個cpu變數page_states以表示讀和寫的扇區數,並對bio描述符呼叫generic_make_request()函式。

第35行遞減bio的使用計數器。

七.總結

到這裡,頁高速緩衝基本上完成了它的任務,把快取區頭提交到通用塊層,由它處理,當然還有髒頁寫回磁碟,這裡面不介紹了,可以檢視資料,頁快取記憶體主是提高磁碟上的檔案或塊裝置資料的讀寫效率,如果在頁快取記憶體中的頁是最新的頁,直接讀取,是髒頁寫回磁碟。在寫回磁碟過程中,可以有一些系統呼叫函式供使用者使用。除了頁快取記憶體外,還有索引節點快取,目錄項快取,交換區快取等。

參考資料

深入理解linux核心

14 頁快取記憶體

絕大多數情況,核心讀寫磁碟時都引用頁快取記憶體。因為核心的資料與 不從磁碟讀。所以頁快取記憶體一般為以下型別 普通檔案資料的頁 目錄的頁 直接從塊裝置檔案讀出的頁等。頁快取記憶體中每個頁包含的資料肯定屬於某個檔案,這個檔案叫做它的所有者。若非 o direct 標誌被置位,所有檔案讀寫都依賴於快取記...

頁快取記憶體與頁回寫

訪問物理記憶體的速度遠快於訪問磁碟的速度 所以把經常使用的資料快取到物理記憶體 頁快取記憶體 訪問磁碟可直接變為訪問物理記憶體的方式 頁快取記憶體是由記憶體中的物理頁面組成的 內容對應磁碟上的物理塊 讀快取當核心開始乙個讀操作時 它首先會檢查需要的資料是否再頁快取記憶體中 如果在就放棄訪問磁碟 直接...

每CPU頁框快取記憶體

在 linux頁框級記憶體管理處理細節 一篇博文中,我們談到核心呼叫alloc pages等系列函式分配乙個或一片連續的頁框。這一系列函式本質上是使用夥伴演算法從指定zone t中取到乙個或一片連續的空閒的頁框。正如我們將在以後重點博文 slab分配器 所看到的,核心經常請求和釋放單個頁框。為了提公...