導航:首頁 > 物理學科 > 怎麼求虛擬地址對應的物理地址

怎麼求虛擬地址對應的物理地址

發布時間:2022-09-23 06:24:38

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

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

⑵ 怎樣將IP地址轉換為實際物理地址

將IP地址轉換為實際物理地址的方法

  1. 確定虛擬地址(物理地址)的有效位
    例如:假設頁面大小1KB,共32頁。(頁面:邏輯地址 頁框:物理地址)
    由32(KB)=32×1024(B) 即等於32×1024 位元組
    二進制用多少位能有效表示這么多位元組呢——答是:15位 因為32×1024=2^5×2^10=2^15
    2.再次確定邏輯地址頁面位數 你應該知道:邏輯地址=頁號+頁面
    還是以上假設,那麼頁面大小為1KB=1024位元組 同樣的方法計算出表示位數:10位
    如果給邏輯地址:0000 1111 1000 0000
    那麼由:011+11100000000(相當於 頁號+頁面(10位))推得出頁號011=3
    3.根據頁號找出對應的頁框號
    由 物理地址=頁框號×頁塊大小(頁塊大小是等於頁面大小的)+頁內位移(即頁面邏輯地址)
    根據上面 物理地址=頁框號×1024B + 1110000000 ( 這里的相加是指位置上而言)
    例如:110+110=110110(即高地址+低地址)

地址解析協議(ARP)是在僅知道主機的IP地址時確定其物理地址的一種協議。TCP是一種面向連接(連接導向)的、可靠的、基於位元組流的運輸層(Transportlayer)通信協議。ICMP是Internet控制報文協議。它是TCP/IP協議族的一個子協議,用於在IP主機、路由器之間傳遞控制消息。控制消息是指網路通不通、主機是否可達、路由是否可用等網路本身的消息。這些控制消息雖然並不傳輸用戶數據,但是對於用戶數據的傳遞起著重要的作用。DNS是計算機域名系統的縮寫,它是由解析器以及域名伺服器組成的。域名伺服器是指保存有該網路中所有主機的域名和對應IP地址,並具有將域名轉換為IP地址功能的伺服器。

⑶ 虛地址 物理地址

在Windows 2000/XP中,依次單擊「開始」→「運行」→輸入「CMD」→回車→輸入「ipconfig /all」→回車。即可看到MAC(physical,address0地址 --

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

/* *偽代碼,示例 *32位地址,三級映射(沒有pud_t),頁面大小4KB */ unsigned long addr = 0x12345678;//要找的虛擬地址,用戶空間所訪問的地址 unsigned long real_addr = 0x00;//要輸出的地址 struct task_struct *cur_task = get_current();...

⑸ 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系統開發有所幫助.

⑹ 虛擬地址是怎麼轉換成物理地址的

進程注入唄。
虛擬地址向物理地址轉換是硬體轉換,對程序看來是透明的

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

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

⑻ 虛擬地址軟體有哪些

第一款軟體的話是fake location,他是國外的軟體,分root模式和非root模式了。第二款任我行了,他是專門為釘釘打卡而生的了。最後一款軟體的話叫做多開分身了,他主要的是用來多開的。
【拓展資料】一、虛擬地址是Windows程序時運行在386保護模式下,這樣程序訪問存儲器所使用的邏輯地址稱為虛擬地址,與實地址模式下的分段地址類似,虛擬地址也可以寫為"段:偏移量"的形式,這里的段是指段選擇器。
Windows 2000 使用基於分頁機制的虛擬內存。每個進程有4GB的虛擬地址空間。基於分頁機制,這4GB地址空間的一些部分被映射了物理內存,一些部分映射硬碟上的交換文件,一些部分什麼也沒有映射。程序中使用的都是4GB地址空間中的虛擬地址。而訪問物理內存,需要使用物理地址。
二、對於一個要轉換成物理地址的虛擬地址,CPU首先根據CR3中的值,找到頁目錄所在的物理頁。然後根據虛擬地址的第22位到第31位這10位(最高的10bit)的值作為索引,找到相應的頁目錄項(PDE,page directory entry),頁目錄項中有這個虛擬地址所對應頁表的物理地址。有了頁表的物理地址,根據虛擬地址的第12位到第21位這10位的值作為索引,找到該頁表中相應的頁表項(PTE,page table entry),頁表項中就有這個虛擬地址所對應物理頁的物理地址。最後用虛擬地址的最低12位,也就是頁內偏移,加上這個物理頁的物理地址,就得到了該虛擬地址所對應的物理地址。
三、一個虛擬地址轉換成物理地址的計算過程就是,處理器通過CR3找到當前頁目錄所在物理頁,取虛擬地址的高10bit,然後把這10bit左移2bit(因為每個頁目錄項4個位元組長,左移2bit相當於乘4)得到在該頁中的地址,取出該地址處PDE(4個位元組),就找到了該虛擬地址對應頁表所在物理頁,取虛擬地址第12位到第21位這10位,然後把這10bit左移2bit(因為每個頁表項4個位元組長,左移2bit相當於乘4)得到在該頁中的地址,取出該地址處的PTE(4個位元組),就找到了該虛擬地址對應物理頁的地址,最後加上12bit的頁內偏移得到了物理地址。

閱讀全文

與怎麼求虛擬地址對應的物理地址相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:740
乙酸乙酯化學式怎麼算 瀏覽:1406
沈陽初中的數學是什麼版本的 瀏覽:1353
華為手機家人共享如何查看地理位置 瀏覽:1045
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:886
數學c什麼意思是什麼意思是什麼 瀏覽:1411
中考初中地理如何補 瀏覽:1301
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:703
數學奧數卡怎麼辦 瀏覽:1388
如何回答地理是什麼 瀏覽:1026
win7如何刪除電腦文件瀏覽歷史 瀏覽:1058
大學物理實驗干什麼用的到 瀏覽:1487
二年級上冊數學框框怎麼填 瀏覽:1701
西安瑞禧生物科技有限公司怎麼樣 瀏覽:979
武大的分析化學怎麼樣 瀏覽:1250
ige電化學發光偏高怎麼辦 瀏覽:1339
學而思初中英語和語文怎麼樣 瀏覽:1654
下列哪個水飛薊素化學結構 瀏覽:1425
化學理學哪些專業好 瀏覽:1488
數學中的棱的意思是什麼 瀏覽:1060