虛擬地址映射到物理地址怎么做
在確保訪問的數(shù)據(jù)已在物理內(nèi)存中后,還需要先將虛擬地址轉(zhuǎn)換為物理地址,即"地址映射",那么虛擬地址映射到物理地址怎么做呢?今天學(xué)習(xí)啦小編與大家分享下虛擬地址映射到物理地的具體操作步驟,有需要的朋友不妨了解下。
虛擬地址映射到物理地址方法
Win32通過一個(gè)兩層的表結(jié)構(gòu)來實(shí)現(xiàn)地址映射,因?yàn)槊總€(gè)進(jìn)程都擁有私有的4G的虛擬內(nèi)存空間,相應(yīng)的,每個(gè)進(jìn)程都有自己的層次表結(jié)構(gòu)來實(shí)現(xiàn)其地址映射。
第一層稱為頁目錄,實(shí)際就是一個(gè)內(nèi)存頁,Win32的內(nèi)存頁有4KB大小,這個(gè)內(nèi)存頁以4個(gè)字節(jié)分為1024項(xiàng),每一項(xiàng)稱為“頁目錄項(xiàng)”(PDE);
第二層稱為頁表,這一層共有1024個(gè)頁表,頁表結(jié)構(gòu)與頁目錄相似,每個(gè)頁表也都是一個(gè)內(nèi)存頁,這個(gè)內(nèi)存頁以4KB的大小被分為1024項(xiàng),頁表的每一項(xiàng)被稱為頁表項(xiàng)(PTE),易知共有1024×1024個(gè)頁表項(xiàng)。每一個(gè)頁表項(xiàng)對(duì)應(yīng)一個(gè)物理內(nèi)存中的某一個(gè)“內(nèi)存頁”,即共有1024×1024個(gè)物理內(nèi)存頁,每個(gè)物理內(nèi)存頁為4KB,這樣就可以索引到4G大小的虛擬物理內(nèi)存。
如下圖所示(注下圖中的頁目錄項(xiàng)的大小應(yīng)該是4個(gè)字節(jié),而不是4kB):
Win32提供了4GB大小的虛擬地址空間。因此每個(gè)虛擬地址都是一個(gè)32位的整數(shù)值,也就是我們平時(shí)所說的指針,即指針的大小為4B。它由三部分組成,如下圖:
這三個(gè)部分的第一部分,即前10位為頁目錄下標(biāo),用來尋址頁目錄項(xiàng),頁目錄項(xiàng)剛好1024個(gè)。找到頁目錄項(xiàng)后,找對(duì)頁目錄項(xiàng)對(duì)應(yīng)的的頁表。第二部分則是用來在頁表內(nèi)尋址,用來找到頁表項(xiàng),共有1024個(gè)頁表項(xiàng),通過頁表項(xiàng)找到物理內(nèi)存頁。第三部分用來在物理內(nèi)存頁中找到對(duì)應(yīng)的字節(jié),一個(gè)頁的大小是4KB,12位剛好可以滿足尋址要求。
具體的例子:
假設(shè)一個(gè)線程正在訪問一個(gè)指針(Win32的指針指的就是虛擬地址)指向的數(shù)據(jù),此指針指為0x2A8E317F,下圖表示了這一個(gè)過程:
0x2A8E317F的二進(jìn)制寫法為0010101010_0011100011_000101111111,為了方便我們把它分為三個(gè)部分。
首先按照0010101010尋址,找到頁目錄項(xiàng)。因?yàn)橐粋€(gè)頁目錄項(xiàng)為4KB,那么先將0010101010左移兩位,001010101000(0x2A8),用此下標(biāo)找到頁目錄項(xiàng),然后根據(jù)此頁目錄項(xiàng)定位到下一層的某個(gè)頁表。
然后按照0011100011尋址,在上一步找到頁表中尋找頁表項(xiàng)。尋址方法與上述方法類似。找到頁表項(xiàng)后,就可以找到對(duì)應(yīng)的物理內(nèi)存頁。
最后按照000101111111尋址,尋找頁內(nèi)偏移。
上面的假設(shè)的是此數(shù)據(jù)已在物理內(nèi)存中,其實(shí)判斷訪問的數(shù)據(jù)是否在內(nèi)存中也是在地址映射過程中完成的。Win32系統(tǒng)總是假設(shè)數(shù)據(jù)已在物理內(nèi)存中,并進(jìn)行地址映射。頁表項(xiàng)中有一位標(biāo)志位,用來標(biāo)識(shí)包含此數(shù)據(jù)的頁是否在物理內(nèi)存中,如果在的話,就直接做地址映射,否則,拋出缺頁中斷,此時(shí)頁表項(xiàng)也可標(biāo)識(shí)包含此數(shù)據(jù)的頁是否在調(diào)頁文件中(外存),如果不在則訪問違例,程序?qū)?huì)退出,如果在,頁表項(xiàng)會(huì)查出此數(shù)據(jù)頁在哪個(gè)調(diào)頁文件中,然后將此數(shù)據(jù)頁調(diào)入物理內(nèi)存,再繼續(xù)進(jìn)行地址映射。為了實(shí)現(xiàn)每個(gè)進(jìn)程擁有私有4G的虛擬地址空間,也就是說每個(gè)進(jìn)程都擁有自己的頁目錄和頁表結(jié)構(gòu),對(duì)不同進(jìn)程而言,即使是相同的指針(虛擬地址)被不同的進(jìn)程映射到的物理地址也是不同的,這也意味著在進(jìn)程之間傳遞指針是沒有意義的。