albert21st
驱动牛犊
驱动牛犊
  • 注册日期2006-09-27
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望97点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:3736回复:1

关于Windows Xp 实现的一种新的同步机制 Push lock 的疑问

楼主#
更多 发布于:2009-08-05 00:00
        查看 Windows WRK1.2 源代码时,发现有个 Push Lock 这个新的东东,但却没发现 Windows 2000 里有,一篇文章也证实了这一点,这是 Windows Xp 的新特性,据说某些情况 Push Lock 效率高,并且它所占用资源少,包括 VMM 在内的模块,其中的部分同步机制也改用了这个 Push Lock。
        所以就想去研究一下,但发现 Push Lock 的类型 EX_PUSH_LOCK 被定义为:
                #define     EX_PUSH_LOCK        ULONG_PTR
        但奇怪的是:操作 Push Lock 的函数 ExAcquirePushLockShared 却可以对一个 EX_PUSH_LOCK 变量进行结构体形式的访问:
                EX_PUSH_LOCK OldValue, NewValue, TopValue;
                OldValue.Locked-------NewValue.Value-------NewValue.Ptr 等
        另外一个操作 Push Lock 的函数 ExInitializePushLock 竟然找不到定义,通过反汇编才得知它就是把一个 EX_PUSH_LOCK 初始化为 0。

        不知道这些是什么原因。查询了 Reactos 的代码,发现了 EX_PUSH_LOCK 的真正定义,确实如上面所述。
        但 WRK1.2 Build 以及 run 的时候为什么能正确呢?
lan2
驱动牛犊
驱动牛犊
  • 注册日期2002-04-20
  • 最后登录2011-07-01
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望29点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-02-23 17:34
1: kd> dt  ntkrpamp!_EX_PUSH_LOCK
   +0x000 Locked           : Pos 0, 1 Bit
   +0x000 Waiting          : Pos 1, 1 Bit
   +0x000 Waking           : Pos 2, 1 Bit
   +0x000 MultipleShared   : Pos 3, 1 Bit
   +0x000 Shared           : Pos 4, 28 Bits
   +0x000 Value            : Uint4B
   +0x000 Ptr              : Ptr32 Void
游客

返回顶部