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

2021-09-29 06:25:06 字數 714 閱讀 5486

這幾天一直在學習《對於普通段而言,由於段是向上生長的,所以段界限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為止,再減小就越界了。

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

x86保護模式筆記

以下為自己的總結的x86保護模式知識 x86虛擬位址空間64tb,通過分段 分頁對映到物理記憶體。而linux 實際上只是有限的使用了分段機制 比如使用了段的特權級保護 並沒有利用分段機制實現虛擬化,所以linux下每個程序的虛擬空間,或者說程式設計空間只有4gb,而不是64tb。假設現在我們要利用...

X86保護模式下的記憶體定址

段選擇器 32位彙編中16位段暫存器 cs ds es ss fs gs 中不再存放段基址,而是段描述符在段描述符表中的索引值,d3 d15位是索引值,d0 d1位是優先順序 rpl 用於特權檢查,d2位是描述符表引用指示位ti,ti 0指示從全域性描述表gdt中讀取描述符,ti 1指示從區域性描述...

X86保護模式程式設計總結(1)

系統設計的步驟 1,初始化相關硬體.並裝入系統.2,取得並測試相應硬體的引數.並初始化如x387等硬體.3,載入gdt到gdtr 第乙個描述符必須為0,至少需要乙個 段和乙個資料段 4,載入idt到idtr 必須先關中斷,載入完後可開啟 5,設定cr0中pe 1 也可和pg位一起設,並用jmp大跳 ...