【发布时间】:2014-11-15 08:00:01
【问题描述】:
尝试使用自旋锁方法在英特尔伽利略板上调度进程,文档显示 mutex_lock 是这样的函数;
/*------------------------------------------------------------------------
* mutex_lock(uint32 *lock) -- Acquire a lock
*------------------------------------------------------------------------
*/
mutex_lock:
/* Save registers that will be modified */
pushl %eax
pushl %ebx
pushl %ecx
movl $1, %ebx /* Place the "locked" value in ebx */
movl 16(%esp), %ecx /* Place the address of the lock in ecx */
spinloop:
movl $0, %eax /* Place the "unlocked" value in eax */
lock cmpxchg %ebx, (%ecx)
/* Atomic compare-and-exchange: */
/* Compare eax with memory (%ecx) */
/* if equal */
/* load %ebx in memory (%ecx), ZF=1*/
/* else */
/* load memory in %eax, ZF=0 */
/* If ZF = 0, the mutex was locked, so continue the spin loop */
jnz spinloop
/* We hold the lock now, so pop the saved registers and return */
popl %ecx
popl %ebx
popl %eax
ret
1 为什么变量 uint32*lock in 传入函数中,却从未在函数中使用?
2。代码部分是否以与我们传入的 *lock 相关的 lock 开头?如果是,那是什么意思?
3.感谢@wallyk,我明白为什么会有一个 16(esp),但是,我仍然不确定 lock 的指针是如何自动放到那个位置的,代码的哪一部分是这样做的?
非常感谢!
【问题讨论】:
-
这是二十年前的代码,那时处理器的工作方式非常不同。不要使用它。千万不要自己写,如果绝对需要,请使用 PAUSE 指令。
标签: assembly process operating-system spinlock