有效虛擬地址

有效虛擬地址

虛擬地址(Virtual address)在計算機的專用術語中是指標識一個虛擬(非物理地址)的實體地址。有效虛擬地址一般有兩種解釋1、X64CPU僅支持64 位虛擬地址中的 48 位,只有虛擬地址位數不大於48位,才是有效的。2、是指程式運行的虛擬地址空間的地址。

基本信息

簡介

有效虛擬地址一種解釋是指:X64 CPU 僅支持 64 位虛擬地址中的 48 位,這 48 位虛擬地址被運行在該 CPU 上的軟體使用,這主要套用在分散式作業系統或者超級計算機中。第二種解釋就是指源程式的地址空間中的地址。這和源程式需要需要地址空間大小有關係。(其中源程式的地址空間叫做符號名地址空間或者名空間,它是從0號單元開始編址,並順序分配所有的符號名所對應的地址單元,所以它不是主存中的真實地址,故稱為相對地址、程式地址、或稱虛擬地址。)在作業系統中一般通過快表來實現虛擬地址到物理地址的轉換,同時判斷這個虛擬地址是否有效。

有關術語解釋

物理地址 (physical address):放在定址匯流排上的地址。放在定址匯流排上,如果是讀,電路根據這個地址每位的值就將相應地址的物理記憶體中的數據放到數據匯流排中傳輸。如果是寫,電路根據這個地址每位的值就在相應地址的物理記憶體中放入數據匯流排上的內容。物理記憶體是以位元組(8位)為單位編址的。

地址空間

我們把程式中有符號名組成的空間稱為地址空間。源程式經過彙編或編譯後再經過連結編輯程式加工形成的程式的裝配模組,及轉換為相對地址編址的模組,它是以0為基址順序進行編址的。相對地址也稱為邏輯地址或虛擬地址,把程式中由相對地址組成的空間叫做邏輯地址空間。相對地址空間通過地址再定位機構轉換到絕對地址空間,絕對地址空間也叫物理地址空間。

存儲空間

簡單來說,邏輯地址空間(簡稱地址空間)是邏輯地址的集合,物理地址空間(簡稱存儲空間)是物理地址的集合。

塊表

概述

又可以稱之為頁表快取、轉址旁路快取,為CPU的一種快取,由記憶體管理單元用於改進虛擬地址到物理地址的轉譯速度。目前所有的桌面型及伺服器型處理器(如 x86)皆使用TLB。TLB具有固定數目的空間槽,用於存放將虛擬地址映射至物理地址的標籤頁表條目。為典型的內容可定址記憶體(content-addressable memory,首字母縮略字:CAM)。其搜尋關鍵字為虛擬記憶體地址,其搜尋結果為物理地址。如果請求的虛擬地址在TLB中存在,CAM 將給出一個非常快速的匹配結果,之後就可以使用得到的物理地址訪問記憶體。如果請求的虛擬地址不在 TLB 中,就會使用標籤頁表進行虛實地址轉換,而標籤頁表的訪問速度比TLB慢很多。有些系統允許標籤頁表被交換到次級存儲器,那么虛實地址轉換可能要花非常長的時間。

TLB 用於快取一部分標籤頁表條目。TLB可介於 CPU 和 CPU快取之間,或在 CPU 快取和主存之間,這取決於快取使用的是物理定址或是虛擬定址。如果快取是虛擬定址,定址請求將會直接從 CPU 傳送給快取,然後從快取訪問所需的 TLB 條目。如果快取使用物理定址,CPU 會先對每一個記憶體操作進行 TLB 查尋,並且將獲取的物理地址傳送給快取。兩種方法各有優缺點。

採用物理定址的快取的一種常見最佳化,是並行的進行 TLB 查尋和快取的訪問。所有虛擬地址的較低比特(例如,在虛擬記憶體系統中具有 4KB 標籤頁時,虛擬地址中較低的那 12 比特)代表的是所請求的地址在分頁內部的地址偏移量(頁內地址),且這些比特不會在虛擬地址轉換到物理地址的過程中發生改變。訪問CPU快取的過程包含兩步:使用一條索引去尋找CPU快取的數據存儲區中的相應條目,然後比較找到的CPU快取條目的相應標記。如果快取是用虛實地址轉譯過程中不變的頁內地址來索引組織起來的,則可並行地執行TLB上虛實地址的較高比特(即分頁的頁間地址/頁號)的轉換與CPU快取的“索引”操作。然後,從 TLB 獲得的的物理地址的頁號會傳送給CPU快取。CPU快取會對頁號標記進行比較,以決定此次訪問是尋中或是缺失。它也有可能並行的進行 TLB 查尋和CPU快取訪問,即使CPU快取必須使用某些可能會在地址轉譯後發生改變的比特;參閱快取條目的地址轉譯一節,以獲取關於虛擬定址下快取和 TLB 的進一步細節。

處理方案

兩種在現代體系結構中常用的解決 TLB 不命中的方案:

硬體式 TLB 管理,CPU 自行遍歷標籤頁表,查看是否存在包含指定的虛擬地址的有效標籤頁表條目。如果存在這樣的分頁表條目,就把此分頁表條目存入 TLB ,並重新執行 TLB 訪問,而此次訪問肯定會尋中,程式可正常運行。如果 CPU 在標籤頁表中不能找到包含指定的虛擬地址有效條目,就會發生標籤頁錯誤異常,作業系統必須處理這個異常。處理標籤頁錯誤通常是把被請求的數據載入物理記憶體中,並在標籤頁表中創建將出錯的虛擬地址映射到正確的物理地址的相應條目,並重新引導程式。

軟體管理式 TLB,TLB 不命中時會產生“TLB 失誤”異常,且作業系統遍歷標籤頁表,以軟體方式進行虛實地址轉譯。然後作業系統將分頁表中回響的條目載入 TLB 中,然後從引起 TLB 失誤的指令處重新引導程式。如同硬體式 TLB 管理,如果作業系統在標籤頁表中不能找到有效的虛實地址轉譯條目,就會發生標籤頁錯誤, 作業系統 必須進行相應的處理。

64 位 Windows 核心虛擬地址空間布局

X64 CPU 僅支持 64 位虛擬地址中的 48 位,這 48 位虛擬地址被運行在該 CPU 上的軟體使用。 對於用戶模式地址,64 位虛擬地址中的高 16 位總是被設定為 0x0;對於核心模式地址,總是設定為 0xF。

這有效地將 X64 地址空間分開成2部分——用戶模式地址的範圍:0x00000000`00000000~0x0000FFFF`FFFFFFFF;

核心模式地址的範圍:

0xFFFF0000`00000000~0xFFFFFFFF`FFFFFFFF。

此核心虛擬地址範圍總計為 256 TB,用於 Windows 上可訪問的全部核心虛擬地址空間。然後,Windows 靜態劃分此空間成多個固定大小的虛擬地址範圍(VA),每個範圍被賦予特定用途。每個範圍的起始和結束地址如下表所示:

有效虛擬地址 有效虛擬地址

因此,為了簡化處理器晶片架構以及避免非必要的開銷——尤其是地址翻譯方面(後面會討論)—— 當前 AMD 和 Intel 的 x64 處理器僅實現了 16 EB 虛擬地址空間中的 256 TB。換言之,一個 64 位的虛擬地址中,僅有低 48 位被實現(使用)。然而,虛擬地址仍舊是 64 位寬,在暫存器中,或存儲在記憶體中,它們都占用 8 位元組。虛擬地址中的高 16 位(比特位 48~63)需要被設定成與最高的“實現位”(也就是比特位 47)相同的值,這是通過一種類似於二進制補碼運算的符號擴展來完成的。符合這一運算規則的地址被稱為“規範”(canonical)地址。

根據這些規則,正如預期的那樣,地址空間的下半部分從 0x0000000000000000 開始,但是結束於 0x00007FFFFFFFFFFF。地址空間的上半部分從 0xFFFF800000000000 開始,結束於 0xFFFFFFFFFFFFFFFF。每個“規範的”部分為 128 TB。隨著更新的處理器實現/使用更多的地址位,記憶體中的下半部分將會向上擴展,直到 0x7FFFFFFFFFFFFFFF;而記憶體中的上半部分則會向下擴展,直到 0x8000000000000000 (與當前的 32 位用戶—核心記憶體空間分割法類似,只是又多出了 32 位)。

相關詞條

熱門詞條

聯絡我們