熟悉GDT的前辈进来看一下好么?
网上的GDT资料说的都比较简单,看完之后我不知道自己的理解是否正确,如果理解错误很可能我要花相当长的时间来意识到它是个错误,所以想请教一下我的理解是否正确。
我对GDT的理解:
GDT是一个表,有很多表项,每一个项就是一段内存,这段内存可以人为自由划分,GDT表项里描述了它的地址、长度以及一些安全属性。保护模式下的cs只是GDT表项的索引。
LDT也是一个表,它是将GDT每一表项所描述的内存再进行细分用的。每一个LDT描述了具有共同作用的一组段,它们本身存在于某个GDT表的内存中。
所以,GDT把内存线形地址分成了若干段,它只有一个。而每一个GDT项所表示的内存都可以分为N个LDT来表示,LDT表示的段可以交叉可以完全不同。
是不是动态连接库的加载就是通过LDT呢?所有的动态库都按LDT格式写好存成一个表,每当一个程序加载时,就写一个LDT出来,然后把DLL表信息写进那个LDT,然后不用复制内存,也不用再加载那么多DLL了。