2014-06-29 145 views
1

假設我們在C中編寫程序並打印程序中聲明的一個變量的地址,是在屏幕上打印虛擬地址還是變量的物理地址? 如果它是虛擬地址,爲什麼它仍然與物理內存的位範圍具有相同的範圍?例如。對於32位機器,如果它返回0x833CA23E。虛擬內存或物理內存

+1

C語言和C++編程語言都不包含任何「虛擬」或「物理」內存的概念。只有「記憶」。這個問題不能從兩種語言中得到回答。 –

+0

唯一可以找到物理地址和虛擬地址相同的機器是缺少虛擬內存(和內存管理單元)的系統,比如許多嵌入式系統。例如,ucLinux是設計用於在這些平臺上運行的Linux版本。 FreeRTOS是一款小巧的操作系統(可將其降至8kB左右),無需虛擬內存支持。 –

+0

另外,在現代系統中,機器的「位數」是虛擬地址中的位數。物理地址可能沒有多少位(例如,在64位機器上,物理地址實際上可能只有40或48位;高階物理地址位被忽略)。在較早的體系結構中,它描述了內部數據寄存器的寬度,(物理)地址具有更多位。例如8086是16位,但有20位尋址(1024k); 6502是8位,但有16位地址(64k)。 –

回答

5

的地址將是在虛擬內存一個虛擬地址,因爲該應用程序有沒有的物理內存知識。這是內核和MMU隱藏的。

我不確定你的意思是相同的「位範圍」。如果您擁有32位地址空間,則無論您擁有多少物理內存,它都將覆蓋整個32位空間。同樣適用於64位。

+0

這是否意味着如果我在32位機器上運行32位操作系統,虛擬內存空間和物理內存空間是相同的4GB內存? – shaveenk

+1

@shaveenk,不,內核將選擇一個映射,MMU將強制映射。通常,您的程序與內核和其他應用程序共享資源,因此將所有虛擬地址映射到所有應用程序的相同物理地址是沒有意義的。 – merlin2011

+0

此外,如果您有虛擬內存支持,則計算機可以使用一些磁盤空間作爲附加內存,當不使用內存時,將頁面「分頁」到磁盤,而其他某些進程需要更多內存。所涉及的過程在尋呼發生時被暫停,因此他們沒有注意到任何錯誤;對他們來說,看起來他們的數據總是在RAM中。 –

4

在大多數典型情況下(Windows,Linux等),它將是一個虛擬地址。

在Linux和Windows等典型情況下,虛擬地址和物理地址通常都是32位,因此同一範圍內的數字不可避免。它可能分配超過4千兆字節的內存,並且當/如果你這樣做,你最終的地址大於32位 - 但除非你採取特殊的步驟來做到這一點,32位地址是什麼你會默認獲得。

當您在32位操作系統下使用超過4 GB的內存時,您通常會通過一些特殊API(例如Windows的Address Windowing Extensions)進行操作。使用這些,你可以訪問超過4 GB的內存,,但是默認情況下不會發生這種情況,代碼甚至接近便攜式。

某些(某些版本的)操作系統也使用英特爾的物理地址擴展(PAE)爲整個系統提供超過4 GB的RAM,但即使這些操作系統正在使用中,任何正在運行的單個進程該系統仍然侷限於尋址4 GB(即使用PAE,每個進程可以有4 GB的限制,而舊系統總共有4 GB的限制,在進程間按需要劃分)。

0

在大多數情況下,它將是一個32位的虛擬地址。

如果您的操作系統支持分頁,那麼它將是虛擬地址。它可能已被映射到使用分頁的相同物理地址。 Linux和Windows進行分頁。

另一件重要的事情是架構。在Intel x86 32位系統上,它將是32位地址。地址的前10位將用於獲取頁表。第二個10位將用於從所選頁面表中獲取頁面。最後12位將爲您提供該頁面的實際物理地址。

我希望它能回答你的問題。