學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 電腦入門 > 虛擬地址與物理地址怎么映射

虛擬地址與物理地址怎么映射

時(shí)間: 春健736 分享

虛擬地址與物理地址怎么映射

  每個(gè)進(jìn)程都是獨(dú)立的虛擬地址空間,兩個(gè)獨(dú)立進(jìn)程的相同地址互不干擾,但是在物理上對(duì)每個(gè)進(jìn)程可能也就分了一部分空間給了某個(gè)進(jìn)程,所以中間就要用到映射,那么虛擬地址與物理地址怎么映射呢?今天學(xué)習(xí)啦小編與大家分享下虛擬地址與物理地址映射的具體操作步驟,有需要的朋友不妨了解下。

  虛擬地址與物理地址映射過(guò)程

  這里只談分頁(yè)管理的機(jī)制,也是目前最重要的內(nèi)存管理機(jī)制。

  最初的設(shè)計(jì)想法:

  結(jié)構(gòu)圖如下:

  頁(yè)的尺寸是4KB,虛擬地址的前20位用于指定一個(gè)物理頁(yè),后12位用于訪問(wèn)頁(yè)內(nèi)偏移。

  頁(yè)表項(xiàng)的結(jié)構(gòu):

  各個(gè)位的含義:

  P--位0是存在(Present)標(biāo)志,用于指明表項(xiàng)對(duì)地址轉(zhuǎn)換是否有效。P=1表示有效;P=0表示無(wú)效。在頁(yè)轉(zhuǎn)換過(guò)程中,如果說(shuō)涉及的頁(yè)目錄或頁(yè)表的表項(xiàng)無(wú)效,則會(huì)導(dǎo)致一個(gè)異常。如果P=0,那么除表示表項(xiàng)無(wú)效外,其余位可供程序自由使用,如圖4-18b所示。例如,操作系統(tǒng)可以使用這些位來(lái)保存已存儲(chǔ)在磁盤上的頁(yè)面的序號(hào)。

  R/W--位1是讀/寫(Read/Write)標(biāo)志。如果等于1,表示頁(yè)面可以被讀、寫或執(zhí)行。如果為0,表示頁(yè)面只讀或可執(zhí)行。當(dāng)處理器運(yùn)行在超級(jí)用戶特權(quán)級(jí)(級(jí)別0、1或2)時(shí),則R/W位不起作用。頁(yè)目錄項(xiàng)中的R/W位對(duì)其所映射的所有頁(yè)面起作用。

  U/S--位2是用戶/超級(jí)用戶(User/Supervisor)標(biāo)志。如果為1,那么運(yùn)行在任何特權(quán)級(jí)上的程序都可以訪問(wèn)該頁(yè)面。如果為0,那么頁(yè)面只能被運(yùn)行在超級(jí)用戶特權(quán)級(jí)(0、1或2)上的程序訪問(wèn)。頁(yè)目錄項(xiàng)中的U/S位對(duì)其所映射的所有頁(yè)面起作用。

  A--位5是已訪問(wèn)(Accessed)標(biāo)志。當(dāng)處理器訪問(wèn)頁(yè)表項(xiàng)映射的頁(yè)面時(shí),頁(yè)表表項(xiàng)的這個(gè)標(biāo)志就會(huì)被置為1。當(dāng)處理器訪問(wèn)頁(yè)目錄表項(xiàng)映射的任何頁(yè)面時(shí),頁(yè)目錄表項(xiàng)的這個(gè)標(biāo)志就會(huì)被置為1。處理器只負(fù)責(zé)設(shè)置該標(biāo)志,操作系統(tǒng)可通過(guò)定期地復(fù)位該標(biāo)志來(lái)統(tǒng)計(jì)頁(yè)面的使用情況。

  D--位6是頁(yè)面已被修改(Dirty)標(biāo)志。當(dāng)處理器對(duì)一個(gè)頁(yè)面執(zhí)行寫操作時(shí),就會(huì)設(shè)置對(duì)應(yīng)頁(yè)表表項(xiàng)的D標(biāo)志。處理器并不會(huì)修改頁(yè)目錄項(xiàng)中的D標(biāo)志。

  AVL--該字段保留專供程序使用。處理器不會(huì)修改這幾位,以后的升級(jí)處理器也不會(huì)。

  由于頁(yè)表占用內(nèi)存空間太大(1M個(gè)元素*4B大小=4MB,也可以這么看:每個(gè)進(jìn)程的虛擬地址空間=4G,頁(yè)面大小=4K,所以共有1M個(gè)頁(yè),需要1M個(gè)頁(yè)表項(xiàng),又因?yàn)槊總€(gè)頁(yè)表項(xiàng)=4B,所以頁(yè)表大小=4M),為了減少內(nèi)存占用量,因此設(shè)計(jì)了層次化的分頁(yè)結(jié)構(gòu):頁(yè)目錄表+頁(yè)表。

  層次化的設(shè)計(jì)想法:

  因?yàn)?GB的虛擬內(nèi)存共有1M=220=1048576個(gè)4K大小的頁(yè)面。

  我們將這些頁(yè)面分成210=1024份,即從頁(yè)表1到頁(yè)表1024,由頁(yè)目錄表管理;

  每一份(每一頁(yè)表)有210=1024個(gè)頁(yè),由每一個(gè)頁(yè)表管理,頁(yè)在頁(yè)表中是隨機(jī)的,哪個(gè)頁(yè)位于哪個(gè)頁(yè)表中是沒(méi)有規(guī)律的;

  結(jié)構(gòu)圖如下:

  每個(gè)任務(wù)都有這樣的層次化的分頁(yè)結(jié)構(gòu),即每個(gè)任務(wù)都有自己的頁(yè)目錄表和頁(yè)表。

  從硬件角度來(lái)分析:

  在處理器中有個(gè)控制寄存器CR3,存放著當(dāng)前任務(wù)頁(yè)目錄的物理地址,故又叫做頁(yè)目錄基址寄存器(Page Directory Base Register,PDBR),每個(gè)任務(wù)都存放了自己的頁(yè)目錄物理地址,當(dāng)任務(wù)切換時(shí),處理器切換到新任務(wù)開(kāi)始執(zhí)行,更新CR3寄存器的內(nèi)容,以指向新任務(wù)的頁(yè)目錄位置;

  相應(yīng)的,頁(yè)目錄又指向了一個(gè)個(gè)的頁(yè)表,每個(gè)頁(yè)表又根據(jù)任務(wù)的頁(yè)表項(xiàng)指向了相應(yīng)的頁(yè)。其中注意的是,頁(yè)目錄和頁(yè)表也是普通的頁(yè),混跡于全部的物理頁(yè)中,它們和普通頁(yè)的不同之處僅僅在于功能不一樣,當(dāng)任務(wù)撤銷之后, 它們和任務(wù)所占用的普通頁(yè)一樣會(huì)被回收, 并分配給其他任務(wù)(如下圖所示)。

  下面內(nèi)容轉(zhuǎn)自《分頁(yè)機(jī)制》,寫的很清楚。

  地址變換的具體過(guò)程

  對(duì)于Intel處理器來(lái)說(shuō), 有關(guān)分頁(yè), 最簡(jiǎn)單和最基本的機(jī)制就是這些; CR3寄存器給出了頁(yè)目錄的物理地址; 頁(yè)目錄給出了所有頁(yè)表的物理地址, 而每個(gè)頁(yè)表給出了它所包含的頁(yè)的物理地址. 好了, 該清楚的都清楚了, 唯一還不明白的, 應(yīng)該是如何用這種層次性的分頁(yè)結(jié)構(gòu)把線性地址轉(zhuǎn)換成物理地址? 這里舉個(gè)例子, 某任務(wù)加載后, 在4GB虛擬地址空間創(chuàng)建了一個(gè)段, 起始地址為0x00800000, 段界限為0x5000, 字節(jié)粒度. 當(dāng)前任務(wù)執(zhí)行時(shí), 段寄存器DS指向該段. 又假設(shè)執(zhí)行了下面一條指令

  mov edx, [0x1050]

  此時(shí), 段部件會(huì)輸出線性地址0x00801050. 在沒(méi)有開(kāi)啟分頁(yè)機(jī)制時(shí), 這就是要訪問(wèn)的物理地址. 但現(xiàn)在開(kāi)啟了分頁(yè)機(jī)制, 所以這是一個(gè)下虛擬地址, 要經(jīng)過(guò)頁(yè)部件轉(zhuǎn)換, 才能得到物理地址.

  如下圖所示, 處理器的頁(yè)部件專門負(fù)責(zé)線性地址到物理地址的轉(zhuǎn)換工作. 它首先將段部件送來(lái)的32位線性地址分為3段, 分別是高10位, 中間10位, 低12位. 高10位是頁(yè)目錄的索引, 中間10位是頁(yè)表的索引, 低12位則作為頁(yè)內(nèi)偏移量來(lái)用.

  當(dāng)前任務(wù)頁(yè)目錄的物理地址在處理器的CR3寄存器中, 假設(shè)它的內(nèi)容為0x00005000. 段管理部件輸出的線性地址是0x00801050, 其二進(jìn)制的形式如圖中給出. 高10位是十六進(jìn)制的0x002, 它是頁(yè)目錄表內(nèi)的索引,處理器將它乘以4(因?yàn)槊總€(gè)目錄項(xiàng)4字節(jié)), 作為偏移量訪問(wèn)頁(yè)目錄. 最終處理器從物理地址00005008處取得頁(yè)表的物理地址0x08001000.

  線性地址的中間10位為0x001, 處理器用它作為頁(yè)表索引取得頁(yè)的物理地址. 將該值乘以4, 作為偏移量訪問(wèn)頁(yè)表. 最終, 處理器又從物理地址08001004處取得頁(yè)的物理地址, 這就是我們一直努力尋找的那個(gè)頁(yè).

  頁(yè)的物理地址是0x0000c000, 而線性地址的低12位是數(shù)據(jù)所在的頁(yè)內(nèi)偏移量. 故處理器將它們相加, 得到物理地址0x0000C050, 這就是線性地址0x00801050所對(duì)應(yīng)的物理地址, 要訪問(wèn)的數(shù)據(jù)就在這里.

  注意, 這種變換不是無(wú)緣無(wú)故的, 而是事先安排好的. 當(dāng)任務(wù)加載時(shí), 操作系統(tǒng)先創(chuàng)建虛擬的段, 并根據(jù)段地址的高20位決定它要用到哪些頁(yè)目錄項(xiàng)和頁(yè)表項(xiàng). 然后, 尋找空閑的頁(yè), 將原本應(yīng)該寫入段中的數(shù)據(jù)寫到一個(gè)或者多個(gè)頁(yè)中, 并將頁(yè)的物理地址填寫到相對(duì)應(yīng)的頁(yè)表項(xiàng)中. 只有這樣做了, 當(dāng)程序運(yùn)行的時(shí)候, 才能以相反的順序進(jìn)行地址變換, 并找到正確的數(shù)據(jù).

  頁(yè)目錄項(xiàng), 頁(yè)表項(xiàng), CR3和打開(kāi)分頁(yè)

  頁(yè)目錄項(xiàng)和頁(yè)表項(xiàng)

  頁(yè)目錄和頁(yè)表中分別存放為頁(yè)目錄項(xiàng)和頁(yè)表項(xiàng), 它們的格式如下:

  可以看出, 在頁(yè)目錄和頁(yè)表中, 只保存了頁(yè)表或者頁(yè)物理地址的高20位. 原因很簡(jiǎn)單, 頁(yè)表或者頁(yè)的物理地址, 都要求必須是4KB對(duì)齊的, 以便于放在一個(gè)頁(yè)內(nèi), 故其低12位全是0. 在這種情況下, 可以只關(guān)心其高20位, 低12位安排其他用途.

  P 是存在位, 為1時(shí), 表示頁(yè)表或者頁(yè)位于內(nèi)存中. 否則, 表示頁(yè)表或者頁(yè)不在內(nèi)存中, 必須先予以創(chuàng)建, 或者從磁盤調(diào)入內(nèi)存后方可使用.

  RW 是讀/寫位. 為0時(shí)表示這樣的頁(yè)只能讀取, 為1時(shí)可讀可寫

  US 是用戶/管理位. 為1時(shí), 允許所有特權(quán)級(jí)別的程序訪問(wèn); 為0時(shí), 只允許特權(quán)級(jí)別為0, 1和2的程序訪問(wèn).

  PWT(Page-level Write-Through) 是頁(yè)級(jí)通寫位, 和高速緩存有關(guān). "通寫"是處理器高速緩存的一種工作方式, 這一位用來(lái)間接決定是否采用此種方式來(lái)改善頁(yè)面的訪問(wèn)效率.

  PCD(Page-level Cache Disable)是頁(yè)級(jí)高速緩存禁止位, 用來(lái)間接決定該表項(xiàng)所指向的那個(gè)頁(yè)是否使用高速緩存策略.

  A 是訪問(wèn)位. 該位由處理器固件設(shè)置, 用來(lái)指示此表項(xiàng)所指向的頁(yè)是否被訪問(wèn)過(guò).

  D(Dirty) 是臟位. 該位由處理器固件設(shè)置, 用來(lái)指示此表項(xiàng)所指向的頁(yè)是否寫過(guò)數(shù)據(jù)

  PAT(Page Attribute Table) 頁(yè)屬性表支持位. 此位涉及更復(fù)雜的分頁(yè)系統(tǒng), 和頁(yè)高速緩存有關(guān), 可以不予理會(huì), 在普通的4KB分頁(yè)機(jī)制中, 處理器建議將其置0.

  G 是全局位. 用來(lái)指示該表項(xiàng)所指向的頁(yè)是否為全局性質(zhì)的. 如果頁(yè)是全局的, 那么, 它將在高速緩存中一直保存(也就意味著地址轉(zhuǎn)換速度會(huì)很快). 因?yàn)轫?yè)高速緩存容量有限, 只能存放頻繁使用的那些表項(xiàng). 而且, 當(dāng)因任務(wù)切換等原因改變CR3寄存器的內(nèi)容時(shí), 整個(gè)頁(yè)高速緩存的內(nèi)容都會(huì)被刷新.

  AVL位卑處理器忽略, 軟件可以使用.

  CR3(PDBR)和開(kāi)分頁(yè)機(jī)制

  控制寄存器CR3, 也就是頁(yè)目錄表基地址寄存器PDBR, 該寄存器如上圖所示.

  由于頁(yè)目錄表必須位于一個(gè)自然頁(yè)內(nèi)(4KB對(duì)齊), 故其物理地址的低12位是全0. 低12位除了PCD和PWT外, 都沒(méi)有使用. 這兩位用于控制頁(yè)目錄的高速緩存特性, 參見(jiàn)上面解釋.

  控制寄存器CR0的最高位PG位, 用于開(kāi)啟分頁(yè)或者關(guān)閉頁(yè)功能. 當(dāng)該位清0時(shí), 頁(yè)功能關(guān)閉, 從段部件來(lái)的線性地址就是物理地址. 當(dāng)它置位時(shí), 頁(yè)功能開(kāi)啟. 只能在保護(hù)模式下才能開(kāi)啟分頁(yè)功能, 當(dāng)PE位清0時(shí)(實(shí)模式), 設(shè)置PG位將導(dǎo)致處理器產(chǎn)生一個(gè)異常中斷.

  不存在的頁(yè)表:

  使用二級(jí)表結(jié)構(gòu),并沒(méi)有解決需要使用4MB內(nèi)存來(lái)存放頁(yè)表的問(wèn)題。實(shí)際上,我們把問(wèn)題搞得有些復(fù)雜了。因?yàn)槲覀冃枰碓鲆粋€(gè)頁(yè)面來(lái)存放目錄表。然而,二級(jí)表結(jié)構(gòu)允許頁(yè)表被分散在內(nèi)存各個(gè)頁(yè)面中,而不需要保存在連續(xù)的4MB內(nèi)存塊中。另外,并不需要為不存在的或線性地址空間未使用部分分配二級(jí)頁(yè)表。雖然目錄表頁(yè)面必須總是存在于物理內(nèi)存中,但是二級(jí)頁(yè)表可以在需要時(shí)再分配。這使得頁(yè)表結(jié)構(gòu)的大小對(duì)應(yīng)于實(shí)際使用的線性地址空間大小。

  頁(yè)目錄表中每個(gè)表項(xiàng)也有一個(gè)存在(present)屬性,類似于頁(yè)表中的表項(xiàng)。頁(yè)目錄表項(xiàng)中的存在屬性指明對(duì)應(yīng)的二級(jí)頁(yè)表是否存在。如果目錄表項(xiàng)指明對(duì)應(yīng)的二級(jí)頁(yè)表存在,那么通過(guò)訪問(wèn)二級(jí)表,表查找過(guò)程第2步將同如上描述繼續(xù)下去。如果存在位表明對(duì)應(yīng)的二級(jí)表不存在,那么處理器就會(huì)產(chǎn)生一個(gè)異常來(lái)通知操作系統(tǒng)。頁(yè)目錄表項(xiàng)中的存在屬性使得操作系統(tǒng)可以根據(jù)實(shí)際使用的線性地址范圍來(lái)分配二級(jí)頁(yè)表頁(yè)面。

  目錄表項(xiàng)中的存在位還可以用于在虛擬內(nèi)存中存放二級(jí)頁(yè)表。這意味著在任何時(shí)候只有部分二級(jí)頁(yè)表需要存放在物理內(nèi)存中,而其余的可保存在磁盤上。處于物理內(nèi)存中頁(yè)表對(duì)應(yīng)的頁(yè)目錄項(xiàng)將被標(biāo)注為存在,以表明可用它們進(jìn)行分頁(yè)轉(zhuǎn)換。處于磁盤上的頁(yè)表對(duì)應(yīng)的頁(yè)目錄項(xiàng)將被標(biāo)注為不存在。由于二級(jí)頁(yè)表不存在而引發(fā)的異常會(huì)通知操作系統(tǒng)把缺少的頁(yè)表從磁盤上加載進(jìn)物理內(nèi)存。把頁(yè)表存儲(chǔ)在虛擬內(nèi)存中減少了保存分頁(yè)轉(zhuǎn)換表所需要的物理內(nèi)存量。

  總結(jié):給定虛擬地址,怎么找到它對(duì)應(yīng)的物理地址?分兩步!

  第一步從虛擬地址到線性地址,第二步從線性地址從物理地址。

  第一步從段描述符表描述的段基址加上段偏移生成線性地址。

  IA32中線性地址高10位為頁(yè)目錄索引,通過(guò)此找到頁(yè)表,線性地址中間10位為頁(yè)表項(xiàng)索引,通過(guò)前面找到的頁(yè)表加上這個(gè)索引,找到頁(yè)表項(xiàng)。頁(yè)表項(xiàng)指示著頁(yè)框號(hào),頁(yè)框號(hào)加上線性地址低12位(頁(yè)內(nèi)偏移)就生成了物理地址。

看過(guò)“虛擬地址與物理地址怎么映射”的人還看了:

1.虛擬地址和物理地址轉(zhuǎn)換

2.物理地址與虛擬地址映射

3.物理地址與虛擬地址怎么轉(zhuǎn)換

4.虛擬地址空間映射到物理地址空間

5.虛擬地址到物理地址的轉(zhuǎn)換

6.虛擬地址物理地址

909585