读张银奎老师的《软件调试》一书,其中一节讲保护模式中分段机制,举了一个例子,用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个表项。
读书最大的乐趣就在于“为伊消得人憔悴”后的“那人却在灯火阑珊处。”