首页
社区
课程
招聘
[求助]关于Win32汇编的lock前缀
发表于: 2011-2-12 15:56 6499

[求助]关于Win32汇编的lock前缀

2011-2-12 15:56
6499
在多核CPU的机子上,如果两个并发的线程遇到
lock cmpxchg BYTE PTR[ebx] , ah
之类的指令,Intel手册说 lock 前缀会锁住总线,使得同一时刻有且仅有一个线程访问内存
但问题是另外一个线程等待访问的时候,在这瞬间,又有第三个线程把这条指令给改了,例如改成 ret
那么等第一个线程使用完那块内存后,第二个线程会如何执行?会照样执行
lock cmpxchg BYTE PTR[ebx] , ah
还是说执行
ret ?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 31
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
应该会同时执行吧
2011-2-12 16:08
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
同时执行?
第二个线程原来是等待访问内存的,如今那句代码改了不是应该只有两种选择吗
要不就执行原来的,要不就执行改后的..?
2011-2-12 16:11
0
雪    币: 86
活跃值: (56)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
Processor = Instruction Fetch/Decode/Execute Engine

先弄清楚Processor 执行指令的过程,你自己就能回答这个问题了。具体看看Instruction Fetch怎么工作就行了。
2011-2-12 16:47
0
雪    币: 62
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
提出这个问题的时候我也在考虑这了,我也知道CPU是先读取一条指令,进行解码后执行
那么lock前缀应该就是把它先卡在解码后与执行前之间,这时候更改了当前指令应该是不影响的,会按原来的执行。
不过当时就是没信心,不知道自己这样想有没有错。
2011-2-12 17:03
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
第三个线程无法修改指令,因为lock锁住总线了
2011-2-13 15:38
0
雪    币: 21
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我测试过,不管多少核,用LOCK之后无论多少线程,总是单一线程能执行该指令,其它线程排队..而不会多个CPU同时执行
2011-2-17 22:36
0
雪    币: 83
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好像会自动lock系统总线的,无需lock前序
2011-2-20 21:08
0
游客
登录 | 注册 方可回帖
返回
//