天天看點

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為止,再減小就越界了。

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