Car*_*bao 1 c linux locking linux-kernel spinlock
我正在为 Linux 内核编写一些代码,我注意到当我需要启用它们时中断被禁用,以便进程可以处理信号。如果我能获得系统中当前持有的所有锁的列表,那就太棒了,因为我怀疑某处的锁禁用了中断......这是假设它是一个禁用中断的锁。如果没有,也很高兴知道是如何做到的(或在哪里)。Linux内核是否对此有任何记录?
是的,内核绝对有能力跟踪当前持有的锁,但这样做代价高昂,而且只能用于调试目的。您应该在启用调试的情况下配置和编译内核(特别是CONFIG_LOCKDEP,这也取决于其他配置选项)。
一旦做到这一点,在struct task_struct有各个领域,如lockdep_depth(数量目前持有的锁)和held_locks(数组struct held_lock表示当前持有的锁),可能对您有用。您可以current在模块运行时检查任务的这些字段以了解发生了什么。
看一看这两个私有函数lockdep_print_held_locks()并print_lock()从中kernel/locking/lockdep.c了解如何从中提取有用的信息struct held_lock。您还可以使用kgdb 内核调试器来专门查看内核代码运行时发生的情况。