複製鏈接
請複製以下鏈接發送給好友

地址空間

鎖定
地址空間(address space)表示任何一個計算機實體所佔用的內存大小。比如外設、文件、服務器或者一個網絡計算機。地址空間包括物理空間以及虛擬空間
中文名
地址空間
外文名
address space
表    示
計算機實體所佔用的內存大小
地址空間
包括物理空間以及虛擬空間

地址空間導讀

地址空間存儲器抽象

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

地址空間暴露問題

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

地址空間概念

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

地址空間物理地址與虛擬地址

物理地址 (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等,遠小於地址空間所允許的範圍 [1] 

地址空間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的虛擬地址空間 [3] 
參考資料
  • 1.    楊江明, 顧寧, 吳悠媛. 基於地址空間轉換方法的Undo操作支持[J]. 通信學報, 2006, 27(3):48-56.
  • 2.    陳文龍, 徐明偉. 面向地址空間分離網絡的地址映射模型:AMIA[J]. 計算機學報, 2012, 35(1):76-84.
  • 3.    劉福巖, 尤晉元, 曾國蓀. 通過單地址空間提高微內核操作系統的效率[J]. 計算機工程, 2000, 26(9):49-50.