實體地址與虛擬位址(3)

2021-06-26 15:19:32 字數 2808 閱讀 4215

windows 2000 使用基於分頁機制的虛擬記憶體。每個程序有4gb的虛擬位址空間。基於分頁機制,這4gb位址空間的一些部分被映**物理記憶體,一些部分對映硬碟上的交換檔案,一些部分什麼也沒有對映。程式中使用的都是4gb位址空間中的虛擬位址。而訪問物理記憶體,需要使用實體地址。

下面我們看看什麼是實體地址,什麼是虛擬位址。

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

虛擬位址 (virtual address): 4g虛擬位址空間中的位址,程式中使用的都是虛擬位址。

如果cpu暫存器中的分頁標誌位被設定,那麼執行記憶體操作的機器指令時,cpu會自動根據頁目錄和頁表中的資訊,把虛擬位址轉換成實體地址,完成該指令。比如 mov eax,004227b8h ,這是把位址004227b8h處的值賦給暫存器的彙編**,004227b8這個位址就是虛擬址。cpu在執行這行**時,發現暫存器中的分頁標誌位已經被設定,就自動完成虛擬位址到實體地址的轉換,使用實體地址取出值,完成指令。對於intel cpu 來說,分頁標誌位是暫存器cr0的第31位,為1表示使用分頁,為0表示不使用分頁。對於初始化之後的 win2k 我們觀察 cr0 ,發現第31位為1。表明win2k是使用分頁的。

使用了分頁機制之後,4g的位址空間被分成了固定大小的頁,每一頁或者被對映到物理記憶體,或者被對映到硬碟上的交換檔案中,或者沒有對映任何東西。對於一般程式來說,4g的位址空間,只有一小部分映**物理記憶體,大片大片的部分是沒有對映任何東西。物理記憶體也被分頁,來對映位址空間。對於32bit的win2k,頁的大小是4k位元組。cpu用來把虛擬位址轉換成實體地址的資訊存放在叫做頁目錄和頁表的結構裡。

物理記憶體分頁,乙個物理頁的大小為4k位元組,第0個物理頁從實體地址 0x00000000 處開始。由於頁的大小為4kb,就是0x1000位元組,所以第1頁從實體地址 0x00001000 處開始。第2頁從實體地址 0x00002000 處開始。可以看到由於頁的大小是4kb,所以只需要32bit的位址中高20bit來定址物理頁。

頁表,乙個頁表的大小為4k位元組,放在乙個物理頁中。由1024個4位元組的頁表項組成。頁表項的大小為4個位元組(32bit),所以乙個頁表中有1024個頁表項。頁表中的每一項的內容(每項4個位元組,32bit)高20bit用來放乙個物理頁的實體地址,低12bit放著一些標誌。

頁目錄,乙個頁目錄大小為4k位元組,放在乙個物理頁中。由1024個4位元組的頁目錄項組成。頁目錄項的大小為4個位元組(32bit),所以乙個頁目錄中有1024個頁目錄項。頁目錄中的每一項的內容(每項4個位元組)高20bit用來放乙個頁表(頁表放在乙個物理頁中)的實體地址,低12bit放著一些標誌。

對於x86系統,頁目錄的實體地址放在cpu的cr3暫存器中。

乙個虛擬位址,大小4個位元組(32bit),包含著找到實體地址的資訊,分為3個部分:第22位到第31位這10位(最高10位)是頁目錄中的索引,第12位到第21位這10位是頁表中的索引,第0位到第11位這12位(低12位)是頁內偏移。對於乙個要轉換成實體地址的虛擬位址,cpu首先根據cr3中的值,找到頁目錄所在的物理頁。然後根據虛擬位址的第22位到第31位這10位(最高的10bit)的值作為索引,找到相應的頁目錄項(pde,page directory entry),頁目錄項中有這個虛擬位址所對應頁表的實體地址。有了頁表的實體地址,根據虛擬位址的第12位到第21位這10位的值作為索引,找到該頁表中相應的頁表項(pte,page table entry),頁表項中就有這個虛擬位址所對應物理頁的實體地址。最後用虛擬位址的最低12位,也就是頁內偏移,加上這個物理頁的實體地址,就得到了該虛擬位址所對應的實體地址。

乙個頁目錄有1024項,虛擬位址最高的10bit剛好可以索引1024項(2的10次方等於1024)。乙個頁表也有1024項,虛擬位址中間部分的10bit,剛好索引1024項。虛擬位址最低的12bit(2的12次方等於4096),作為頁內偏移,剛好可以索引4kb,也就是乙個物理頁中的每個位元組。

乙個虛擬位址轉換成實體地址的計算過程就是,處理器通過cr3找到當前頁目錄所在物理頁,取虛擬位址的高10bit,然後把這10bit右移2bit(因為每個頁目錄項4個位元組長,右移2bit相當於乘4)得到在該頁中的位址,取出該位址處pde(4個位元組),就找到了該虛擬位址對應頁表所在物理頁,取虛擬位址第12位到第21位這10位,然後把這10bit右移2bit(因為每個頁表項4個位元組長,右移2bit相當於乘4)得到在該頁中的位址,取出該位址處的pte(4個位元組),就找到了該虛擬位址對應物理頁的位址,最後加上12bit的頁內偏移得到了實體地址。

32bit的乙個指標,可以定址範圍0x00000000-0xffffffff,4gb大小。也就是說乙個32bit的指標可以定址整個4gb位址空間的每乙個位元組。乙個頁表項負責4k的位址空間和物理記憶體的對映,乙個頁表1024項,也就是負責1024*4k=4m的位址空間的對映。乙個頁目錄項,對應乙個頁表。乙個頁目錄有1024項,也就對應著1024個頁表,每個頁表負責4m位址空間的對映。1024個頁表負責1024*4m=4g的位址空間對映。乙個程序有乙個頁目錄。所以以頁為單位,頁目錄和頁表可以保證4g的位址空間中的每頁和物理記憶體的對映。

每個程序都有自己的4g位址空間,從 0x00000000-0xffffffff 。通過每個程序自己的一套頁目錄和頁表來實現。由於每個程序有自己的頁目錄和頁表,所以每個程序的位址空間對映的物理記憶體是不一樣的。兩個程序的同乙個虛擬位址處(如果都有物理記憶體對映)的值一般是不同的,因為他們往往對應不同的物理頁。

4g位址空間中低2g,0x00000000-0x7fffffff 是使用者位址空間,4g位址空間中高2g, 0x80000000-0xffffffff 是系統位址空間。訪問系統位址空間需要程式有ring0的許可權。

虛擬位址與實體地址

乙個程式編譯連線後形成的位址空間是乙個虛擬位址空間,但是程式最終還是要執行在物理記憶體中。因此,應用程式所給出的任何虛位址最終必須被轉化為實體地址,所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。這就是我們所說的段描述符表和頁表,linux主要...

邏輯位址 實體地址 虛擬位址

用於記憶體晶元級的單元定址,與處理器和cpu連線的位址匯流排相對應。雖然可以直接把實體地址理解成插在機器上那根記憶體本身,把記憶體看成乙個從0位元組一直到最大空量逐字節的編號的大陣列,然後把這個陣列叫做實體地址,但是事實上,這只是乙個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是 與...

虛擬位址與實體地址的對映

對於dsp的每個cpu而言,當由cpu發起的對corepac內部記憶體 l1,l2記憶體,片上暫存器位址 的訪問 通過store或load指令 時,所訪問記憶體的位址就是實體地址 但當cpu訪問corepac外部的記憶體 如msm,即多核共享記憶體或ddr 時,cpu所訪問的32位位址就是虛擬位址了...