首页 > 编程知识 正文

Arm cast,arm in a cast

时间:2023-05-03 16:18:25 阅读:186788 作者:3334

cmpxchg是X86比较交换命令,该命令与各大规模的基础系统实现的原子操作在各种同步原语中被广泛使用。 例如,linux内核、JVM、GCC编译器等。 cmpxchg是比较交换命令,在理解cmpxchg之前先理解原子操作。

英特尔P6和最新的处理器家族确保以下行为是原子: 1.1字节读写。 2 .读写16位对齐的字。 3 .读写32位对齐的双字。 4 .读写64位对齐的四字。 5 .读写16位、32位、64位cache line内的不一致的字。 所以普通的load store命令都是原子。 cacheconsistencyprotocol保证两个cpu不能同时写入一个内存。 关于cmpxchg这样的比较交换命令肯定不是阿童木。 intel是CISC复杂的指令集架构,在内部流水线上执行时,一定会将cmpxchg指令翻译成若干微码来执行(比ARM更简化指令集)。 因此,英特尔为某些指令提供了LOCK前缀,以确保此指令的原子性。 Intel 64和IA-32处理器提供LOCK#信号,在某些关键内存操作期间自动设置该信号以锁定系统总线或等效链路。 如果此输出信号被断言,则来自控制总线的其他处理器或总线代理的请求将被阻止。 对于英特尔386、英特尔486和奔腾处理器,明确锁定的指令会导致设置LOCK#信号。 硬件设计师负责在系统硬件中使用LOCK#信号来控制处理器之间的内存访问。 对于P6或更高版本的处理器系列,如果被访问的存储在处理器内部缓存,通常不支持LOCK#信号。 相反,锁定仅应用于处理器缓存。 对于Intel486和Pentium处理器,即使处理器上缓存了锁定的内存空间,LOCK#信号在锁定操作期间也始终会设置在总线上。 这将导致性能严重下降,并导致其他cpu无法访问内存。 对于P6 (或更高版本)处理器系列,如果在LOCK操作期间锁定的内存空间作为回写操作被执行,并且缓存在完全位于缓存行中的处理器上,则处理器可能不会断言总线上的LOCK#信号而是在内部更改内存位置,并允许缓存一致性机制,以便操作按原子方式执行。 此操作称为高速缓存锁定。 缓存一致性机制会自动阻止缓存同一内存区域的两个或多个处理器同时更改该区域中的数据。

为了更清楚地理解cmxchg,需要同时看到一个RISC、一个CISC和一个linux内核在ARM和x86两种架构中提供了两种架构的实现。 linux内核的原子变量定义如下:

//原子变量typedef struct { volatile intcounter; //volatile禁止编译器在寄存器中缓冲变量) } atomic_t; 首先,在ARM架构下,ARM架构简化指令集,不提供复杂的命令,如cmpxchg,并提供链路负载、条件存储(LL/SC )操作,类似所有其他RISC架构这个操作是很多原子操作的基础。 ARMv8命令为LDXRSTXR,ARMv7命令为LDREXSTREX,大同小异,是独占访问,需要同时使用local monitor和global monitor。 这两个命令通常必须成对出现。 ldrex从内存中检索数据并放入寄存器中,监视器将该地址标记为独占。 strex首先测试当前cpu是否是互斥的,如果是,则存储器成功返回0,否则存储器失败并返回1。 例如,cpu0将地址m标记为独占,在执行strex之前调用线程,cpu1调用ldrex时清除cpu0的排他,将自身标记为排他并运行strxr,cpu0的线程被重新调度。 此时,strex的执行失败。 因为自己的排他比特会被清除。 这也可能导致以后进入ldrex的线程先于先进入的线程执行。 标记为独占的地址在调用strex时会清除独占标志。

% 2f % 2a % 2a % 20 % 2a % 20 % E6 % af % 94 % E8 % be % 83 ptr-counter % E5 % 92 %8cold % E7 % 9a % 84 % E5 % 80 % BC % E5 9 ptr-coun nt % 20 TIC % 20 inline % 20 int % 20 atomic _ cmpxchg % 20 atomic _ t % 20 %2aptr % 2c % 20 int % 20 old % 2c % 20 int c % E4 % BF % 9d % E8 % af % 81 cmpxchg % E4 % b8 % 8d % 20 _ ASM _ % 20 _ volatile _ % 28 % 27 % 40 % 20 atomic _ cmpxchg 9a % E5 % B0 % 86 % E6 % ad % a4 % E5 % B0 % E5 % 9d % 80 % E6 % A0 % 87 % E5 % 20 alue % 27 mov % 250 % 2c % 230 % 5cn % 27 % 27 % 27 % 9f % E5 % B0 % B1 % E6 % 98 % af ptr-counter % E5 % 92 %8cold % 2f % E7 % 8b % AC % E5 % 206 % 9e % 9c % E7 % 9b % b8 % E7 87 % E4 % bb % a4 % 27 strexeq % 20 % 250 % 2c % 254 % 2c % 20 % 5b % 252 % 5d % 5cn % 27 % 2033 360 % 27 % 25 % 200 % 28 ptr-cn % 205 % 9b % A0 % E4 % b8 % bastrexeq % E6 % 8c % 87 % E4 % bb % a4 % E6 % 98 % af % E7 % 8b % AC % E5 % 8d % A0 % E8 % AE % bb 80 % 25 cres % E4 % 25 % 204 % BF % 9d % E8 % af % 81 cmpxchg % E4 % b8 % E4 % BC % 9a % E5 % A8 % B1 % e9 % 9a % E5 % 90 % 90 % 8e % % B9 % E6 % 8d % 20a % 82 % ef % BC % 8c % E5 % ad % 97 % E6 % 88 % E8 % 85 % E5 % 8f % E5 % ad % 97 % ef % BC % 8c % a6 % 82 f static % 20 nsigned % 20 long % 20 old % 2c % 20 unsigned % 20 long % 20 new % 2c % 20 int % 20 size % 29 % 7b unsigned % 20 long % 20 pned % 2c % 252 % 27 % 2033 360 % 27 % 3da % 27 % 28 prev % 29 % 2033 360 % 2027 % 28 old % 29 % 2033 360 % 20 % 27 memory % 27 % 29 % 3b prev % 29 % 2033 360 % 27r % 27 % 28 new % 29 % 29 % 2c % 20 % 27m % 27 % 28a _ _ XG % 28 ptr % 29 % 29c % 20 feax % 20 % 3d % 20 old % 20 % 20 % E7 % ad % 89 % E5 % 88 % 99zf % E7 % BD % ae4 % BD % 8d % ef % BC % 8c % E5 % B9 % E6 % 8a % 251 % 2510 d % 220 % 205 % BD 0 % 20 _ _ volatile _ % 28 lock _ prefix % 20 % 27 cmpxchgl % 20 % 251 % 2c % 252 % 27 % 2033 360 % 20 % 27 % 3da % 27 % 28 PPP 0 old % 2033 360 % 27 memod % 20g % E6 % 8c % 87 % E4 % bb % a4 % E5 % 89 % 8d % E5 % 8a % A0 % E4 % ba % 86 lock % E5 % 89 % 8d % 5 % 85 % B6 % E5 % ae83 % 25 CPU % E6 % 25 % 20 % BF % E5 % be % 97 % E6 % B4 % E4 % b8 % aa % E6 % 93 % E4 % BD % E4 % BF % 9d % E6 % 8c % 87 % E4 % bb % a4 % ef % BC % 20f % E5 % AE % 9a % E5 % B0 % 86 % E8 % BF % 99 % E6 % 9d % a1 % E6 % 8c % E4 % bb

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。