我正在研究raw_spinlock
中的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
和--ignore-installed
是什么意思?
答案 0 :(得分:2)
spinlock
spinlock
是内核代码中自旋锁的公共API。
请参阅Documentation/locking/spinlocks.txt
。
raw_spinlock
raw_spinlock
是普通自旋锁的实际实现。在非RT内核上,spinlock
只是raw_spinlock
的包装器。在RT内核上,spinlock
并不总是使用raw_spinlock
。
请参阅LWN上的this article。
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()
。
这允许同时归档两个目标:
另见this article。
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()
时的进程和CPU相同时调用它。
spin_lock()
检查magic
是否等于SPINLOCK_MAGIC
,以确保调用者传递指向正确初始化螺旋锁的指针,并且(希望)没有发生内存损坏。