Re: Windows几乎不使用LDT表,对吗?

WinDbg

Windows几乎不使用LDT表,对吗?


merry 2009-03-25, 11:26 上午

在最近学习IA-32的分段和分页机制时,看到一句话:

   “ Windows XP几乎不使用LDT表!”

请问这句话对吗?  能否用windbg验证这句话吗? 

(使用dg命令好像看不到描述表s位的状况  )

谢谢!

Re: Windows几乎不使用LDT表,对吗?


格蠹老雷 2009-03-25, 23:09 下午
因为这句话中很好的使用了限定语,所以是对的。但这个问题解释起来话很长。简单来说,基于IA-32结构的32位Windows是可以不使用LDT的,因为使用页机制足够了,但是因为16位的Windows(3.x, 9x)使用LDT,为了兼容,NT中还是支持LDT的,或者说还是偶尔使用LDT的,这在很多地方都可以看到影子。比如:内核中有nt!NtSetLdtEntries函数。每个进程的_EPROCESS结构和_KPROCESS中有描述LDT的字段:
lkd> dt _KPROCESS -y ldt
nt!_KPROCESS
+0x020 LdtDescriptor : _KGDTENTRY
lkd> dt _EPROCESS -y ldt
nt!_EPROCESS
+0x150 LdtInformation : Ptr32 Void
这些设施曾经存在安全问题,一度成为人们关注的热点:
http://research.eeye.com/html/advisories/published/AD20040413D.html

Re: Windows几乎不使用LDT表,对吗?


merry 2009-03-26, 14:24 下午
Hi!Raymond
谢谢你的热心帮助!
我是在学校图书馆看到你在《程序员》杂志发表的《windbg必读》一文,开始了解windbg的,后来又购买了你的masterpiece《软件调试》一书继续学习。
祝你工作开心!因为工作不开心,怎能有好心情!:)
希望有一天你能在我《软件调试》一书上签名留念,呵呵!

在IA-32中,每个任务都有自已的局部描述符表LDT,它包含自已的代码段,数据段,堆栈段,也包含该任务使用的一些门描述符。随着任务的切换,LDT也跟着切换。(我觉得这里指的是任务软切换,因为windows不使用TSS段硬切换,对吗?)
从OS(WinXP)角度来看,现在LDT主要存放的是什么内容,有什么用处?
谢谢!

Re: Windows几乎不使用LDT表,对吗?


格蠹老雷 2009-03-26, 21:25 下午
Windows做普通的任务切换时,是不使用CPU的硬件任务切换机制(TR寄存器和TSS),但是在发生双重错误异常和NMI中断时,还是会使用。
LDT是一张表,用来存放段描述符。对于普通的Windows进程,它们都不使用LDT表,NT系列Windows之所以还保持对LDT的支持,主要是为了兼容。
对一个还在学校读书的学生来说,你的问题够深的了。

Powered by Community Server Powered by CnForums.Net