studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
阅读:2899回复:5

面对双核和64位,我把这几天的经验总结一下......

楼主#
更多 发布于:2008-03-15 11:28
网上很多代码都还停留在32位单核的时代 , 放代码时也没说明测试环境和注意事项 ,
所以往往导致一部分人莫名其妙的重启死机.......
我建议以后大家放RING0代码时都应该注明一下运行环境!


最近工作不算忙,于是兴趣来了,  准备再玩玩N年前的调用门.......问题由此引发......
找到了沉睡N年的代码(就是wowocook的RING3下安装调用门进RING0),直接运行,让扬声器叫了几声,
成功是意料之中的......接着再调用 ExAllocatePoolWithTag 分配非分页内存,也异常顺利.....

后来因为不想折磨我的本本了,就把代码拿到隔壁办公室的机子上去调试,问题来了......
一运行就重启......用softice抓BUG,结果花屏+蓝屏....无语!!

冷静下来,想起这机子是64位双核! 再冷静,这 系统是XP SP2,而且记得64位CPU是支持硬件DEP的!!
对了! 我那个 ret   放在了gdt区域,而gdt区域是数据段属性,当然会惹怒DEP了...

马上在BOOT.INI中关闭DEP,重启后再运行,OK,正常! 看来真的是DEP在作怪...

慢!还没完,程序运行时会偶尔的出错! 原来双核CPU有2个GDT,里面的描述是一样的,而我只修改了其中一个,当我的线程执行调用门时要是恰好被切换到另一个CPU,而那个CPU的GDT中并没有安装调用门的话,当然就是保护违例了........


还有!!我只是进了R0,但什么都没做......后来加了点发声的代码,大概让扬声器叫1秒,结果又重启了!!!!
仔细一想,我使用的是 mov ecx,0c000000h     loop$ 硬延时,这么长的时间,线程会切换,CPU会切换...
延时那么久,要是从R0返回R3时正好切换到另一块CPU的话...... 此时的环境已经变了,当然会出问题了,
解决办法就是用CLI锁定当前CPU ,这么做了后,果然不再死机



但现在还有一个问题没有解决,就是调用ExAllocatePoolWithTag 仍然会重启!希望各位牛指教一下!

还有不知道在多核中是不是每个核的IDTR也不一样?
==================================================================

个人认为在多核中使用调用门来进R0已经不适用了,虽然上面说的问题有解决的办法,
比如绑定CPU分别设置调用门,但很麻烦了,
我个人认为安装R0门应该使用SSDT的方法,用fastcall门...

还有要注意DEP的影响!!现在64位CPU已经很普及了!大家一定要引起重视



studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-03-16 13:20
呵呵,首先感谢 znsoft老大的鼓励,也不枉费我那2天死了几十次机.....  

wowocock 说的方法我也想过,但还是有问题,如果你调用系统函数的话,CPU时间片一到,在系统内部切换CPU后就有很大的问题......... (我2个CPU都HOOK了,但调用ExAllocatePoolWithTag 还是会重启...) ,wowocock 你有空的话试试!!

反正我感觉在多核系统中,运行的时候不能轻易切换选择子,你可以试试,就算你不调用系统函数而是用mov ecx,0c000000h    loop$  ,不加CLI也会重启!!
   
studehard
驱动牛犊
驱动牛犊
  • 注册日期2008-02-28
  • 最后登录2008-03-31
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2008-03-30 20:42
spin lock 没有用,还不如CLI

其实还是有不少办法的,我发在看雪里了.......
游客

返回顶部