導航:首頁 > 物理學科 > 知道虛擬地址怎麼求物理地址

知道虛擬地址怎麼求物理地址

發布時間:2023-05-29 23:51:25

Ⅰ 虛擬地址到物理地址(內存虛擬化)

假設一個堆的基地址為34KB,虛擬地址為4KB,其大小為2KB

程序不分段時 ,找到堆中虛擬地值的物理地址很簡單,物理地址 = 基地址 + 虛擬地址

程序分段時 ,找到堆中物理地址會復雜一些,物理地址 = 基地址 + (虛擬地址 - 該段的開頭的虛擬地址)
舉個例子,堆中有一個虛擬地址為4200,那麼如果想得到其物理地址,需 34KB + 4200 - 4 KB = 34920

你可能好奇為什麼要這么做,我們來簡單解釋一下:
首先我們先明確,之所以使用虛擬地址是想讓程序以為自己獨占內存,也就是說程序所佔內存是從0 - xxx。虛擬地址是多少,就表示其在第多少個內存空間

當不分段時:整個程序的內存空間連續(無論是程序以為的內存空間還是物理內存都是連續的),所以虛擬地址即表明了其是第幾個內存空間。顯然 物理地址 = 基地址 + 虛擬地址

當分短時:整個程序的內存空間不再連續,每一段都有自己獨特的基地址,但是虛擬地址還是相對於之前只有一個基地址時的值,那麼此時虛擬地址就無法直接表示其在第幾個內存空間了(因為程序以為的連續內存空間映射成的物理內存並不連續)。所以,我們需要虛擬地址相對於每個段自己的基地址的值,要完成這個操作只需要將虛擬地址 - 段開頭的虛擬地址。因此 物理地址 = 基地址 + 虛擬地址 - 段開頭的虛擬地址

Ⅱ 現代CPU如何自動把虛擬地址轉換成物理地址的硬體電路

虛擬內存是一個由存放在磁碟上的N個連續的位元組大小的單元組成的數組。
每個位元組都有一個唯一的地址,就是虛擬地址。通常,虛擬地址由頁號和偏移量組成,頁號就是抽象的虛擬頁的編號,偏移量用於計算實際的物理地址。
虛擬地址和物理地址的關系。進程雖然使用虛擬地址,但是用數據時還是要到實際的物理地址去取數據。這就存在一個虛擬地址到物理地址的轉化運算,這是由CPU晶元上一個叫做內存管理單元(MMU)的專用硬體來實現的。
通常,物理地址=頁號*頁大小+頁內偏移量。虛擬定址CPU通過虛擬地址來訪問主存,訪問內存使用的物理地址,MMU通過將虛擬地址進行翻譯,轉化為物理地址,然後再用這個物理地址去訪問內存數據。

Ⅲ Linux下怎樣在進程中獲取虛擬地址對應的物理地址

Linux文件目錄中的/proc記錄著當前進程的信息,稱其為虛擬文件系統。在/proc下有一個鏈接目錄名為self,這意味著哪一個進程打開了它,self中存儲的信息就是所鏈接進程的。self中有一個名為page_map的文件,專門用來記錄所鏈接進程的物理頁號信息。這樣通過/proc/pid/page_map文件,允許一個用戶態的進程查看到每個虛擬頁映射到的物理頁

/proc/pid/page_map中的每一項都包含了一個64位的值,這個值內容如下所示。每一項的映射方式不同於真正的虛擬地址映射,其文件中遵循獨立的對應關系,即虛擬地址相對於0x0經過的頁面數是對應項在文件中的偏移量

* /proc/pid/pagemap. This file lets a userspace process find out which
physical frame each virtual page is mapped to. It contains one 64-bit
value for each virtual page, containing the following data (from
fs/proc/task_mmu.c, above pagemap_read):

* Bits 0-54 page frame number (PFN) if present//present為1時,bit0-54表示物理頁號
* Bits 0-4 swap type if swapped
* Bits 5-54 swap offset if swapped
* Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
* Bit 56 page exclusively mapped (since 4.2)
* Bits 57-60 zero
* Bit 61 page is file-page or shared-anon (since 3.5)
* Bit 62 page swapped
* Bit 63 page present//如果為1,表示當前物理頁在內存中;為0,表示當前物理頁不在內存中

在計算物理地址時,只需要找到虛擬地址的對應項,再通過對應項中的bit63判斷此物理頁是否在內存中,若在內存中則對應項中的物理頁號加上偏移地址,就能得到物理地址

通過程序獲取物理地址並驗證寫時拷貝技術

#include <stdio.h>


#include <stdlib.h>


#include <sys/types.h>


#include <unistd.h>


#include <sys/stat.h>


#include <fcntl.h>


#include <stdint.h>


//計算虛擬地址對應的地址,傳入虛擬地址vaddr,通過paddr傳出物理地址
void mem_addr(unsigned long vaddr, unsigned long *paddr)
{
int pageSize = getpagesize();//調用此函數獲取系統設定的頁面大小

unsigned long v_pageIndex = vaddr / pageSize;//計算此虛擬地址相對於0x0的經過的頁面數
unsigned long v_offset = v_pageIndex * sizeof(uint64_t);//計算在/proc/pid/page_map文件中的偏移量
unsigned long page_offset = vaddr % pageSize;//計算虛擬地址在頁面中的偏移量
uint64_t item = 0;//存儲對應項的值

int fd = open("/proc/self/pagemap", O_RDONLY);。。以只讀方式打開/proc/pid/page_map
if(fd == -1)//判斷是否打開失敗
{
printf("open /proc/self/pagemap error ");
return;
}

if(lseek(fd, v_offset, SEEK_SET) == -1)//將游標移動到相應位置,即對應項的起始地址且判斷是否移動失敗
{
printf("sleek error ");
return;
}

if(read(fd, &item, sizeof(uint64_t)) != sizeof(uint64_t))//讀取對應項的值,並存入item中,且判斷讀取數據位數是否正確
{
printf("read item error ");
return;
}

if((((uint64_t)1 << 63) & item) == 0)//判斷present是否為0
{
printf("page present is 0 ");
return ;
}

uint64_t phy_pageIndex = (((uint64_t)1 << 55) - 1) & item;//計算物理頁號,即取item的bit0-54

*paddr = (phy_pageIndex * pageSize) + page_offset;//再加上頁內偏移量就得到了物理地址
}

const int a = 100;//全局常量

int main()
{
int b = 100;//局部變數
static c = 100;//局部靜態變數
const int d = 100;//局部常量
char *str = "Hello World!";

unsigned long phy = 0;//物理地址

char *p = (char*)malloc(100);//動態內存

int pid = fork();//創建子進程
if(pid == 0)
{
//p[0] = '1';//子進程中修改動態內存
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x ", getpid(), &a, phy);
}
else
{
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x ", getpid(), &a, phy);
}

sleep(100);
free(p);
waitpid();
return 0;
}

測試結果如下:

全局常量:符合寫時拷貝技術

子進程修改動態內存

*其實想要知道虛擬地址對應的物理地址,通過這樣的方式也可以得到物理地址而不用操作MMU。。。*

以上就是Linux下怎樣在進程中獲取虛擬地址對應的物理地址的全文介紹,希望對您學習和使用linux系統開發有所幫助.

Ⅳ 分頁,虛擬地址是怎麼轉換成物理地址的

虛擬地址(即圖中的邏輯地址)的高位表示頁號,由計算機硬體將頁號取出,且和頁表寄存器中的頁表始址一起送加法器,就可以得到該頁對應的頁表項的地址,根據此地址到內存讀出對應的塊號,最後將塊號和頁內地址拼接得到對應的物理地址。

Ⅳ 操作系統中邏輯地址轉物理地址是什麼

1、確定虛擬地址(物理地址)的有效位。

2、再次確定邏輯地址頁面位數你應該知道:邏輯地址=頁號+頁面。

3、由物理地址=頁框號×頁塊大小(頁塊大小是等於頁面大小的)+頁內位移(即頁面邏輯地址)

4、根據上面物理地址=頁框號×1024B+1110000000。

5、若在一分頁存儲管理系統中,某作業的頁表如下所示。已知頁面大小為1024位元組,試將邏輯地址1011,2148,4000,5012轉化為相應的物理地址。

分析頁式存儲管理的地址結構是一維的,即邏輯地址(或物理地址)只用一個數值即可表示。若給定邏輯地址A,頁面的大小為L,則頁號p和頁內地址d可按照下式求得:

p=int[A/L]d=AmodL

其中,int是取整函數(取數值的整數部分),mod是取余函數(取數值的余數部分)。

Ⅵ 試將十六進制的虛擬地址0A5CH、103CH、1A5CH轉換成物理地址。

某虛存擬存儲器的用戶編程空間共32個頁面,每頁為1KB,內存為16KB。假定某時刻一用戶頁表中已調入內存的頁面的頁號和物理哪雹塊號的對照表如下表:
頁 號 物理塊號
0 5
1 10
2 4
3 7
4 2
5 3
6 8

則邏輯地址0A5CH對應的物理地址李笑帆為 ?
答:按分頁存儲管理的思想,邏輯空間分頁,內存空間分塊,塊的大小與頁面的大小相同,為1KB(400H)。由於0A5CH=400H*2+25CH,所以邏輯地址0A5CH對應的頁號為2,頁內位移為25CH。
根據頁表可知頁號2對應的物理塊號為4,物理塊號為4的塊首地址為400*4=1000(H),因此塊首地址+塊內位升銷移=1000H+25CH=125CH,為邏輯地址0A5CH所對應的物理地址。
同理可得:邏輯地址103CH所對應的物理地址為:83CH。
邏輯地址1A5CH所對應的物理地址為:345CH。

Ⅶ 關於內存管理和地址轉換的小小小小小總結

因為在ipad上畫圖比較好操作,這篇筆記就直接上傳手寫版了。把線性地址到物理地址部分的轉換理了一下,以後有補充會做更新。

四級頁表的作用主要就是地址映射,將邏輯地址映射到物理地址。

ARM MMU的地址轉換過程實際上更加復雜,通過兩級頁表實現,轉換方式有兩大類共四種情況,具體的可以看這篇博客 https://blog.csdn.net/sinat_41104353/article/details/82778822

已知系統使用IA-32分頁,現知道一個虛擬地址0x10036270,需要將該虛擬地址轉換為物理地址。若已知CR3寄存器中的值為0x7401000,轉化的過程如下:

1. 虛擬地址為0x10036270(00010000 00000011 01100010 01110000)

22-31bit為PDI值(00 0100 0000),12-21bit為PTI值(00 0011 0110 ),0-11bit為地址偏移(010 0111 0000)

2.頁目錄項PDE的地址=PDI×4+PDB(CR3)=0x40×4+0x740100=0x7401100

3.知道PDE物理地址後即可知道該物理地址中存儲的值,比如假設該物理地址存儲的值為0x28cf9067。PTE的值由PDE值的12-31bit及虛擬地址的12-21bit構成(0-11bit根據12bit填充為0),可得到PTE的物理地址=0x28cf9058

4.假設該物理地址中的值為0x182a7071,物理地址的值由PTE值的12-31bit及偏移地址構成。

最終得到物理地址=0x28cf9000+0x270=0x28cf9270。

以上為IA-32分頁虛擬地址轉物理地址的過程。

關於虛擬地址到物理地址的轉換

由於在內存中存儲的一般是虛擬地址,而在物理內存中地址定位的一定是物理地址,因此計算虛擬地址(線性地址)到物理地址的映射關系是內存分析的關鍵。

虛擬地址到物理地址的映射計算需要使用到一個基本規則: 在同一個虛擬地址頁面上的內容,也在同一個物理頁面。

比如,在物理內存管理中,頁的大小一般為4KB、2MB、4MB,都大於或等於0x1000(4KB)。根據上述的規則,虛擬地址0xffdff000-0xffdfffff就應該映射到同一個物理頁面上。而計算系統的頁目錄基地址是計算內存映射的關鍵,如果在0xffdff000-0xffdfffff中找到指向系統頁目錄基地址的指針就會解決地址映射的問題。

在上部分的筆記中能看到,CR3寄存器是非常重要的一個寄存器,它記錄的是頁目錄基地址(或頁目錄指針基地址、或PLM4基地址),如果能得到CR3寄存器的內容,那麼就有可能得到現成的頁目錄基地址。

這里以《內存取證原理與實踐》的例子,先大概描述一下 利用CR3的虛擬地址找到其物理地址的方法 。

以64位win7操作系統為例,_KPRCB 的結構成員ProcessorState是一個_KPRROCESSOR_STATE結構,起始地址為0xfffff80045eff80+0x40,在0x0處是SpecialRegister成員,偏移0x010處就是CR3寄存器,它的虛擬地址為0xfffff80045eff80+0x40+0x10。

而根據上述提到的基本規則我們可以知道,它和0xfffff800045efe00在同一個頁面中,那麼所以它的物理地址= 0xFFFFF800045EFE00的物理地址+0x180(這兩個地址的差值)+0x40+0x10。

關於頁的分頁方式和頁的大小則由以下過程確定:

1. 根據CR3寄存器的內容找到它指向的物理地址。

2. 判斷該地址處的第一個位元組,如果不是0x01則跳轉至第三步,否則表明其使用了PAE模式,從這個地址開始的8byte是頁目錄指針。根據待轉換的虛擬地址的第31~30 bit選擇頁目錄指針。例如,如果待轉換的地址是0x8054c2b8(10000000 01010100 11000010 10111000),則頁目錄指針表的第三項(二進制10)為指向頁目錄的指針,根據這個指針可找到頁目錄基地址。

根據頁目錄基地址和虛擬地址的第21~20bit確定待轉換虛擬地址對應的頁目錄項。例如,如果待轉換的地址是ox8054c2b8,則第21~29bit是000000010(0x02),則從頁目錄基地址加上8×2開始的8個位元組就是所找的頁目錄項。

3. 判斷該地址處的第一個位元組最高位,如果是「1」,則表明使用的大頁模式;如果是「0」,則表明它指向頁表。

Ⅷ 如何查電腦的物理地址

按步驟操作即可查詢電腦的物理地址。

1、按住鍵盤上的Windows鍵,再按R鍵,調出「運行」窗口

(8)知道虛擬地址怎麼求物理地址擴展閱讀:

在存儲器里以位元組為單位存儲信息,為正確地存放或取得信息,每一個位元組單元給以一個唯一的存儲器地址,稱為物理地址(Physical Address),又叫實際地址或絕對地址。

地址從0開始編號,順序地每次加1,因此存儲器的物理地址空間是呈線性增長的。它是用二進喊段制數來表示的,是無符號整數,書寫格式為十六進制數。它是指滲磨出現在CPU外部地址匯流排上的定址物理內存的地址信號,是地址變換的最終結果。用於內存晶元級的單元定址,與處理器和CPU連接的地址匯流排相對應。

在計算機科學唯斗中,物理地址(英語:physical address),也叫實地址(real address)、二進制地址(binary address),它是在地址匯流排上,以電子形式存在的,使得數據匯流排可以訪問主存的某個特定存儲單元的內存地址。在和虛擬內存的計算機中,物理地址這個術語多用於區分虛擬地址。尤其是在使用內存管理單元(MMU)轉換內存地址的計算機中,虛擬和物理地址分別指在經MMU轉換之前和之後的地址。在計算機網路中,物理地址有時又是MAC地址的同義詞。這個地址實際上是用於數據鏈路層,而不是如它名字所指的物理層上的。

參考資料:物理地址 網路

Ⅸ 已知邏輯地址求物理地址

Ⅹ 通過虛擬地址計算物理地址 求過程

你打的太多了,有點亂,只說下地址轉換問題:
1.虛擬地址:虛擬地址是以"段寄存器:偏移地址"形式存在的,例如--0542:24521360
2.線性地址:它是由分段部件把虛擬地址轉化而來的.
3.物理地址:即真實存在的地址,由處理器的地址引腳尋找到的地址.
虛擬地址---->線性地址:
段寄存器是一個16位的寄存器,其中第0和1位控制著將要訪問段的特權級,第2位說明是在gdt還是ldt尋找地址.高13位作為一個索引值,總共8192個索引.假設段寄存器-0000
0000
0000
1011(000b),那麼我們可以知道rpl=3(特權級為3);ti=0,從gdt中選擇段描述符;index=1,即將要索引的段描述符在gdt中的順序號為1,由於一個段描述符佔8個位元組,所以其索引到的地址為"gdt的高32位+1*8".這也就是為什麼gdt48位,留最低的16位作為限長的原因(8192*8=64k).
找到了段描述符,然後就是從段描述符中找出該段的位置了.段描述符是個8位元組的內存空間,由於結構復雜,無法構圖,省略段描述符的結構.我們只要知道在裡面規定了該段的基址,限長,還有屬性等等.找出基址後,再加上虛擬地址的偏址,就形成了32位的線性地址.由於偏址是32位的,所以該段獨享4g的虛擬地址空間.
線性地址----->物理地址
該部分是由分頁部件通過3級查找完成的.此時,我們把線性地址分為3段:0-11位(c)位元組索引,12-21位(b)頁表索引,22-31位(a)頁目錄索引.我們把頁表描述符和頁描述符通稱為頁表項,頁表項佔4個位元組,總共佔4kb大小.先以cr3為基址,以(a*4)為索引值,定址頁目錄描述符.然後再以頁目錄地址的高20位地址為基址,以(b*4)為索引值,定址頁描述符.再以頁描述符的高20位地址為基址,以c為偏移地址,相加得到物理地址.
從上可以看到頁的大小是4kb,即一項任務cpu只調用該任務所佔內存空間的4kb大小.有利於減少內存佔用.
以上大體就是這樣的,其中分頁部件的轉換相當復雜,不是三言兩語就能說明白的.還有pentium之後,分頁部件又採用了4mb的頁面,線性地址採用2級定址.才開啟pae功能後,又形成了4級定址.然後再結合後面的內存保護,i/o保護,任務保護及特權級的變換,形成了保護模式的大部分內容.
太復雜了,我也不是十分會.寫的有些亂,但願你能明白些.

閱讀全文

與知道虛擬地址怎麼求物理地址相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:702
乙酸乙酯化學式怎麼算 瀏覽:1370
沈陽初中的數學是什麼版本的 瀏覽:1315
華為手機家人共享如何查看地理位置 瀏覽:1008
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:845
數學c什麼意思是什麼意思是什麼 瀏覽:1367
中考初中地理如何補 瀏覽:1257
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:669
數學奧數卡怎麼辦 瀏覽:1347
如何回答地理是什麼 瀏覽:987
win7如何刪除電腦文件瀏覽歷史 瀏覽:1020
大學物理實驗干什麼用的到 瀏覽:1446
二年級上冊數學框框怎麼填 瀏覽:1657
西安瑞禧生物科技有限公司怎麼樣 瀏覽:821
武大的分析化學怎麼樣 瀏覽:1210
ige電化學發光偏高怎麼辦 瀏覽:1299
學而思初中英語和語文怎麼樣 瀏覽:1604
下列哪個水飛薊素化學結構 瀏覽:1386
化學理學哪些專業好 瀏覽:1450
數學中的棱的意思是什麼 瀏覽:1015