讀張銀奎老師的《軟體調試》一書,其中一節講保護模式中分段機制,舉了一個例子,用WinDBG觀察GDTR和LDTR值,并由此得出一些結論,執行個體如下:
kd> r gdtr
gdtr=8003f00
kd> r idtr
idtr=8003f400
kd>r gdtl
gdtl=000003ff
kd>r idtl
idtl=000007ff
結論是:GDT的邊界是1023,總長度是1024位元組,共有128個表項
IDT的表長度是2048位元組,共有256項
我們來看看是怎麼計算得來,首先是GDT邊界為gdtl=00003ff(H)=1023(D),總長度即0-1023,則為1024位元組,也即為1K,這個沒問題,我算的來。
一共有128個表項。為什麼會有128項呢?怎麼計算的呢?怎麼想來想不明白。我就用1024÷128=8.我知道2的3次是8,關鍵這8從哪來的呢?代表什麼意思,好難呀,想不明白。
百思不得其姐,錯,是解,沒折了就在那亂翻書,突然翻到段描述通用格式那節才想起來,其結構是64位,也即8個位元組,這個8 是8 個位元組,這樣這個128表項就自然來了。
IDT的7ff(H)即是2047,從0開始共講2048位元組,也即2K,除以8,剛好256個表項。
讀書最大的樂趣就在于“為伊消得人憔悴”後的“那人卻在燈火闌珊處。”