我正在研究raw_spinlock结构,它在/usr/src/linux/include/linux/spinlock_types.h中。
typedef struct raw_spinlock {
arch_spinlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} raw_spinlock_t;我认为raw_lock是指依赖于体系结构的锁,而dep_map是一种避免死锁的数据结构,但是break_lock、magic、owner_cpu和*owner是什么意思呢?
发布于 2015-09-21 10:34:32
spinlock
spinlock是内核代码中用于自旋锁的公共API。
见Documentation/locking/spinlocks.txt。
raw_spinlock
raw_spinlock是普通自旋锁的实际实现。在非RT内核上,spinlock只是raw_spinlock的包装器。在RT内核上,spinlock并不总是使用raw_spinlock。
参见LWN上的这篇文章。
arch_spinlock
arch_spinlock是自旋锁实现中特定于平台的部分.raw_spinlock通常是独立于平台的,并将低级操作委托给arch_spinlock。
lockdep_map
lockdep_map是一个用于锁定正确性验证器的依赖映射。
见Documentation/locking/lockdep-design.txt。
break_lock
在SMP内核上,当一个CPU上的spin_lock()在另一个CPU上保持锁时开始循环时,它将此标志设置为1。另一个持有锁的CPU可以使用spin_is_contended()定期检查此标志,然后调用spin_unlock()。
这样可以同时存档两个目标:
另见这篇文章。
magic,owner,owner_cpu
当设置CONFIG_SPINLOCK_DEBUG并帮助检测常见错误时,将启用这些字段:
magic被设置为任意选择的常量(SPINLOCK_MAGIC,即0xdead4ead)。owner设置为spin_lock()中的当前进程;owner_cpu设置为spin_lock()中的当前CPU id。spin_unlock()检查当前进程和CPU是否与调用spin_lock()时相同时调用。
spin_lock()检查magic是否等于SPINLOCK_MAGIC,以确保调用方传递指向正确初始化的自旋锁的指针,并且(希望)没有发生内存损坏。
https://stackoverflow.com/questions/32256085
复制相似问题