X86 保護模式下的段界限的計算

  這幾天一直在學習<<X86彙編語言從實模式到保護模式>>中關於如何計算保護模式下的段界限的內容.個人感覺這本書大部分內容都寫的清楚明白,但這部分知識點講的有點亂,雖然講的很多,但我感覺始終沒有講到點子上,所以我費了好大勁纔算看明白了.下面我把我的理解儘量簡單的描述一下,希望能幫助大家加深理解.

       對於普通段而言,由於段是向上生長的,所以段界限L定義的是段向上增長的最大偏移量,說通俗一點就是這個段的偏移量從0開始增加,最大可以增加到L,超過L就越界了。

       對於堆棧段而言,由於段是向下生長的,所以如果此時段界限L定義的是段向下減少的最大偏移量,說通俗一點就是這個段的偏移量從1開始減少,最大可以減小到L,超過L就越界了。但是由於處理器總是用段基址+偏移量來計算,所以這裏需要將減法轉變成加法,所以段的偏移量變成從0xFFFFFFFF開始減少,最多減少到(4G-L),再往下就越界了。所以對於堆棧而言,真正的段界限的值是(4G-L),而不是L.這裏就是難以理解的地方。這裏理解好了,其他地方就迎刃而解了。

      對於普通段而言,G=1 時段界限L代表的最大偏移量是L*4K+0xFFF,最小爲0,大小爲(L+1)*4K.

      對於堆棧段而言,此時段界限L代表的最小偏移量是4G-(4K*L+0xFFF+1)=4G-(L+1)*4K,最大爲4G-1,大小爲(L+1)*4K.

      最後我們來做個練習實踐一下。如果堆棧段G=1且段的大小爲8K,請問此時段界限L應爲多少,此時段的最小偏移量是多少?請大家看到這裏自己先動手

計算一下後再往下看。

 

 

 


      現在,我們開始解答。G=1情況下粒度爲4K,既然大小爲8K,所以L只能等於1.此時向下的偏移量從0xffffffff開始減小,一直到(4G-8K)=0xFFFFE000爲止,再減小就越界了。

      如果看到這裏,大家還是沒有完全搞懂也很正常,自己在對照着書自己多琢磨琢磨就懂了。

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