Linux內核:內存管理(1)——內存尋址

內存控制單元(MMU)由分段單元分頁單元組成。
在這裏插入圖片描述

  • 分段單元:將邏輯地址轉換成一個線性(虛擬)地址,給一個進程分配不同的線性地址空間。
  • 分頁單元:將線性(虛擬)地址轉化成一個物理地址,把同一線性地址空間映射到不同的物理空間。

其中,邏輯地址由一個段和偏移量組成;線性地址是一個uint32_t,可以表達4G的地址;物理地址用於內存尋址。

1分段單元:邏輯地址—>線性地址

給一個進程分配不同的線性地址空間。

1.1 段選擇符

在這裏插入圖片描述
段選擇符中的字段:

  • index,GDT或LDT的段描述符的入口,即其在GDT或LDT中的相對地址
  • TI,Table Indicator,TI = 0,GDT 中;TI = 1,LDT 中。
  • RPL,請求者特權級。

1.2 段描述符

段描述符大小爲8字節,存於GDT或LDT,描述了一個段的特徵,其Base字段可以得到對應段的首地址的線性地址
在這裏插入圖片描述
4 個主要的 Linux 段的段描述符:用戶代碼段、用戶數據段、內核代碼段、內核數據段

1.3 分段過程

  1. 根據段選擇符的 TI 字段,決定從 GDT(gdtr 寄存器) 還是 LDT(ldtr 寄存器) 中取段描述符,獲得一個4字節表頭地址。
  2. 將段選擇符的 index 字段(13位,表示第index個)乘以 8(段描述符大小)獲得相對地址,再與 gdtr 或 ldtr 寄存器中的內容相加,得到段描述符地址
  3. 邏輯地址的偏移量與段描述符的 Base 字段值相加,獲得對應線性地址,即虛擬地址。

在這裏插入圖片描述

2 分頁:線性地址—>物理地址

2.1 基本概念

  • :線性地址被分成以固定長度爲單位的組 一般爲4kB。
  • 頁框:分頁單元把 RAM 分成固定長度的頁框,與頁的長度一致。頁可以存放在任何頁框中。(物理頁)
  • 頁表:把線性地址映射到物理地址的數據結構,存放在主存中,在啓用分頁單元前由內核對頁表初始化。

2.2 32位機下的(常規分頁)二級頁表

32 位線性地址被分成 3 個域:

  • Directory,目錄,高 10 位。 用於選擇頁目錄中的目錄項,指向適當的頁表
  • Table,頁表,中間 10 位。 選擇頁表中的表項,含有頁所在頁框的地址
  • Offset,偏移量,最低 12 位。決定頁框中的相對位置,讀指定偏移量的地址中的內容,最大爲頁大小(4096kB)

活動進程都有一個頁目錄。正在使用的頁目錄的物理地址存放在控制寄存器 cr3 中
把同一線性地址空間映射到不同的物理空間,分爲兩步:基於頁目錄表(page directory)和基於頁表(page table)。
在這裏插入圖片描述

使用這種二級頁表模式可減少每個進程頁表所需 RAM 的數量
一級頁表模式若使用4GB線性地址空間,需要220個表項(4GB/4KB),每項4字節的話也需要4MB的RAM空間。

而二級頁表模式通過進程實際需要一個頁表時纔給該頁表分配RAM來減少內存使用量。

2.3 64位機的情況

64位機並不適合使用二級分頁:
假設每頁4KB = 212byte,則若保證offset可以表達頁的任何一個地址,需要12位。假設我們僅僅使用64位中的48位來尋址,則Directory和Table需要佔36位,我們各分配18位,那麼每個進程的每個頁目錄和頁表都會有218個小項。過多的項同時佔據RAM會導致佔用空間過大
因此64位機下使用3/4級頁表設計。

2.4 硬件高速緩存(SRAM,已獲得物理地址時使用)

在這裏插入圖片描述
硬件高速緩存基於局部性原理(常用的地址在最近的將來被用到的可能性較大),目的是縮小CPU與RAM之間的速度不匹配,由高速緩存內存高速緩存控制器組成。
硬件上使用了速度較快的SRAM,減少了從速度較慢的DRAM讀寫的時間。
引入“行”單位:高速緩存被細分爲行的子集。大多數高速緩存是 N-路組關聯的,主存中的任意一個行可以存放在高速緩存 N 行中的任意一行。
真正的行存於SRAM、存儲行地址的表項的數組存於高速緩存控制器。
每個表項有一個標籤(tag),用於辨別行所映射的內存單元
內存物理地址通常分 3 組,高几位對應標籤,中間幾位對應高速緩存控制器的子集索引,最低幾位對應行內的偏移量
當我們用一個物理地址 訪問一個 RAM 存儲單元時,CPU 取出物理地址中的子集索引號,並把子集中所有行的標籤與物理地址高几位比較,如果某行的標籤與物理地址的高几位相同,則 CPU 命中一個高速緩存。
在若沒有命中,高速緩存行被寫回內存中,如果有必要則取出放到告訴緩存表項中。

對於讀操作,控制器從告訴緩存行中選擇數據並送回寄存器,不需要訪問RAM,節省了時間。
對於寫操作,又分爲通寫write-through和回寫write-back

高速緩存偵聽:只要一個 CPU 修改了它的硬件高速緩存,它就必須檢查其他硬件高速緩存是否包含相同的數據;如果是,通知其他 CPU 進行更新。由硬件處理,內核無需關心。

2.5 快表、轉換後援緩衝器(TLB)【不太懂???】

了硬件高速緩存,TLB 也可以加速線性地址向物理地址轉換。

一個線性地址被第一次使用時,需通過慢速訪問 RAM 中的頁表計算出物理地址。同時,物理地址被存放在一個 TLB 表項中,下次使用同一線性地址時就可以直接從 TLB 中取。

2.6 Linux中的分頁

Linux採用兼容32/64位機 4 級分頁模型:

  • 頁全局目錄(Page Global Directory)
  • 頁上級目錄(Page Upper Directory)
  • 頁中間目錄(Page Middle Directory)
  • 頁表(Page Table)

內核爲頁上級目錄和頁中間目錄保留了位置。每個進程有自己的頁全局目錄和頁表集。
對於 32 位系統,如果沒有啓用物理地址擴展,2 級頁表即可,頁上級目錄和頁中間目錄全爲 0。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章