學(xué)習(xí)啦>學(xué)習(xí)電腦>電腦入門>

邏輯地址轉(zhuǎn)物理地址

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

  物理地址是明確的、最終用在總線上的編號(hào)。那么邏輯地址轉(zhuǎn)物理地址怎么轉(zhuǎn)?學(xué)習(xí)啦小編為大家介紹邏輯地址轉(zhuǎn)物理地址的解決方法。希望大家喜歡。

  邏輯地址轉(zhuǎn)物理地址參考如下

  1. 物理地址和邏輯地址

  物理地址:加載到內(nèi)存地址寄存器中的地址,內(nèi)存單元的真正地址。在前端總線上傳輸?shù)膬?nèi)存地址都是物理內(nèi)存地址,編號(hào)從0開始一直到可用物理內(nèi)存的最高端。這些數(shù)字被北橋(Nortbridge chip)映射到實(shí)際的內(nèi)存條上。物理地址是明確的、最終用在總線上的編號(hào),不必轉(zhuǎn)換,不必分頁,也沒有特權(quán)級(jí)檢查(no translation, no paging, no privilege checks)。

  邏輯地址:CPU所生成的地址。邏輯地址是內(nèi)部和編程使用的、并不唯一。例如,你在進(jìn)行C語言指針編程中,可以讀取指針變量本身值(&操作),實(shí)際上這個(gè)值就是邏輯地址,它是相對(duì)于你當(dāng)前進(jìn)程數(shù)據(jù)段的地址(偏移地址),不和絕對(duì)物理地址相干。

  為什么會(huì)有這兩種地址?

  個(gè)人覺的原因在于邏輯地址分配更加靈活,可以允許不唯一,看起來也較為直觀,例如,一段代碼中分配數(shù)組,邏輯地址上是連續(xù)的,然而在物理地址上,這個(gè)數(shù)組所占用的頁可能分散開來,物理地址上就是不連續(xù)的,這樣對(duì)程序的可理解性上有影響。另外,有了邏輯地址這個(gè)概念,才能使用虛擬內(nèi)存技術(shù)。

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

  物理地址(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)換”,沒有虛擬地址的概念,這樣做是根本行不通的。

  邏輯地址(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)換前地址。

607198