2010-03-19 82 views

回答

1

你可以找到的定义XNU源中的OSAtomic.s文件中的原子函数。例如,这里是在1486年2月11日版本OSAtomicCompareAndSwapPtr for x86_64

_OSCompareAndSwap64: 
_OSCompareAndSwapPtr: #;oldValue, newValue, ptr 
    movq   %rdi, %rax 
    lock 
    cmpxchgq %rsi, 0(%rdx) #; CAS (eax is an implicit operand) 
    sete  %al    #; did CAS succeed? (TZ=1) 
    movzbq  %al, %rax  #; clear out the high bytes 
    ret 
+0

+1谢谢。那么OSCompareAndSwap最终是不是像CMPXCHG8B这样的ABA问题? – Viet 2010-03-19 11:55:47

+0

我并不十分熟悉CMPXCHG8B,但看起来它与cmpxchg具有相同的语义,并且仅在它看起来有所不同。在32位中,寄存器只有32位宽,因此CMPXCHG8B查看寄存器对以允许执行64位CAS。您可以看到它用于i386位OSAtomic.s文件中的64位CAS操作。 – Ken 2010-03-19 21:51:27

+0

这意味着没有。谢谢。 – Viet 2010-03-20 12:36:54

0

锁 CMPXCHG8B

更准确地

它是针对英特尔处理器,但是考虑到,那OSX不仅针对英特尔架构存在,因此ASM会有所不同

+0

谢谢,我知道“锁定CMPXCHG8B”,并认识到OS X上运行PPC上了。但对于在英特尔32位OSX上的情况,它会是相同的吗? – Viet 2010-03-19 11:32:33

+0

从函数参数移动到适当的寄存器之前会附加。 – drlazy 2010-03-19 13:02:18