首页
社区
课程
招聘
现在的易语言里都有CMPXCHG8B,如果处理呢?
发表于: 2005-10-13 13:46 8727

现在的易语言里都有CMPXCHG8B,如果处理呢?

2005-10-13 13:46
8727

现在的易语言里都有CMPXCHG8B,如果处理呢?

把它换成别的异常还是nop掉?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
"求真易语言工具箱"  这东西最典型.
2005-10-13 23:30
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
找猴子,他现在是这方面权威人士。
2005-10-13 23:52
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
根据自已的测试.有些程序里改成int 3可以通过,有些程序就不行.望高人出来指点一二.
2005-10-14 00:28
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
5
粘一段代码上来吧
2005-10-14 21:56
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
最初由 monkeycz 发布
粘一段代码上来吧


高人是来了,但不是时候哇.我见无人回话,我中午刚把那个软件删除了.软件是别人传给我的,我没不知道怎么找回来了.
2005-10-14 22:02
0
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
不过以我的一点点小经验,换成int 3应该都是可以的.嘻嘻
2005-10-14 22:03
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
8
最初由 ohuangkeo 发布


高人是来了,但不是时候哇.我见无人回话,我中午刚把那个软件删除了.软件是别人传给我的,我没不知道怎么找回来了.

心急吃不了热豆腐阿
2005-10-14 23:32
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
9
还是变成猴子了
2005-10-15 09:04
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
10
最初由 forgot 发布
还是变成猴子了

没办法,随他们去吧
2005-10-15 09:44
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
最初由 monkeycz 发布

没办法,随他们去吧

2005-10-15 10:36
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
12
一点资料。转自中国Linux论坛jkl:

"f00fc7c8"相当于"LOCK CMPXCHG8B EAX"指令,CMPXCHG8B的正常用法是带1个存储器操作数,例如"CMPXCHG8B [EBX]",将[EBX]中所指的64位内存操作数与EDX:EAX比较并相互交换。但跟据Intel指令的构成规律,可以构造出象"CMPXCHG8B EAX"这样的无意义的指令,CPU在执行这条指令时会产生异常6,这时CPU将从中断描述符表中启动第6号中断向量。但如果这条指令前面又加上LOCK前缀(指令码为F0),CPU会错误的认为取中断向量是一个需要改写存储器的过程,于是就等待写操作的完成,这样就进入了死锁状态。

Linux对这个问题的是这样处理的。用vmalloc在虚拟地址空间上分配一个物理页,找出它的页表项,用idt_table的物理地址替换该页表项,将该页标记为只读,然后以这个新的IDT表的地址加载CPU中断描述表寄存器,并释放vmalloc分配的那个物理页,这样就将idt_table的物理页面映射到内核虚拟地址空间中。当遇到"LOCK CMPXCHG8B EAX"指令时,CPU会认为指令将要改写第6号中断描述符,于是产生一个页故障,do_page_fault过程跟据故障点是不是在中断描述符表的6号位置来识别这种情况。
2005-10-15 13:57
0
游客
登录 | 注册 方可回帖
返回
//