在編譯時爲什麼只使用分頁模式會導致覆蓋問題
這個問題困擾了我一天,結果在第二天早上醒來就想通了。
一切的一切,記得一句話 分頁的虛擬地址是一維的,分段的虛擬地址是二維的
一維?二維?
我的理解是,一維就是經過一次映射後獲得的地址,分頁模式的虛擬地址是 頁號x+頁內偏移y
,地址轉換過程是:
- 憑 頁號x 到頁表查,獲取到實際的物理頁a地址
- 實際地址是
物理頁地址a+頁內偏移y
,注意這裏是拼接,而不是加法
二維就是經過兩次映射後獲得的地址,分段模式中的段頁式的虛擬地址就是二維的,格式爲段號 d + 段內偏移 y
地址轉換的過程是:
3. 憑 段號 d去段表查詢,得到 頁號x
4. 憑 頁號x 到頁表查,獲取到實際的物理頁a地址
5. 實際地址是 物理頁地址a+頁內偏移y
分頁
分段
更多請參考 :鏈接
問題提出
這裏我一直看不懂,爲什麼會發生碰撞或者稱爲覆蓋問題?
原因解析
-
編譯器在編譯程序的時候,只分配虛擬地址,此時與分頁或者分段模式沒有一點關係,這是編譯器的事
-
編譯器會給予各種段一個基址——即所有段內的地址都是基於這個地址進行偏移。比如:數據段的基址是
0xA
,代碼段的基址是0xB
,棧段的基址是0xC
-
隨着編譯的不斷進行,各個段都不斷增加內容,他們往同一個方向增長。當某一個段的數據增長特別多,就會觸及上一個段的內容,就會導致一個虛擬地址對應兩個內容:一個是
基址1+偏移量 1
,一個是基址2+偏移量2
,當偏移量2比偏移量1大很多的時候,就會導致覆蓋問題。簡單運算一下,假設
base1+offset1 <= base2+offset2
=>offset2-offset1 >= base1-base2
,就是說當偏移量2比偏移量1相差base1 - base2
就會導致覆蓋/重疊問題。 -
當分頁模式的時候就會把
base1+offset1
當作一個虛擬地址,然後查頁表,當位移過大的時候就會侵略到其他段了。如 頁面大小爲 64k,虛擬地址A爲
1 + 65k
,虛擬地址B爲2 + 0k
由於 65k > 64k ,所以就會接觸了 第 2頁裏面的內容了 -
當分段模式的時候,有以下幾個因素可以保證其不會出現重疊/覆蓋問題:
5.1. 段有大小,如果超過段則會報段溢出
5.2 不同的段會映射到不同的頁表,就是不同的段壓根他們不會在同一張頁表,所以即使offset2 - offset1 > 頁面大小
也沒關係,因爲他們不在同一張頁表