- 论坛徽章:
- 46
|
5可用积分
不好意思,身上实在是没分了,以后再补吧
体系结构arm,内核版本3.10.17,以下这段代码是arm中自旋锁的实现,网上资料太少了,实在没看懂这里是如何实现自旋锁的功能的
请懂的朋友帮帮忙,分确实少了,以后赚了分再给您,多谢
最好可以帮忙解释一下这段代码
static inline void arch_spin_lock(arch_spinlock_t *lock)
{
unsigned long tmp;
u32 newval;
arch_spinlock_t lockval;
__asm__ __volatile__(
"1: ldrex %0, [%3]\n"
" add %1, %0, %4\n"
" strex %2, %1, [%3]\n"
" teq %2, #0\n"
" bne 1b"
: "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
: "cc");
while (lockval.tickets.next != lockval.tickets.owner) {/*目测这里是在自旋忙等,可是这里使用的判断条件和上面没有关系啊*/
wfe();
lockval.tickets.owner = ACCESS_ONCE(lock->tickets.owner);
}
smp_mb();
} |
最佳答案
查看完整内容
typedef struct { union { u32 slock; struct __raw_tickets {#ifdef __ARMEB__ u16 next; u16 owner;#else u16 owner; u16 next;#endif } tickets; };} arch_spinlock_t;static inline void arch_spin_lock(arch_spinlock_t *lock){ unsigned long tmp; u32 newval; arch_spinlock_t lockval; __asm__ __volatile__("1: ldrex %0, [%3]\n" " add %1, %0, %4\n" ...
|