天天看點

Linux 記憶體管理 —— 高端記憶體

文章目錄

  • ​​0. 參考資料​​
  • ​​1.1 程序線性位址空間劃分​​
  • ​​1.2 x86 體系架構下的兩種硬體限制​​
  • ​​1.3 應對硬體限制的方法​​

0. 參考資料

  1. ​​https://www.zhihu.com/question/280526042​​

1.1 程序線性位址空間劃分

在 32 位作業系統中,最大可尋址範圍為 4G,這就意味着虛拟位址空間(線性位址空間)有 4G,程序位址劃分方式是:0~3G使用者空間、3~4G核心空間,使用者程序最多隻可以通路3G線性位址空間。

Linux 記憶體管理 —— 高端記憶體

1.2 x86 體系架構下的兩種硬體限制

  1. ISA 總線下的直接記憶體存取(DMA):隻能對RAM前16MB位址進行尋址;
  2. 大容量RAM的32位計算機中(<4G),CPU 不能直接通路所有的實體記憶體,線性位址大小僅為 4G,超過 4G 大小無法通路,不僅是 4G,模糊來說,1~4G空間都無法通路;

1.3 應對硬體限制的方法

将記憶體區域進行劃分,劃分為三個管理區間:

區域
ZONE_DMA 低于16MB的記憶體空間
ZONE_NORMAL 16MB~895MB
ZONE_HIGHMEM 896MB~4G

核心和應用程式在通路記憶體時,都是操作線性位址,“均需要”借助MMU實作對應實體記憶體位址的映射。

對于核心來講,前兩個區域直接通過 -3G 的方式實作對應到實體記憶體位址的目的 —— 畢竟這樣最快!(Linux 規定這樣的直接映射範圍最大為 896MB)。那麼 ZONE_HIGHMEM 區域怎麼辦? 使用者空間怎麼進行轉換?

  1. ZONE_HIGHMEM 區域的存在,能夠幫助我們通路超過 896MB 的記憶體,大概的空間大小為 128MB。當核心想通路超過 896MB 的實體記憶體時,就借用 MMU,将某頁實體記憶體映射到高端記憶體空間(線性位址空間)中,借用這段線性位址空間,用完後便歸還,實作了使用有限的位址空間,通路所有實體記憶體的目的。
  2. 核心空間不關心0~3G的使用者空間,這塊的空間需要借助MMU完成,一般除非陷入核心,不然不會走捷徑。

針對 ZONE_HIGHMEM 區域還進行了如下劃分,劃分為了三個區域:

  1. vmalloc:配置設定虛拟位址上連續的記憶體;
  2. persistent kernel mappings:用于較長期的動态映射,允許核心建立高端頁框到核心虛拟位址空間的長期映射。永久核心映射不能用于中斷處理程式和可延遲函數,因為建立永久核心映射可能阻塞目前程序;
  3. fixmaps:高端固定映射區域,其中的一部分用于建立臨時核心映射;
Linux 記憶體管理 —— 高端記憶體

更具體一點,如下圖所示,小區域之間有安全區分隔:

Linux 記憶體管理 —— 高端記憶體
  • 64位中為什麼不存在高端記憶體?

若機器安裝的實體記憶體超過核心位址空間範圍(超過896MB,32位高端記憶體範圍是3G+896MB~4G,64位可支援超過512TB的核心位址空間範圍),就會存在高端記憶體。

  • Linux對記憶體的管理分為三個層次:Node、Zone、Page三個層次
層次 說明
Node(存儲節點) CPU被劃分成多個節點,每個節點都有自己的一塊記憶體,可以參考NUMA架構有關節點的介紹
Zone(管理區) 每一個Node(節點)中的記憶體被劃分成多個管理區域(Zone),用于表示不同範圍的記憶體
Page(頁面) 每一個管理區又進一步被劃分為多個頁面,頁面是記憶體管理中最基礎的配置設定機關

————————————————

Linux 記憶體管理 —— 高端記憶體

繼續閱讀