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