一. 物理地址
1. 基本概念
-
物理存儲器(內存/主存/邏輯存儲器)
:由微處理器外部地址總線尋址的存儲器- 這裏的內存不特指計算機安裝的內存條,而是指所有能被cpu直接尋址訪問的存儲器。包括內存條、顯存和一些ROM
- 簡單說:CPU把所有與cpu總線相連接並受其控制的的存儲器,都看作一個統一的整體,對他們統一編址,這其中包括內存、顯存、系統ROM等等,統稱它們爲存儲器,存儲器中按編址取一個字長的大小,就是一個存儲單元。
-
物理地址
:物理存儲器按8位的字節序列加以組織,每個字節有唯一的地址與之對應 -
物理地址空間
:物理地址的大小。- 物理地址是用外部地址總線尋址的,因此物理地址空間的上限受到總線條數限制,m條地址線對應的物理地址空間爲,物理地址範圍
- 如果cpu工作在保護方式下,實際的物理地址空間除了地址線數量外,還受到系統配置的內存容量限制
- 物理地址空間大小不等於實際安裝物理內存大小,它描述的是CPU的最大尋址能力
2. 說明
- 在CPU實模式下,沒有分段或分頁機制,Cpu不進行自動地址轉換,這時程序員操作的就是物理地址
- 無論任何操作,最終都必須要得到物理地址才能在物理內存上進行操作。
二. 邏輯地址
後面會更詳細地說明分段管理和邏輯地址,這裏先簡單引入一下
1. 基本概念
邏輯地址
:操作系統或應用程序面對的存儲單元地址的表示形式。分段存儲管理方式把內存劃分爲多個邏輯段(代碼段、數據段、堆棧段等),從而把不同的數據存儲隔離開。這種情況下,用 “段起始地址+段內偏移地址” 這種形式來描述數據地址就是很自然的,這就是所謂的邏輯地址,它的描述形式是段號:偏移地址
段號
用來查找段的起始地址,它被存儲在段寄存器中- 實方式下,段號是段值
- 保護方式下,段號是段選擇子
偏移地址/有效地址
:存儲單元的物理地址與所在段起始地址的差值
2. 說明
- 邏輯地址是面向上層程序員的。用C語言聲明一個char數組,我們說兩個相鄰元素間地址差1,這就是邏輯地址中偏移地址的體現。對於應用程序員或者說對於應用程序來說,他們只需要和邏輯地址打交道,分段分頁機制、物理地址轉換等更底層的內容對他們是透明的。
- 邏輯地址並不一定是元素存儲的真實地址,即數組元素的物理地址(在內存條中所處的位置),並非是連續的,只是操作系統通過地址映射,將邏輯地址映射成連續的,這樣更符合人們的直觀思維
- 要注意的一點是,邏輯地址只是一個描述形式,cpu真正用來尋址的是虛擬地址,而虛擬地址是用邏輯地址形式描述的
三. 虛擬地址
1. 爲什麼有虛擬地址(個人理解)
- 我們知道物理地址空間受限於地址線數目,但是邏輯地址的描述能力往往更強,可以描述的地址範圍常會超過物理地址空間大小,這些多餘的地址可以應用嗎?如果只限於主存,當然不能,但是如果我們利用外部存儲器(磁盤)的話情況就不同了。
- 所謂虛擬存儲器(虛擬內存),它由全部的主存和一部分磁盤空間組成。我們用虛擬地址指示虛擬內存的地址;用虛擬地址空間描述其尺寸,它的大小等於窮盡邏輯地址描述能力的空間大小,這往往比物理地址空間大許多。
- 藉助磁盤等輔助存儲器來擴大主存容量,我們就可以編寫內存需求更大的程序
2. 基本概念
虛擬存儲器
:這不是任何實際的物理存儲器,而是藉助磁盤等輔助存儲器來擴大主存容量,使之爲更大或更多的程序所使用。虛擬地址
:用於指示虛擬存儲器的地址,它是用邏輯地址指示的。虛擬地址空間
:表示虛擬地址的範圍,其大小爲邏輯地址的描述能力極限大小。
3. 說明
- 只有保護方式才支持虛擬地址,實方式是不支持的
- 前面說明過,在保護方式下的邏輯地址用段選擇子指示段號,通常段選擇子是16位的,其中14位表示地址信息,虛擬地址空間大小如下:
- 雖然虛擬地址空間很大,但用邏輯地址指示的一個虛擬地址取值僅限於物理地址空間,這還是由於cpu尋址能力的限制,一共就那麼多地址線,你給他更大的地址根本輸入不了啊。看到這裏大家可能很奇怪,欸,不是說虛擬地址空間很大嗎,這咋取值又侷限在物理地址空間了?事實上,操作系統會給每個進程分配一塊大小爲物理地址空間大小的虛擬內存,各個進程之間相互獨立,也就是說,甚至有可能兩個進程同時請求訪問了同一個虛擬地址。看起來會衝突?要知道CPU是通過時間片輪轉的方法使不同的程序併發執行的,所以在某一時刻只有一個程序佔據CPU資源。MMU(內存管理單元)負責把虛擬地址轉換爲物理地址,在每一個時刻,它會先在主存中尋找指定的數據,如果發現數據不對,就會觸發內存缺頁錯誤,這時就從磁盤中找到缺的頁加入內存,如果內存空間不足,還會從內存中置換頁出來,從而保證程序的正常執行。
在別人的文章看到一個比喻挺有意思,搬過來
CPU只需要說找哪一個頁面,MMU就將這個頁面翻譯成物理地址,再通過頁面調度機制來講不在內存中的頁加入到內存中。我認爲計算機使用的是一種各司其職的方法。CPU老大隻需要虛擬地址中的一頁,範圍在0x00000000到0xFFFFFFFF,因爲他的地址總線是32位,4G是他最大的能力,然後他就把任務分配給他的手下,CPU不需要知道他的手下是如何找到這一頁,他只負責去要這一頁和執行這些代碼,然後他就和他的手下說“有招想去,沒招死去”,他的手下必須要能找到這一頁,然後內存非常有限,而CPU不管這個,只需要你能找到這一頁讓我執行就好,所以CPU的手下就將硬盤中的一部分當做內存,然後拿來騙CPU說,“這是我從內存中找到的”,然後CPU就去運行。如果訪問的地方實在是不能找到,或者是沒有權限,那麼這個程序就真死了。程序員在開發的時候,因爲程序員所編寫的代碼最終是要讓CPU去執行,所以程序員也理所應當認爲我有4G的內存空間,程序員把程序交給CPU,CPU就交給他手下。
四、小結
以下是我個人理解的幾種地址之間的關係圖,歡迎指正