邏輯地址、線性地址、物理地址、虛擬地址、地址空間、特權級

蛋疼的概念,總是讓人琢磨不透,每每遇到這些形似的名詞,我總感覺是我小學時候近義詞練習做少了。因爲每次我都要花很多時間才能真正的能夠說服自己的搞懂這些概念。

邏輯地址:很簡單,就是你源程序裏使用的地址,或者源代碼經過編譯以後編譯器將一些標號,變量轉換成的地址,或者相對於當前段的偏移地址。

線性地址:這個地址很重要,也很不容易理解。分段機制下CPU尋址是二維的地址即,段地址:偏移地址,CPU不可能認識二維地址,因此需要轉化成一維地址即,段地址*16+偏移地址,這樣得到的地址便是線性地址(在未開啓分頁機制的情況下也是物理地址)。這樣有什麼意義呢?或者說這個一維地址的計算方法隨便一個學計算機的人都知道,但是你真的理解它的意思嗎?要想理解它的意思,必須要知道什麼是地址空間,下文詳述。

物理地址:很簡單,將內存條看出一個大的數組,下標從0開始到0xFFFFFFFF,其中任意一個下標標記一個內存條上的一個字節的存儲空間

虛擬地址:虛擬地址就是邏輯地址,又叫虛地址


地址空間:這個很重要,不理解地址空間,你就不理解進程,不理解用戶空間,不理解內核空間,不理解虛擬存儲,不理解分頁機制,你就沒學過計算機。操作系統爲了支持多任務,保護各個任務合理的共享和隔離一些數據和代碼,還爲了其他很多原因,必須要讓每個任務都有自己的地址空間,就是說你在給編寫每個程序代碼的時候可以隨意讀寫地址空間內的數據,而不用擔心會不會讀寫到其他程序的代碼塊中去了。32位OS中,每個程序都有4G的內存空間,就是說A程序可以往0X12345中寫一個值,B程序也可以往0X12345中寫一個值,兩個值雖然表面上寫到一個地方去了,但是你根本不用擔心,它們根本沒有寫到一個地方去了,它們都是寫在自己的用戶空間中,經過幾次地址映射就映射到不同的物理地址上去了。4G內存空間的地址就是線性地址,也就是說線性地址就是用來標識這個4G的虛擬的用戶空間的。

用戶空間:每個程序都有4G內存空間,但是分爲兩個部分,0-3G是用戶空間,3-4G是內核空間。

內核空間:既然3-4G是內核空間,那麼爲什麼要搞個內核空間呢?我們自己的程序,比如一個helloworld,要拿1個G的空間出來給內核幹毛呢?其實是這樣的,這1個G必須拿,而且每個程序都要拿,而且拿的位置都一樣。爲了使OS內核代碼與所有其他程序代碼相隔離,同時又要讓OS內核代碼可以被其他程序代碼所調用訪問,必須要把OS內核也看成一個任務,存放在內存某個區域,然後每個普通程序對應的頁表中都加入這麼一段,使該程序的高1G內存空間,映射到相同的物理區域中,這個物理區域就是OS內核所在的地方,這樣就可以認爲內核空間爲所有進程共有。如果看不懂,建議補充相關知識!

特權級:特權級指的是一段程序內部各個段所處的級別。即一個程序源代碼有好幾個段,那麼每一個段都對應一個特權級,每一個特權級都有自己獨立的堆棧,當程序從一個段訪問到另一個段併發生特權級轉換的時候,需要更改程序使用的堆棧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章