wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
阅读:3216回复:9

WINXP-64 GDT初探之灌水篇

楼主#
更多 发布于:2005-03-25 11:42
WINXP-64 GDT初探之灌水篇
首先让我们来看看 WINXP-64下的GDT概貌吧。

       0       0       0       0       0       0       0       0
       0       0       0       0       0       0       0       0
       0       0       0       0       0      9b      20       0
      ff      ff       0       0       0      93      cf       0
      ff      ff       0       0       0      fb      cf       0
      ff      ff       0       0       0      f3      cf       0
       0       0       0       0       0      fb      20       0
       0       0       0       0       0       0       0       0
      68       0      70      10      4e      8b       0       0
       0      f8      ff      ff       0       0       0       0
      ff       f       0       0      fe      f3      40      ff
       0       0       0       0       0       0       0       0
      ff      ff       0       0       0      9a      cf       0
       0       0       0       0       0       0       0       0
GDTR
Limit:  6f   0
BASE:   0   0  4e   0   0  f8  ff  ff

IDTR
Limit:  ff   f
BASE:  70   0  4e   0   0  f8  ff  ff

基本概念我也就不说了,大家可以参考AMD64和INTEL EM64T的技术手册。
先简单说下2者的区别,其实说实在的基本没什么区别,但就目前INTEL 所出来的那
批所谓的INTEL EM64T的CPU,必须要说明的是都不支持NX执行保护,在对应 EM64T的技术手册
中原本应该是NX位的地方,都是RESERVED的,所以建议大家还是先用AMD64的CPU吧,不过估计最近出来的CPU
,INTEL好象开始加入NX保护技术了,至于那个对于SSE3的支持,大家就自己看着办吧,嘿嘿。。。。
言归正传。让我们来看下WINXP -64 1218版本中的GDT吧。
可以看到原来的NULL SELECTOR还是一样,不过好象扩展到16位的。
后面开始就是所谓的正式的东西了,先简单说下,INTEL在PII以后利用的FASTCALL技术,从RING3切换进RING0
利用指令SYSENTER,SYSEXIT来进行切换,而64位下则采用了SYSCALL,SYSRET来切换,提高了系统切换的性能,但
也有了一定的限制,就是不能象9X那样随意了,在GDT中RING0代码段,数据段,RING3代码段,数据段必须连续排列才行。

而SELECTOR 10H估计就是64位下的RING0代码段的SELECTOR了。
0       0       0       0       0      9b      20       0
由于在LONG MODE下代码段只考虑D,L,P,DPL,C位由此可见他属于64位模式的,存在的RING0,非一致代码段

而SELECTOR 18H估计就是64位下的RING0数据段的ELECTOR了。奇怪的是64位下的只考虑P位,其他一概忽略,确实令人费解。
需要说明的是在64位下DS,ES,SS,所引用的数据段根本就不考虑基地址和界限,完全是FLAT模式的,而FS,GS则有些特殊
系统专门培配置了FS。BASE,GS。BASE,的专门的MSR寄存器来存放其基地址,估计在64位WINDOWS下他们有特殊的用途。并专门
配备SWAPGS等指令快速切换RING0,3的GS地址等。。。。。。

后面是相应的RING3代码段和数据段
 ff      ff       0       0       0      fb      cf       0
 ff      ff       0       0       0      f3      cf       0
 0       0       0       0       0      fb      20       0
 23H,2BH,33H这里有3个段。
 也就是说RING3代码段有2个,这是为什么呢???
 其实也很简单,就是为了兼容性,大家都知道64位WNDOWS下核心是64位的,所有的驱动程序作为OS的一个部分所以也必须是64位的
 而应用层则不同,可以同时使用32位和64位,这也就是为什么要有2个RING3代码段的原因了。
 首先我们看23H的代码段
  ff      ff       0       0       0      fb      cf       0
  其CS。L=0,CS。D=0也就是当指令在这个段的时候系统处于COMPATIABLE MODE下,我们所有的32位程序执行的时候,系统会根据其
  是32位还是64位的PE来进行加载。而WOW64估计也是根据他来判断是否需要进行相应的参数转换(进行系统调用的时候)。
  而33H的代码段
  0       0       0       0       0      fb      20       0
  其CS。L=1,CS。D=0也就是当指令在这个段的时候系统处于64 BIT MODE下,也就是64位应用程序执行时候的SELECTOR。
  至于 CS。L=1,CS。D=1的这个模式AMD说是为未来处理器准备的,所以我们也就不得而知了。
  
  大家注意40H所对应的描述符是16个字节的,也就是我们所说的TSS
   68       0      70      10      4e      8b       0       0
   0      f8      ff      ff       0       0       0       0
   可见他是个基地址为0XFFFFF800004E1070界限为68H的TSS
   另外要说的是64位下的GDT是混合8,16字节的,数据代码段的描述符是8字节,而系统描述符是16个字节的,
   所以程序员在自己定位的时候需要小心。

   53H对应是RING3数据段,界限是0FFFH,基地址0FFFE0000,运行时FS指向他,估计就是运行在ring3下的程序,当前线程的 TEB 所在地址空间。
   (由此可见每个RING3程序都有4GB空间,另外的好处就是在驱动通过影射内存来实现共享内存的方式可以直接在应用的32位指针中使用,而不用进行其他转换。)
   ff       f       0       0      fe      f3      40      ff

   而后面哪个 ff      ff       0       0       0      9a      cf       0有什么用目前还不清楚请大家指点下。

   不知道大家注意了没有GDT的空间在64位下很小了,后面直接就是IDT,也就是说你根本没地方能插入我们最爱的CALL GATE,
   CALL GATE在64位下需要16个字节。估计MS也考虑到这个问题了,所以嘿嘿。。。。。
   不过还是有办法解决的,只要我们能进RING0,又有什么是不能做的呢????。。。。。。
   后面附上显示XP64下GDT的程序,由于应用和驱动都是64位的,所以建议你在WINXP-64下用,嘿嘿。。。。。。
附件名称/大小 下载次数 最后更新
2005-03-25_ShowGdt.rar (13KB)  92

最新喜欢:

JackB05JackB0...
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-25 12:37
哎,条件不具备,不过老大的东东,先收藏了在说
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
idaxsy
驱动大牛
驱动大牛
  • 注册日期2004-12-09
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分386分
  • 威望54点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-25 14:11
内容比较深 :)
[b]万水千山总是情,回个帖子行不行?[/b]
lipluto
驱动牛犊
驱动牛犊
  • 注册日期2002-12-08
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望47点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-27 15:56
学习中,。。。
jackychen
驱动牛犊
驱动牛犊
  • 注册日期2003-07-24
  • 最后登录2006-01-16
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-31 21:59
潮流的走向,学习。。。。。。。

好深奥。 难懂, 对我们的软件产业有什么冲击码?
我是我. 你是你. 大家合力, 换新天!!
liuyan1
驱动老牛
驱动老牛
  • 注册日期2001-08-27
  • 最后登录2023-04-18
  • 粉丝0
  • 关注0
  • 积分1031分
  • 威望477点
  • 贡献值0点
  • 好评度187点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-04-05 07:51
高科技,高昂,高手!
楼上的客,楼下的客,听我老坎说明白,要苛屎有草纸,不要扯我的麦席子,要苛尿有夜壶,不要在床上划地图。
linwn
驱动牛犊
驱动牛犊
  • 注册日期2002-11-10
  • 最后登录2015-01-27
  • 粉丝0
  • 关注0
  • 积分97分
  • 威望30点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-13 09:58
TSS not support in Long Mode


reference from AMD64 spec--

All of the legacy x86 task-management feature are supported by the AMD64 architecture in legacy mode , but most feature are not available in long mode.


in addition . I found that GDT for legacy mode and long mode is different. Maybe we could discuess the topic.

(Result from Windows XP x64 build 1289 and VSI )




linwn
seraph_l
驱动牛犊
驱动牛犊
  • 注册日期2005-04-13
  • 最后登录2005-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-04-13 14:50
学习一下.作个记号先
guoshumin168
驱动牛犊
驱动牛犊
  • 注册日期2005-04-13
  • 最后登录2005-04-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-04-14 00:10
这果然是个疯狂灌水的好地方~~~~~`

哈哈,我都灌NN桶了~~~~`

大家努力点哟,一定会有收获的~~~~~~~~
春天我把老婆埋在地底下,到了秋天我就有很多老婆了……
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-08-03 10:36
MS应该公开Windows XP64 bit的GDT LDT,很多debug tool都没法支持64bit版本,这给我们带来了很大的麻烦,要两台computer连在一起,速度很慢。
I will do the best with what the God gave me.
游客

返回顶部