天天看點

Linux核心中采用了一種同時适用于32位和64位系統的記憶體分頁模型

Linux核心中采用了一種同時适用于32位和64位系統的記憶體分頁模型,對于32位系統來說,兩級頁表足夠用了,而在x86_64系統中,用到了四級頁表,如圖2-1所示。四級頁表分别為:

頁全局目錄(Page Global Directory)

頁上級目錄(Page Upper Directory)

頁中間目錄(Page Middle Directory)

頁表(Page Table)

頁全局目錄包含若幹頁上級目錄的位址,頁上級目錄又依次包含若幹頁中間目錄的位址,而頁中間目錄又包含若幹頁表的位址,每一個頁表項指向一個頁框。Linux中采用4KB大小的頁框作為标準的記憶體配置設定單元。

折疊編輯本段系統特點

在實際應用中,經常需要配置設定一組連續的頁框,而頻繁地申請和釋放不同大小的連續頁框,必然導緻在已配置設定頁框的記憶體塊中分散了許多小塊的空閑頁框。這樣,即使這些頁框是空閑的,其他需要配置設定連續頁框的應用也很難得到滿足。

為了避免出現這種情況,Linux核心中引入了夥伴系統算法(buddy system)。把所有的空閑頁框分組為11個塊連結清單,每個塊連結清單分别包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續頁框的頁框塊。最大可以申請1024個連續頁框,對應4MB大小的連續記憶體。每個頁框塊的第一個頁框的實體位址是該塊大小的整數倍。

假設要申請一個256個頁框的塊,先從256個頁框的連結清單中查找空閑塊,如果沒有,就去512個頁框的連結清單中找,找到了則将頁框塊分為2個256個頁框的塊,一個配置設定給應用,另外一個移到256個頁框的連結清單中。如果512個頁框的連結清單中仍沒有空閑塊,繼續向1024個頁框的連結清單查找,如果仍然沒有,則傳回錯誤。

頁框塊在釋放時,會主動将兩個連續的頁框塊合并為一個較大的頁框塊。

繼續閱讀