地址空間

地址空間

地址空間(address space)表示任何一個計算機實體所占用的記憶體大小。比如外設、檔案、伺服器或者一個網路計算機。地址空間包括物理空間以及虛擬空間

基本介紹

  • 中文名:地址空間
  • 外文名:address space
  • 表示:計算機實體所占用的記憶體大小
  • 地址空間:包括物理空間以及虛擬空間
導讀,存儲器抽象,暴露問題,概念,物理地址與虛擬地址,和地址空間,IPv6地址空間,Linux進程的虛擬地址空間,

導讀

存儲器抽象

計算機中,每個設備以及進程都被分配了一個地址空間。處理器的地址空間由其地址匯流排以及暫存器決定。地址空間可以分為Flat——表示起始空間位置為0;或者Segmented——表示空間位置由偏移量決定。在一些系統中,可以進行地址空間的類型轉換。至於IP位址空間,IPV4協定並沒有預見到IP位址的需求量如此之大,32位的地址空間已經無法滿足需求了。因此,開發了IPV6協定,支持128位的地址空間。

暴露問題

把物理地址暴露給進程會帶來下面幾個嚴重問題。第一,如果用戶程式可以定址記憶體的每個位元組,它們就可以很容易地(故意地或偶然地)破壞作業系統,從而使系統慢慢地停止運行。即使在只有一個用戶進程運行的情況下,這個問題也是存在的。第二,使用這種模型,想要同時(如果只有一個CPU就輪流執行)運行多個程式是很困難的。在個人計算機上,同時打開幾個程式是很常見的(一個文字處理器,一個郵件程式,一個網路瀏覽器,其中一個當前正在工作,其餘的在按下滑鼠的時候才會被激活)。在系統中沒有對物理記憶體的抽象的情況下,很難做到上述情景,因此,我們需要其他辦法。

概念

要保證多個應用程式同時處於記憶體中並且不互相影響,則需要解決兩個問題:保護和重定位。我們來看一個原始的對前者的解決辦法:給記憶體塊標記上一個保護鍵,並且比較執行進程的鍵和其訪問的每個記憶體字的保護鍵。然而,這種方法本身並沒有解決後一個問題,雖然這個問題可以通過在程式被裝載時重定位程式來解決,但這是一個緩慢且複雜的解決方法。
一個更好的辦法是創造一個新的記憶體抽象:地址空間。就像進程的概念創造了一類抽象的CPU以運行程式一樣,地址空間為程式創造了一種抽象的記憶體。地址空間是一個進程可用於定址記憶體的一套地址集合。每個進程都有一個自己的地址空間,並且這個地址空間獨立於其他進程的地址空間(除了在一些特殊情況下進程需要共享它們的地址空間外)。
地址空間的概念非常通用,並且在很多場合中出現。隨著數量的增長,空間變得越來越不夠用了,從而導致需要使用更多位數。
地址空間可以不是數字的。網際網路域名也是地址空間。這個地址空間是由所有包含2~63個字元並且後面跟著字元串組成的,組成這些字元串的字元可以是字母、數字和連字元

物理地址與虛擬地址

物理地址 (physical address): 放在定址匯流排上的地址。放在定址匯流排上,如果是讀,電路根據這個地址每位的值就將相應地址的物理記憶體中的數據放到數據匯流排中傳輸。如果是寫,電路根據這個地址每位的值就將相應地址的物理記憶體中放入數據匯流排上的內容。物理記憶體是以位元組(8位)為單位編址的。
虛擬地址 (virtual address): CPU啟動保護模式後,程式運行在虛擬地址空間中。注意,並不是所有的“程式”都是運行在虛擬地址中。CPU在啟動的時候是運行在實模式的,核心在初始化頁表之前並不使用虛擬地址,而是直接使用物理地址的。

和地址空間

物理存儲器和存儲地址空間是兩個不同的概念。但是由於這兩者有十分密切的關係,而且兩者都用B、KB、MB、GB來度量其容量大小,因此容易產生認識上的混淆,弄清這兩個不同的概念,有助於進一步認識主存儲器和用好主存儲器。
物理存儲器是指實際存在的具體存儲器晶片。如主機板上裝插的主存條和裝載有系統的BIOS的ROM晶片,顯示卡上的顯示RAM晶片和裝載顯示BIOS的ROM晶片,以及各種適配卡上的RAM晶片和ROM晶片都是物理存儲器。
存儲地址空間是指對存儲器編碼(編碼地址)的範圍。所謂編碼就是對每一個物理存儲單元(一個位元組)分配一個號碼,通常叫作“編址”。分配一個號碼給一個存儲單元的目的是為了便於找到它,完成數據的讀寫,這就是所謂的“定址”(所以,有人也把地址空間稱為定址空間)。
CPU在操控物理存儲器的時候,把物理存儲器都當作記憶體來對待,把它們總的看作一個由若干存儲單元組成的邏輯存儲器,這個邏輯存儲器就是我們所說的記憶體地址空間。
有的物理存儲器被看作一個由若干存儲單元組成的邏輯存儲器,每個物理存儲器在這個邏輯存儲器中占有一個地址段,即一段地址空間。CPU在這段地址空間中讀寫數據,實際上就是在相對應的物理存儲器中讀寫數據。
地址空間的大小和物理存儲器的大小並不一定相等。舉個例子來說明這個問題:某層樓共有17個房間,其編號為801~817。這17個房間是物理的,而其地址空間採用了三位編碼,其範圍是800~899共100個地址,可見地址空間是大於實際房間數量的。
對於386以上檔次的微機,其地址匯流排為32位,因此地址空間可達2的32次方,即4GB。但實際上我們所配置的物理存儲器通常只有1MB、2MB、4MB、8MB、16MB、32MB等,遠小於地址空間所允許的範圍。

IPv6地址空間

IPv6是下一代網際網路協定。現有的網際網路是在IPv4的基礎上運行的,隨著網際網路的迅速發展,IPv4定義的有限地址(IP位址)空間將被耗盡,必將影響網際網路的進一步發展。IPv4採用32位地址長度,只有大約43億個地址,估計在2009~2010年間將被分配完畢。IPv6重新定義地址空間,採用128位地址長度,幾乎可以不受限制地提供地址,保守估計IPv6實際可分配的地址,整個地球每平方米麵積上就可分配1000多個地址。
除了地址空間巨大之外,IPv6還具有這幾方面的優勢:無狀態自動配置,網路更加安全,服務質量更好。

Linux進程的虛擬地址空間

在x86體系結構中分段機制是必選的,而分頁機制則可由具體的作業系統而選擇,Linux通過讓段的基地址為0而巧妙的繞過了基地址。因此,對於Linux來說,虛地址和線性地址是一致的。在32位的平台上,線性地址的大小為固定的4GB。並且,由於採用了保護機制,Linux核心將這4GB分為兩部分,虛地址較高的1GB(0xC0000000到0xFFFFFFFF)為共享的核心空間;而較低的3GB(0x00000000到0xBFFFFFFF)為每個進程的用戶空間。由於每個進程都不能直接訪問核心空間,而是通過系統調用間接進入核心,因此,所有的進程都共享核心空間。而每個進程都擁有各自的用戶空間,各個進程之間不能互相訪問彼此的用戶空間。因此,對於每一個具體的進程而言,都擁有4GB的虛擬地址空間。

相關詞條

熱門詞條

聯絡我們