[英]How to get a global state of the locks in Linux kernel?
我正在为 Linux 内核编写一些代码,我注意到当我需要启用它们时中断被禁用,以便进程可以处理信号。 如果我能获得系统中当前持有的所有锁的列表,那就太棒了,因为我怀疑某处的锁禁用了中断......这是假设它是一个禁用中断的锁。 如果没有,也很高兴知道是如何做到的(或在哪里)。 Linux内核是否对此有任何记录?
是的,内核绝对有能力跟踪当前持有的锁,但这样做代价高昂,而且只能用于调试目的。 您应该在启用调试的情况下配置和编译内核(特别是CONFIG_LOCKDEP
,这也取决于其他配置选项)。
一旦做到这一点,在struct task_struct
有各个领域,如lockdep_depth
(目前持有的锁的数量)和held_locks
(数组struct held_lock
可能对您有用表示当前持有的锁)。 当您的模块运行时,您可以检查current
任务的这些字段以了解发生了什么。
查看kernel/locking/lockdep.c
中的两个私有函数lockdep_print_held_locks()
和print_lock()
以了解如何从这些struct held_lock
提取有用的信息。 您还可以使用kgdb 内核调试器来专门查看内核代码运行时发生的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.