六月丁香五月婷婷,丁香五月婷婷网,欧美激情网站,日本护士xxxx,禁止18岁天天操夜夜操,18岁禁止1000免费,国产福利无码一区色费

學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 電腦入門 > 虛擬地址與物理地址的轉(zhuǎn)換

虛擬地址與物理地址的轉(zhuǎn)換

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

虛擬地址與物理地址的轉(zhuǎn)換

  虛擬地址轉(zhuǎn)換為物理地址的第一步是將從處理器得到的虛擬地址和TLB中的虛擬地址進(jìn)行比較。,今天學(xué)習(xí)啦小編與大家分享下虛擬地址與物理地址的轉(zhuǎn)換,有需要的朋友不妨了解下。

  虛擬地址與物理地址的轉(zhuǎn)換

  已知一個(gè)虛擬地址0x01AF5518, 則轉(zhuǎn)換的過程如下:

  注意: *這里討論的以Windows下普通模式分頁的情況, 也就是2級(jí)頁表的情況*

  1.首先把虛擬地址拆分成3個(gè)部分(低12位, 中10位, 高10位), 換成2進(jìn)制如下:

  -> 0000 0001 1010 1111 0101 0101 0001 1000

  按照10, 10, 12的位數(shù)重新排列后

  -> (頁目錄索引)00 000 00110, (頁表項(xiàng)索引)10 1111 0101, (偏移)0101 0001 1000

  換算成十六進(jìn)制后可以得到如下結(jié)果

  頁目錄索引 = 6, 頁表項(xiàng)索引 = 0x2f5 , 偏移 = 0x518

  2. 根據(jù)當(dāng)前的CR3寄存器中的物理地址定位頁目錄表基址

  Cr3中存放的是物理地址, 這個(gè)物理地址指向進(jìn)程的頁目錄表基址, 由此可以得到

  頁目錄表基址(PDE) = Cr3 = 0xAA0E5000

  3. 計(jì)算頁表項(xiàng)的地址

  頁表地址存放在頁目錄表(PDE)中的第6個(gè)項(xiàng)目中, 也就是

  [0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867為該頁表屬性值, PTE = 0x3D955000

  3. 計(jì)算頁面物理地址

  我們要找的頁面在這個(gè)頁表中的第0x2f5項(xiàng), 所以虛擬地址所在的頁的物理地址為

  [0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =

  假設(shè)[0x3D955BD4] = 0x7095e847, 頁面的物理地址 x0x7095e000, 0x00000847表示的是頁面屬性

  4. 計(jì)算最終的物理地址

  由虛擬地址分離的偏移可以計(jì)算出最終的物理地址為

  0x7095E000 + 0x00000518 = 0x7095E518.

  虛擬地址和物理地址的概念

  CPU通過地址來訪問內(nèi)存中的單元,地址有虛擬地址和物理地址之分,如果CPU沒有MMU(Memory Management Unit,內(nèi)存管理單元),或者有MMU但沒有啟用,CPU核在取指令或訪問內(nèi)存時(shí)發(fā)出的地址將直接傳到CPU芯片的外部地址引腳上,直接被內(nèi)存芯片(以下稱為物理內(nèi)存,以便與虛擬內(nèi)存區(qū)分)接收,這稱為物理地址(Physical Address,以下簡(jiǎn)稱PA),如下圖所示。

  物理地址示意圖

  如果CPU啟用了MMU,CPU核發(fā)出的地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡(jiǎn)稱VA),而MMU將這個(gè)地址翻譯成另一個(gè)地址發(fā)到CPU芯片的外部地址引腳上,也就是將虛擬地址映射成物理地址,如下圖所示[1]。

  虛擬地址示意圖

  MMU將虛擬地址映射到物理地址是以頁(Page)為單位的,對(duì)于32位CPU通常一頁為4K。例如,虛擬地址0xb700 1000~0xb700 1fff是一個(gè)頁,可能被MMU映射到物理地址0x2000~0x2fff,物理內(nèi)存中的一個(gè)物理頁面也稱為一個(gè)頁框(Page Frame)。

  內(nèi)核也不能直接訪問物理地址.但因?yàn)閮?nèi)核的虛擬地址和物理地址之間只是一個(gè)差值0xc0000000的區(qū)別,所以從物理地址求虛擬地址或從虛擬地址求物理地址很容易,+-這個(gè)差就行了

  物理地址(physical address)

  用于內(nèi)存芯片級(jí)的單元尋址,與處理器和CPU連接的地址總線相對(duì)應(yīng)。

  ——這個(gè)概念應(yīng)該是這幾個(gè)概念中最好理解的一個(gè),但是值得一提的是,雖然可以直接把物理地址理解成插在機(jī)器上那根內(nèi)存本身,把內(nèi)存看成一個(gè)從0字節(jié)一直到最大空量逐字節(jié)的編號(hào)的大數(shù)組,然后把這個(gè)數(shù)組叫做物理地址,但是事實(shí)上,這只是一個(gè)硬件提供給軟件的抽像,內(nèi)存的尋址方式并不是這樣。所以,說它是“與地址總線相對(duì)應(yīng)”,是更貼切一些,不過拋開對(duì)物理內(nèi)存尋址方式的考慮,直接把物理地址與物理的內(nèi)存一一對(duì)應(yīng),也是可以接受的。也許錯(cuò)誤的理解更利于形而上的抽像。

  虛擬內(nèi)存(virtual memory)

  這是對(duì)整個(gè)內(nèi)存(不要與機(jī)器上插那條對(duì)上號(hào))的抽像描述。它是相對(duì)于物理內(nèi)存來講的,可以直接理解成“不直實(shí)的”,“假的”內(nèi)存,例如,一個(gè)0x08000000內(nèi)存地址,它并不對(duì)就物理地址上那個(gè)大數(shù)組中0x08000000 - 1那個(gè)地址元素;

  之所以是這樣,是因?yàn)楝F(xiàn)代操作系統(tǒng)都提供了一種內(nèi)存管理的抽像,即虛擬內(nèi)存(virtual memory)。進(jìn)程使用虛擬內(nèi)存中的地址,由操作系統(tǒng)協(xié)助相關(guān)硬件,把它“轉(zhuǎn)換”成真正的物理地址。這個(gè)“轉(zhuǎn)換”,是所有問題討論的關(guān)鍵。

  有了這樣的抽像,一個(gè)程序,就可以使用比真實(shí)物理地址大得多的地址空間。(拆東墻,補(bǔ)西墻,銀行也是這樣子做的),甚至多個(gè)進(jìn)程可以使用相同的地址。不奇怪,因?yàn)檗D(zhuǎn)換后的物理地址并非相同的。

  ——可以把連接后的程序反編譯看一下,發(fā)現(xiàn)連接器已經(jīng)為程序分配了一個(gè)地址,例如,要調(diào)用某個(gè)函數(shù)A,代碼不是call A,而是call 0x0811111111 ,也就是說,函數(shù)A的地址已經(jīng)被定下來了。沒有這樣的“轉(zhuǎn)換”,沒有虛擬地址的概念,這樣做是根本行不通的。

  打住了,這個(gè)問題再說下去,就收不住了。

  邏輯地址(logical address)

  Intel為了兼容,將遠(yuǎn)古時(shí)代的段式內(nèi)存管理方式保留了下來。邏輯地址指的是機(jī)器語言指令中,用來指定一個(gè)操作數(shù)或者是一條指令的地址。以上例,我們說的連接器為A分配的0x08111111這個(gè)地址就是邏輯地址。

  ——不過不好意思,這樣說,好像又違背了Intel中段式管理中,對(duì)邏輯地址要求,“一個(gè)邏輯地址,是由一個(gè)段標(biāo)識(shí)符加上一個(gè)指定段內(nèi)相對(duì)地址的偏移量,表示為 [段標(biāo)識(shí)符:段內(nèi)偏移量],也就是說,上例中那個(gè)0x08111111,應(yīng)該表示為[A的代碼段標(biāo)識(shí)符: 0x08111111],這樣,才完整一些”

  線性地址(linear address)或也叫虛擬地址(virtual address)

  跟邏輯地址類似,它也是一個(gè)不真實(shí)的地址,如果邏輯地址是對(duì)應(yīng)的硬件平臺(tái)段式管理轉(zhuǎn)換前地址的話,那么線性地址則對(duì)應(yīng)了硬件頁式內(nèi)存的轉(zhuǎn)換前地址。

  -------------------------------------------------------------

  CPU將一個(gè)虛擬內(nèi)存空間中的地址轉(zhuǎn)換為物理地址,需要進(jìn)行兩步:首先將給定一個(gè)邏輯地址(其實(shí)是段內(nèi)偏移量,這個(gè)一定要理解!!!),CPU要利用其段式內(nèi)存管理單元,先將為個(gè)邏輯地址轉(zhuǎn)換成一個(gè)線程地址,再利用其頁式內(nèi)存管理單元,轉(zhuǎn)換為最終物理地址。

  這樣做兩次轉(zhuǎn)換,的確是非常麻煩而且沒有必要的,因?yàn)橹苯涌梢园丫€性地址抽像給進(jìn)程。之所以這樣冗余,Intel完全是為了兼容而已。

  物理地址就是,機(jī)器內(nèi)主存的地址,包括RAM和ROM

  邏輯地址就是,程序運(yùn)行在內(nèi)存中,使用的地址。

  虛擬地址就是,cpu支持的內(nèi)存空間遠(yuǎn)遠(yuǎn)大于機(jī)器主存的大小,這些多出來的空間對(duì)于程序來說是可以用的,這個(gè)時(shí)候的所有地址都稱為虛擬地址

  物理地址:最小系統(tǒng)下的存儲(chǔ)器的實(shí)際地址,一般只是由CPU內(nèi)存控制器(地址線)可以管理的容量為最大地址,而實(shí)際上這個(gè)容量(由地址產(chǎn)生的)遠(yuǎn)大于實(shí)際存在的容量;實(shí)際的存儲(chǔ)器容量所需要的地址(內(nèi)存)控制器管理的容量;它的大小一般由芯片決定

  邏輯地址:相對(duì)程序員而言使用的地址,或說程序無需知道具體的實(shí)際地址管理數(shù),而只要在系統(tǒng)(操作)允許范圍內(nèi)使用就行了(這時(shí)使用的是一種算法控制下的地址,實(shí)際上它只是借用地址概念產(chǎn)生的程序運(yùn)行模式),它所要說明的是方便,也就是一個(gè)線性的(最好)的程序(指令)排列方式。它的大小一般由操作系統(tǒng)決定

  虛擬地址:將具有存儲(chǔ)功能的所有存儲(chǔ)器(不僅僅是最小系統(tǒng)概念下的),進(jìn)行“統(tǒng)一”編址,而不考慮存儲(chǔ)器之間的差異(快慢等),這時(shí)的地址是一個(gè)比邏輯地址理會(huì)數(shù)學(xué)化的編號(hào)(地址),它的大小等往往由應(yīng)用程序決定

  

看過“虛擬地址與物理地址的轉(zhuǎn)換”的人還看了:

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

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

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

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

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

6.虛擬地址物理地址

909550