在編譯時爲什麼使用分頁會導致覆蓋問題?

在編譯時爲什麼只使用分頁模式會導致覆蓋問題

這個問題困擾了我一天,結果在第二天早上醒來就想通了。
一切的一切,記得一句話 分頁的虛擬地址是一維的,分段的虛擬地址是二維的

一維?二維?

我的理解是,一維就是經過一次映射後獲得的地址,分頁模式的虛擬地址是 頁號x+頁內偏移y,地址轉換過程是:

  1. 頁號x 到頁表查,獲取到實際的物理頁a地址
  2. 實際地址是 物理頁地址a+頁內偏移y,注意這裏是拼接,而不是加法

二維就是經過兩次映射後獲得的地址,分段模式中的段頁式的虛擬地址就是二維的,格式爲段號 d + 段內偏移 y地址轉換的過程是:
3. 憑 段號 d去段表查詢,得到 頁號x
4. 憑 頁號x 到頁表查,獲取到實際的物理頁a地址
5. 實際地址是 物理頁地址a+頁內偏移y

分頁
分頁地址格式分頁

分段
分段

更多請參考 :鏈接

問題提出

碰撞問題
這裏我一直看不懂,爲什麼會發生碰撞或者稱爲覆蓋問題?

原因解析

  1. 編譯器在編譯程序的時候,只分配虛擬地址,此時與分頁或者分段模式沒有一點關係,這是編譯器的事

  2. 編譯器會給予各種段一個基址——即所有段內的地址都是基於這個地址進行偏移。比如:數據段的基址是 0xA,代碼段的基址是0xB,棧段的基址是 0xC

  3. 隨着編譯的不斷進行,各個段都不斷增加內容,他們往同一個方向增長。當某一個段的數據增長特別多,就會觸及上一個段的內容,就會導致一個虛擬地址對應兩個內容:一個是 基址1+偏移量 1,一個是基址2+偏移量2,當偏移量2比偏移量1大很多的時候,就會導致覆蓋問題。

    簡單運算一下,假設 base1+offset1 <= base2+offset2 => offset2-offset1 >= base1-base2 ,就是說當偏移量2比偏移量1相差 base1 - base2就會導致覆蓋/重疊問題。

  4. 當分頁模式的時候就會把 base1+offset1 當作一個虛擬地址,然後查頁表,當位移過大的時候就會侵略到其他段了。

    如 頁面大小爲 64k,虛擬地址A爲 1 + 65k ,虛擬地址B爲 2 + 0k 由於 65k > 64k ,所以就會接觸了 第 2頁裏面的內容了

  5. 當分段模式的時候,有以下幾個因素可以保證其不會出現重疊/覆蓋問題:
    5.1. 段有大小,如果超過段則會報段溢出
    5.2 不同的段會映射到不同的頁表,就是不同的段壓根他們不會在同一張頁表,所以即使 offset2 - offset1 > 頁面大小 也沒關係,因爲他們不在同一張頁表

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