- 论坛徽章:
- 0
|
原帖由 folklore 于 2007-9-2 10:07 发表 ![]()
现在说明为什么错:
1.spin=1。锁有效
spin_lock_irq(&spin); //这句话,得到spinLock,并使得spin为0,并得到持有cpu,return 1,成功
相当于
asm/
mov eax,0
lock xchg eax,spin //交换e ...
我认为不太对,在我的想法中楼主这样写是应该死锁的。因为从流程上来说最后都应该调用到__raw_spin_lock(),从它的实现上来看的话第二次调用应该陷入自旋。我说一下流程,大家看看有什么地方不对:
- static inline void __raw_spin_lock(raw_spinlock_t *lock)
- {
- asm volatile("\n1:\t"
- LOCK_PREFIX " ; decb %0\n\t"
- "jns 3f\n"
- "2:\t"
- "rep;nop\n\t"
- "cmpb $0,%0\n\t"
- "jle 2b\n\t"
- "jmp 1b\n"
- "3:\n\t"
- : "+m" (lock->slock) : : "memory");
- }
复制代码
这里,传入的lock->slock被 SPIN_LOCK_UNLOCKED初始化为1, 第一次调用的时候:(用c来表示汇编流程)
- if ( --lock->slock >= 0 )
- goto get;
- while (1)
- {
- …… 自旋判断
- }
- get:
- return;
复制代码
第一次调用后lock->slock的值变为0,第二次调用的时候就应该减为-1陷入自旋成为死锁。其实lz这种写法就是典型的递归调用自旋锁的情况,按理也该死锁。星期一做实验看看。 |
|