Kvmzen 部落格
← 返回技術實踐

CPU 如何找到 RAM 中的資料?完整解析 DRAM 位址對映

IndustryInsights ·約 16 分鐘閱讀

CPU 如何找到 RAM 中的資料?完整解析 DRAM 位址對映

程式明明只拿到一個指標,除錯時卻看不到它對應哪一顆記憶體晶片。

最快解法:先把流程拆成「虛擬位址 → TLB/頁表 → 實體位址 → CPU 快取 → 記憶體控制器 → DRAM 對映」,並記住最後的通道、Rank、Bank、列與欄通常取決於平台實作。

如果你正在學習作業系統、計算機結構或底層安全,這篇適合你。你會釐清虛擬位址與實體位址的分工;進行效能分析時,也能分辨 TLB 未命中、快取未命中與真正的 DRAM 延遲。

CPU 如何找到 RAM 中的資料:先看完整地址鏈

假設程式執行一條概念上的指令:

load r1, [r2 + offset]

CPU 解碼指令後,會由暫存器內容與位移量計算出程式使用的位址。這個位址不是 RAM 模組上的插槽編號,也不是某顆 DRAM 晶片的列號,而是目前執行緒所在位址空間中的虛擬位址

完整流程可以先濃縮成下表:

層級 CPU 或系統看到的內容 主要工作 常見誤解
程式 虛擬位址 指標、陣列索引與指令形成存取位置 以為它就是 RAM 實體位置
MMU 虛擬頁號與頁內偏移 查 TLB 或走訪頁表 以為每次都要完整讀頁表
實體記憶體系統 實體位址 指向實體頁框中的位元組 以為已經等同 DRAM 列欄
CPU 快取 快取標籤與快取線 判斷資料是否已在 L1、L2 或 LLC 以為每次 Load 都會碰到 DRAM
記憶體控制器 實體位址位元 依平台規則選擇通道、Rank、Bank 等 以為有跨平台固定切位公式
DRAM 通道、Rank、Bank、列、欄 開啟列、選擇欄並傳回資料 以為 CPU 直接發出 DRAM 列號

Linux 文件把頁表描述為把 CPU 使用的虛擬位址對映到外部記憶體匯流排可見的實體位址;頁表採階層式組織,最上層頁表的位置則由架構相關暫存器提供。參考 Linux 核心的 Page Tables 文件記憶體管理概念說明

如果你要在遠端開發環境中實際檢查這些層級,先確認可使用的終端機、系統工具與權限範圍,相關環境說明可參考 Kvmzen 的幫助中心。不要直接假設使用者層程式能看到所有實體位址或硬體控制器資訊。

這也解釋了為什麼不同程式可以使用相同的虛擬位址。每個行程有自己的位址空間與頁表內容,同一個虛擬頁號可以對應到不同實體頁框;權限位元也能阻止某個行程讀取不屬於它的頁面。

虛擬位址如何轉換成實體位址

一個虛擬位址通常可概念化為兩部分:

虛擬位址 = 虛擬頁號 + 頁內偏移

頁表負責把虛擬頁號轉成實體頁框號,而頁內偏移保持不變。假設位址落在某個頁面的中段,轉換後它仍然落在實體頁框的相同相對位置;改變的是「哪一個頁框」,不是頁面內的位移。

不同架構支援的頁面大小不完全相同。以 Intel 64 架構文件提到的模式為例,處理器可支援 4 KB、2 MB、4 MB 與 1 GB 等頁面大小;實際可用選項仍要看處理器模式與作業系統設定,可參考 Intel 關於分頁與 TLB 的技術文件。頁面越大,可能涵蓋更多連續資料,但也可能增加記憶體配置與保護粒度上的取捨。

頁表項目不只保存頁框位置,通常還包含存在狀態、可讀寫權限、是否可執行、使用者/核心權限與快取屬性等資訊。因此地址轉換同時也是保護檢查。若程式嘗試寫入唯讀頁面,即使位址看起來合理,也可能觸發例外。

TLB 命中與未命中的成本差異

如果每一次 Load 都從最高層頁表開始查找,地址轉換本身就會產生大量額外存取。處理器因此使用 Translation Lookaside Buffer,也就是 TLB,快取近期使用過的虛擬頁號到實體頁框的轉換結果。

情況 CPU 主要動作 後續結果 效能含義
TLB 命中 直接取得頁框與權限 形成實體位址並繼續快取查找 通常不需逐層讀頁表
TLB 未命中但頁表有效 進行頁表走訪或由系統處理 更新 TLB,重試原存取 產生地址轉換額外成本
頁表項目不存在 觸發缺頁流程 可能配置頁面、載入檔案或使用 Swap 延遲來源不再只是 CPU 快取
權限不符 觸發保護例外 程式收到錯誤或由核心處理 屬於正確性與安全性問題

Linux 文件指出,MMU 會使用 TLB 與部分架構提供的 Page Walk Cache 加速轉換;TLB 的目的則是避免同一頁每次都重新走訪頁表。

因此,「TLB 未命中」不等於「資料不在 RAM」。它首先代表轉換快取沒有命中。CPU 可能仍然很快地從頁表取得有效頁框;只有頁表判定頁面不存在、權限不符或需要載入後備儲存裝置時,才會進入更重的缺頁處理。

Linux 的頁表階層會依架構而異;目前核心文件以五層頁表作為通用視圖,但某些架構可能折疊或跳過部分層級。不要把某一種 x86 分頁模式的位址切分,直接套到所有 ARM、AMD 或未來架構上。

頁表位於記憶體,CPU 怎樣找到頁表

頁表本身也是資料結構,通常放在記憶體中。這看似形成循環:CPU 要查頁表才能找到資料,但頁表也要先被找到。

解法是由架構定義一個控制暫存器,保存最上層頁表的實體位址。CPU 進行地址轉換時,先使用這個根位置,再以虛擬位址的不同位元範圍索引各層頁表。低位元則作為頁內偏移。Linux 文件也明確描述,頂層頁表指標位於暫存器中,而各層項目會指向下一層頁表或實際頁面。

這裡有三個容易混淆的成本:

  • 頁表讀取成本:TLB 未命中後,頁表走訪可能需要讀取多個層級。
  • 頁表快取成本:處理器可能快取部分頁表走訪結果,但具體結構依實作而異。
  • 缺頁成本:頁面未駐留時,核心可能配置頁面、讀取檔案,或從 Swap 還原;這已經不是單純的 DRAM 讀取。

對開發者而言,查詢 /proc、使用 perf 或檢視核心記憶體統計時,應把「虛擬記憶體使用量」、「實體駐留頁面」與「缺頁事件」分開看。你也可以先參閱 Kvmzen 的網站介紹,確認遠端開發環境所處的服務範圍,再判斷哪些系統層級資料可由使用者觀察,而不是只看程式報告的位址數值。

若你需要把這些概念延伸到遠端工作環境的實際檢查,則應先確認登入權限、可用的系統工具與記憶體統計範圍。遇到無法確認權限或環境狀態的情況,應先核對環境說明與可用工具,再判斷你能否區分缺頁、Swap 與快取未命中,而不是單純看一個記憶體使用百分比。

快取未命中後,資料才可能走向 DRAM

完成虛擬位址轉換後,CPU 不會立刻把實體位址送往 DRAM。它通常先檢查快取層級。快取保存的是從較慢層級取得的資料副本,並以快取線作為搬移單位。

Intel 的最佳化文件以 64 bytes 作為常見快取線大小示例,並說明資料讀取通常會以快取線形式進入快取層級;但快取大小、關聯度、替換策略與預取行為都可能因處理器世代而變化。可參考 Intel 的 CPU 與 DRAM 快取層級說明

一次 Load 可能出現以下路徑:

  1. 位址轉換在 TLB 命中。
  2. L1 資料快取命中,資料直接回到暫存器。
  3. L1 未命中,但 L2 或最後層快取命中。
  4. 所有相關快取都未命中,請求才會前往記憶體控制器。
  5. 記憶體控制器安排 DRAM 指令並等待資料返回。

所以你在效能分析中看到的「記憶體延遲」,可能來自完全不同的地方。Intel VTune 的指標文件把 LLC Miss 與 UTLB Overhead 分開列出:前者與最後層快取未命中有關,後者則反映資料 TLB 未命中的額外週期。參考 Intel VTune CPU Metrics Reference

場景案例:為什麼連續掃描與隨機指標差很多

假設你處理一個大型陣列。若程式依序讀取相鄰元素,硬體預取器與快取線可能讓後續資料較早進入快取;若程式透過隨機指標跳躍,則可能同時增加 TLB 壓力與 LLC 未命中。

兩者都可能被描述成「RAM 很慢」,但改善方向不同:

  • TLB 壓力高:檢查工作集大小、頁面配置與是否適合使用大頁面。
  • LLC 未命中高:改善資料區域性、調整資料結構或使用分塊處理。
  • DRAM 壅塞:檢查多執行緒同時存取、NUMA 位置與記憶體控制器負載。
  • 缺頁頻繁:檢查記憶體壓力、檔案對映與 Swap,而不是先更換 RAM。

實體位址是否等於 RAM 晶片位置

不是。實體位址描述的是處理器與記憶體控制器之間的位址空間,不直接等於某顆 DRAM 晶片、某個模組或某一列電容的位置。

當快取未命中後,記憶體控制器會接收實體位址,依平台的對映規則拆解或計算出若干欄位。概念上可能包含:

實體位址
  → 通道
  → Rank
  → Bank/Bank Group
  → 列
  → 欄
  → 快取線內偏移

這個流程並不代表實體位址一定是:

[通道位元][Rank 位元][Bank 位元][列位元][欄位元]

實際平台可能把不同位元交錯使用,也可能以 XOR 或其他函式計算 Bank、通道或 Rank。研究論文 DRAMA:利用 DRAM 位址進行跨 CPU 攻擊 正是因為許多平台的 DRAM 對映未公開,才需要透過實體探測或軟體方法反向推導。

因此,若你正在研究 Rowhammer、快取側信道或記憶體交錯,不能只拿一張網路上的二進位切割圖就下結論。那張圖可能只適用於某一代處理器、某種記憶體模組與某個 BIOS 設定。

DRAM Bank、列與欄的定位方式

DRAM 內部不是一個單一平面陣列,而是由多個 Bank 組成。每個 Bank 內有列與欄。控制器通常先處理列啟動,再從已開啟的列中選擇欄資料;若下一次請求仍落在已開啟的同一列,可能形成 Row Buffer Hit。若落在同一 Bank 的其他列,便可能產生列衝突,需要關閉原列並啟動另一列。

對效能工程師而言,重點不是背下某幾個位元,而是觀察存取模式:

  • 相鄰實體頁面不一定落在相鄰 DRAM 列。
  • 相鄰位址可能被交錯到不同通道或 Bank,以增加平行度。
  • 不同 CPU 型號的 Bank 位址函式可能不同。
  • 記憶體控制器也會重新排序請求,以提高吞吐量或降低列切換成本。
  • 虛擬位址連續,不代表實體頁面或 DRAM 位置連續。

如果研究目標是確認某平台的 DRAM Bank 對映,至少需要固定 CPU 型號、主機板、記憶體模組、韌體設定與作業系統環境,再以可重複的延遲或 Row Buffer 實驗驗證。沒有這些條件,就只能做架構層級的描述。

一條 Load 指令如何完成整個讀取

把前面的概念串回最初的指令:

load r1, [r2 + offset]

第一步,執行單元計算有效位址。這個有效位址仍屬於目前行程的虛擬位址空間。

第二步,MMU 將虛擬頁號送往 TLB。若命中,CPU 取得對應的實體頁框與權限;若未命中,處理器依架構規則走訪頁表,並在成功後更新 TLB。Intel 與 AMD 的具體控制暫存器、分頁模式與例外細節,應以各自的架構手冊為準:Intel 64 與 IA-32 架構手冊AMD64 Architecture Programmer’s Manual

第三步,MMU 組合出實體位址:

實體位址 = 實體頁框基底 + 原本的頁內偏移

第四步,CPU 以實體位址查找資料快取。若資料位於 L1、L2 或 LLC,請求在快取層級完成,不必前往 DRAM。若最後層快取也未命中,才會產生記憶體讀取請求。

第五步,記憶體控制器接收實體位址,依平台規則選擇通道、Rank、Bank、列與欄,並安排 DRAM 命令。DRAM 傳回的資料通常先經由記憶體控制器返回快取層級,再送到等待中的 CPU 執行單元。

第六步,Load 結果寫入目的暫存器,後續指令才能使用 r1 中的資料。從程式角度看,這一切像是「讀取一個指標」;從硬體角度看,這是多層轉換、快取查找與記憶體排程共同完成的結果。

虛擬化環境會多一層地址轉換

在虛擬機器中,Guest 作業系統看到的通常是 Guest Virtual Address。它先經過 Guest 頁表,轉成 Guest Physical Address;接著虛擬機器監控器或硬體虛擬化機制,再把 Guest Physical Address 轉成 Host Physical Address。

概念上可寫成:

Guest Virtual Address
  → Guest Physical Address
  → Host Physical Address
  → CPU 快取
  → DRAM 對映

Intel 的文件以 Extended Page Tables,也就是 EPT,說明虛擬機器中的第二層轉換與頁面權限控制。

這也是為什麼雲端開發環境中的記憶體問題不能只看 Guest 內的虛擬位址。你還要考慮 Guest TLB、第二層頁表、Host 記憶體壓力、虛擬 CPU 排程與實體主機的快取及 DRAM 行為。

用決策表排查地址與延遲問題

當程式出現「存取很慢」時,不要直接把問題歸因於 RAM。先按照症狀選擇檢查方向:

觀察到的症狀 優先檢查 不要直接下的結論
TLB Miss 增加 工作集、頁面大小、資料結構區域性 RAM 頻率一定不足
LLC Miss 增加 快取線利用率、資料排列、預取效果 CPU 核心一定不夠快
Minor Page Fault 增加 頁面是否首次配置、頁表是否建立 一定發生了硬碟讀取
Major Page Fault 增加 Swap、檔案對映與儲存裝置延遲 DRAM Bank 發生衝突
DRAM 延遲不穩定 記憶體控制器負載、並行存取、NUMA 某個固定位元就是列地址
虛擬機器延遲上升 EPT、Host 記憶體壓力、vCPU 排程 Guest 實體位址等於主機位址

你可以採用以下五步,避免把不同層級混在一起:

  1. 先確認程式使用的是虛擬位址,不要從指標值推測 DRAM 位置。
  2. 觀察 TLB、頁表走訪與缺頁事件,分辨地址轉換問題和頁面駐留問題。
  3. 再檢查 L1、L2、LLC 命中率與快取線利用率。
  4. 只有在快取未命中明確成立後,才分析記憶體控制器、NUMA 或 DRAM 行為。
  5. 若涉及特定平台的 Bank 或列對映,固定硬體與韌體條件,再以官方手冊或可重複實驗核對。

常見誤區的快速修正

  • 誤區一:指標就是 RAM 位址。
    指標通常是虛擬位址,除非你在核心、除錯器或特殊驅動程式環境中明確處理實體位址。

  • 誤區二:TLB 未命中等於缺頁。
    TLB 未命中只表示轉換快取沒有結果;頁表仍可能有效,CPU 可以完成頁表走訪後繼續執行。

  • 誤區三:實體位址直接等於 DRAM 列欄。
    實體位址還要經過記憶體控制器的實作相關對映,不能跨平台套公式。

  • 誤區四:快取未命中就一定是 DRAM 慢。
    快取未命中可能由資料區域性、預取失效、競爭或工作集過大造成,實際請求還可能被其他快取層級或記憶體排程延後。

  • 誤區五:虛擬機器中的 Guest Physical Address 就是主機實體位置。
    EPT 或其他第二層地址轉換會再把 Guest 位址對映到 Host 位址。

FAQ:把四個長尾問題一次釐清

虛擬位址轉成實體位址時,頁內偏移會改變嗎?

不會。頁表主要轉換虛擬頁號與實體頁框號,頁內偏移保持原值。因此同一虛擬頁中的資料,轉換後仍位於實體頁框的相同相對位置。若頁表項目不存在、頁面尚未駐留或存取權限不符,才會進入缺頁或保護例外流程。

TLB 未命中之後,CPU 會直接讀取 RAM 嗎?

不會直接跳到 DRAM。CPU 通常先依架構規則走訪頁表,確認實體頁框與權限,再更新 TLB 並重試存取。若頁面不在實體記憶體,核心可能需要配置頁面、載入檔案或處理 Swap;這與單純的 TLB 未命中是不同事件。

實體位址是否代表某一顆 RAM 晶片?

不代表。實體位址是記憶體系統使用的地址空間,記憶體控制器會再依平台規則計算通道、Rank、Bank、列與欄。不同處理器、主機板、記憶體配置與韌體可能採用不同對映方式,因此不能從實體位址直接推斷某顆晶片。

DRAM Bank 和列地址應該如何判定?

若沒有特定平台的公開文件,不能只用通用公式判定。研究通常透過 Row Buffer 命中與列衝突造成的延遲差異,反向推導部分通道、Rank 或 Bank 對映。工程排查時,應固定硬體環境並保留可重複測試結果,不要把研究用公式當成所有平台的硬體保證。

如果你把這條地址鏈帶回實際開發環境,傳統自購工作站或一般雲端主機常見的問題是:硬體映射不可控、虛擬化層級不透明、效能指標權限不足,還可能因共用主機而讓延遲波動。對需要短期驗證記憶體配置、遠端編譯或長任務 Agent 的情境,先建立可觀測、可重複的遠端 Mac 測試環境,通常比為單次驗證立即購置整套硬體更有效率;但若你需要長期滿載、實體介面或自行掌控韌體,仍應優先評估自購 Mac。

下一步可把本文的檢查順序套用到你的 Load 熱點、頁面配置與快取未命中資料中,並依實際環境的權限與工具範圍安排驗證。

常見問題

虛擬位址轉成實體位址時,頁內偏移會不會改變?

不會。頁表只負責把虛擬頁號對應到實體頁框,頁內偏移通常原樣保留。因此同一頁中的不同位址,會落在同一個實體頁框的相對位置;真正可能改變的是頁框編號與存取權限。若頁表項不存在或權限不符,才會進入缺頁或例外處理流程。

TLB 未命中後 CPU 會做什麼?

CPU 會先依架構規則查找頁表,可能由硬體頁表遍歷器完成,也可能觸發作業系統處理。若找到有效頁表項,處理器會建立或更新 TLB 項目並重試存取;若頁面不存在、權限錯誤或位址無效,則可能產生缺頁例外、終止程式,或由核心從儲存裝置載入頁面。

實體位址是否等於 RAM 晶片上的實際位置?

不是。實體位址是處理器與記憶體系統使用的位址空間表示,記憶體控制器還會依平台規則把其中部分位元解碼成通道、Rank、Bank、列與欄。這些位元如何分配,可能涉及交錯或 XOR,不能把一段固定二進位切割公式套用到所有 CPU 與主機板。

DRAM Bank 和行地址怎麼確定?

一般流程是由記憶體控制器根據實體位址與平台設定計算,但具體函式通常不是通用的 ISA 保證。研究人員可以利用 Row Buffer 命中、衝突與存取延遲反推出部分對映;工程上若沒有特定平台文件或實測,就應只描述概念,不宣稱某幾個固定位元必然代表 Bank 或列。

限時特惠

不只是一台 Mac,是你在雲端的開發基地

獨享算力 · 全球節點 · 按月訂閱 · 無需購置硬體

返回首頁
限時優惠 點擊查看套餐