天天看點

邏輯位址、線性位址和實體位址的關系

實體記憶體:資料尋址用;mmu聯系;

虛拟位址:cpu傳給mmu的;給程式員使用;

邏輯位址:cpu指令使用;符合可執行檔案的格式。

二、實體位址、虛拟位址(線性位址)、邏輯位址

     任何時候,計算機上都存在一個程式能夠産生的位址集合,我們稱之為位址範圍。這個範圍的大小由CPU的位數決定,例如一個32位的CPU,它的位址範圍是0~0xFFFFFFFF (4G),而對于一個64位的CPU,它的位址範圍為0~0xFFFFFFFFFFFFFFFF (64T).這個範圍就是我們的程式能夠産生的位址範圍,我們把這個位址範圍稱為虛拟位址空間,該空間中的某一個位址我們稱之為虛拟位址。與虛拟位址空間和虛拟位址相對應的則是實體位址空間和實體位址,大多數時候我們的系統所具備的實體位址空間隻是虛拟位址空間的一個子集。這裡舉一個最簡單的例子直覺地說明這兩者,對于一台記憶體為256M的32bit x86主機來說,它的虛拟位址空間範圍是0~0xFFFFFFFF(4G),而實體位址空間範圍是0x000000000~0x0FFFFFFF(256M)。 

      這裡有一個虛拟記憶體的概念,虛拟記憶體(virtual memory)是對整個記憶體(不要和機器上插那條對上号)的抽像描述。他是相對于實體記憶體來講的,能直接了解成“不直實的”,“假的”記憶體,例如,一個0x08000000記憶體位址,他并不對就實體位址上那個大數組中0x08000000 - 1那個位址元素;之是以是這樣,是因為現代作業系統都提供了一種記憶體管理的抽像,即虛拟記憶體(virtual memory)。程序使用虛拟記憶體中的位址,由作業系統協助相關硬體,把他“轉換”成真正的實體位址。這個“轉換”,是所有問題讨論的關鍵。

有了這樣的抽像,一個程式,就能使用比真實實體位址大得多的位址空間(拆東牆,補西牆,銀行也是這樣子做的),甚至多個程序能使用相同的位址。不奇怪,因為轉換後的實體位址并非相同的。

  實體位址,CPU位址總線傳來的位址,由硬體電路控制(現在這些硬體是可程式設計的了)其具體含義。實體位址中很大一部分是留給記憶體條中的記憶體的,但也常被映射到其他存儲器上(如顯存、BIOS等)。在沒有使用虛拟存儲器的機器上,虛拟位址被直接送到記憶體總線上,使具有相同位址的實體存儲器被讀寫;而在使用了虛拟存儲器的情況下,虛拟位址不是被直接送到記憶體位址總線上,而是送到存儲器管理單元MMU,把虛拟位址映射為實體位址。

        線性位址(Linear Address)也叫虛拟位址(virtual address)是邏輯位址到實體位址變換之間的中間層。在分段部件中邏輯位址是段中的偏移位址,然後加上基位址就是線性位址。是一個32位無符号整數,可以用來表示高達4GB的位址,也就是,高達4294967296個記憶體單元。線性位址通常用十六進制數字表示,值得範圍從0x00000000到0xfffffff)程式代碼會産生邏輯位址,通過邏輯位址變換就可以生成一個線性位址。如果啟用了分頁機制,那麼線性位址可以再經過變換以産生一個實體位址。如果沒有啟用分頁機制,那麼線性位址直接就是實體位址。

        邏輯位址是在有位址變換功能的計算機中,訪内指令給出的位址 (操作數) 叫邏輯位址,也叫相對位址,也就是是機器語言指令中,用來指定一個操作數或是一條指令的位址。要經過尋址方式的計算或變換才得到記憶體儲器中的實際有效位址即實體位址。一個邏輯位址由兩部份組成,段辨別符: 段内偏移量。段辨別符是由一個16位長的字段組成,稱為段選擇符。其中前13位是個索引号,後面3位包含一些硬體細節 。

       CPU将一個邏輯位址轉換為實體位址,需要進行兩步:首先将給定一個邏輯位址(其實是段内偏移量,這個一定要了解!!!),CPU要利用其段式記憶體管理單元,先将為個邏輯位址轉換成一個線程位址,再利用其頁式記憶體管理單元,轉換為最終實體位址。這樣做兩次轉換,的确是非常麻煩而且沒有必要的,因為直接可以把線性位址抽像給程序。之是以這樣備援,Intel完全是為了相容而已(Intel為了相容,将遠古時代的段式記憶體管理方式保留了下來,x86體系的處理器剛開始時隻有20根位址線,尋址寄存器是16位。我們知道16位的寄存器可以通路64K的位址空間,如果程式要想通路大于64K的記憶體,就需要把記憶體分段,每段64K,用段位址+偏移量的方式來通路,這樣使20根位址線全用上,最大的尋址空間就可以到1M位元組,這在當時已經是非常大的記憶體空間了。)。

       現代的多使用者多程序作業系統,需要MMU, 才能達到每個使用者程序都擁有自己獨立的位址空間的目标。使用MMU, 作業系統劃分出一段位址區域, 在這塊位址區域中, 每個程序看到的内容都不一定一樣。例如MICROSOFT WINDOWS作業系統将位址範圍4M-2G劃分為使用者位址空間,程序A在位址0X400000(4M)映射了可執行檔案,程序B同樣在位址0X400000(4M)映射了可執行檔案,如果A程序讀位址0X400000, 讀到的是A的可執行檔案映射到RAM的内容,而程序B讀取位址0X400000時,則讀到的是B的可執行檔案映射到RAM的内容。這就是MMU在當中進行位址轉換所起的作用。

三、分頁機制:頁和頁幀

大多數使用虛拟存儲器的系統都使用一種稱為分頁(paging)機制。虛拟位址空間劃分成稱為頁(page)的機關,而相應的實體位址空間也被進行劃分,機關是頁桢(frame).頁和頁桢的大小必須相同。在這個例子中我們有一台可以生成32位位址的機器,它的虛拟位址範圍從0~0xFFFFFFFF(4G),而這台機器隻有256M的實體位址,是以他可以運作4G的程式,但該程式不能一次性調入記憶體運作。這台機器必須有一個達到可以存放4G程式的外部存儲器(例如磁盤或是FLASH),以保證程式片段在需要時可以被調用。在這個例子中,頁的大小為4K,頁桢大小與頁相同——這點是必須保證的,因為記憶體和外圍存儲器之間的傳輸總是以頁為機關的。對應4G的虛拟位址和256M的實體存儲器,他們分别包含了1M個頁和64K個頁桢。  

Add something:

在保護模式中,它們的含義是: 

虛拟位址--(分段)-> 邏輯位址--(分頁)-> 實體位址 

虛拟位址、邏輯位址隻是保護模式對不同環境下的位址的一種稱呼而已 

程式員隻能使用虛拟位址,但Windows系統自動為應用程式程序的CS、DS、SS、ES對應描述符的段基址設為0(FS指向線程描述塊,GS沒用到) 

這樣對于Windows環境下的應用程式而言,虛拟位址與邏輯位址是等同的,隻需要考慮分頁影響就行 

注意虛拟記憶體管理與虛拟位址的含義不同 

保護模式下虛拟位址主要是為了段權限審查,保護系統段不被應用程式破壞 

虛拟記憶體管理有自己的一套術語,其利用“虛拟位址”實作比主存大得多的虛拟記憶體空間,那是利用保護模式的分頁功能實作的,即保護模式下的邏輯位址

------------------越是喧嚣的世界,越需要甯靜的思考------------------

合抱之木,生于毫末;九層之台,起于壘土;千裡之行,始于足下。

積土成山,風雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,聖心備焉。故不積跬步,無以至千裡;不積小流,無以成江海。骐骥一躍,不能十步;驽馬十駕,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇鳝之穴無可寄托者,用心躁也。

繼續閱讀