在存儲器里以字節(jié)為單位存儲信息,為正確地存放或取得信息,每一個字節(jié)單元給以一個唯一的存儲器地址,稱為物理地址(Physical Address),又叫實際地址或絕對地址。
地址從0開始編號,順序地每次加1,因此存儲器的物理地址空間是呈線性增長的。它是用二進制數(shù)來表示的,是無符號整數(shù),書寫格式為十六進制數(shù)。它是出現(xiàn)在CPU外部地址總線上的尋址物理內(nèi)存的地址信號,是地址變換的最終結果。用于內(nèi)存芯片級的單元尋址,與處理器和CPU連接的地址總線相對應。在計算機科學中,物理地址(英語:physical address),也叫實地址(real address)、二進制地址(binary address),它是在地址總線上,以電子形式存在的,使得數(shù)據(jù)總線可以訪問主存的某個特定存儲單元的內(nèi)存地址。在和虛擬內(nèi)存的計算機中,物理地址這個術語多用于區(qū)分虛擬地址。尤其是在使用內(nèi)存管理單元(MMU)轉換內(nèi)存地址的計算機中,虛擬和物理地址分別指在經(jīng)MMU轉換之前和之后的地址。在計算機網(wǎng)絡中,物理地址有時又是MAC地址的同義詞。這個地址實際上是用于數(shù)據(jù)鏈路層,而不是如它名字所指的物理層上的。
在實地址方式下,物理地址是通過段地址乘以16加上偏移地址得到的。而16位的段地址乘以16等同于左移4位二進制位,這樣變成20位的段基地址,最后段基地址加上段內(nèi)偏移地址即可得到物理地址。20位物理地址計算方法如下:物理地址=段地址*16d+偏移地址。
根據(jù)計算機體系的不同,對內(nèi)存的不對齊的訪問對計算機的性能可能會有所損害。例如,像Intel 8086這種數(shù)據(jù)總線為16位的計算機,對偶數(shù)地址的訪問會更有效率。在那種情況下,獲取一個16位的值只要讀一次內(nèi)存以及在數(shù)據(jù)總線上傳送一次數(shù)據(jù)。顯然,如果那16位的值儲存在奇數(shù)地址上,處理器實際上要讀兩次內(nèi)存,即,一次用于讀存儲在低地址的部分,另一次讀存儲在高地址的部分;兩次都要把讀到的數(shù)據(jù)丟棄一半。
要保證多個應用程序同時處于內(nèi)存中并且不互相影響,則需要解決兩個問題:保護和重定位。我們來看一個原始的對前者的解決辦法:給內(nèi)存塊標記上一個保護鍵,并且比較執(zhí)行進程的鍵和其訪問的每個內(nèi)存字的保護鍵。然而,這種方法本身并沒有解決后一個問題,雖然這個問題可以通過在程序被裝載時重定位程序來解決,但這是一個緩慢且復雜的解決方法。一個更好的辦法是創(chuàng)造一個新的內(nèi)存抽象:地址空間。就像進程的概念創(chuàng)造了一類抽象的CPU以運行程序一樣,地址空間為程序創(chuàng)造了一種抽象的內(nèi)存。地址空間是一個進程可用于尋址內(nèi)存的一套地址集合。每個進程都有一個自己的地址空間,并且這個地址空間獨立于其他進程的地址空間(除了在一些特殊情況下進程需要共享它們的地址空間外)。地址空間的概念非常通用,并且在很多場合中出現(xiàn)。隨著數(shù)量的增長,空間變得越來越不夠用了,從而導致需要使用更多位數(shù)。地址空間可以不是數(shù)字的。互聯(lián)網(wǎng)域名也是地址空間。這個地址空間是由所有包含2~63個字符并且后面跟著字符串組成的,組成這些字符串的字符可以是字母、數(shù)字和連字符。
物理地址 (physical address): 放在尋址總線上的地址。放在尋址總線上,如果是讀,電路根據(jù)這個地址每位的值就將相應地址的物理內(nèi)存中的數(shù)據(jù)放到數(shù)據(jù)總線中傳輸。如果是寫,電路根據(jù)這個地址每位的值就將相應地址的物理內(nèi)存中放入數(shù)據(jù)總線上的內(nèi)容。物理內(nèi)存是以字節(jié)(8位)為單位編址的。虛擬地址 (virtual address): CPU啟動保護模式后,程序運行在虛擬地址空間中。注意,并不是所有的“程序”都是運行在虛擬地址中。CPU在啟動的時候是運行在實模式的,內(nèi)核在初始化頁表之前并不使用虛擬地址,而是直接使用物理地址的。