我正在为Linux内核编写一些代码,当我需要启用中断以便进程能够处理一个信号时,我注意到中断被禁用了。如果我能获得系统中当前持有的所有锁的列表,那就太棒了,因为我怀疑某个地方的锁已经禁用了中断。这就是,假设是锁禁用了中断。如果没有,也很高兴知道是如何做到的(或者在哪里)。Linux内核保存了这方面的任何记录吗?
发布于 2020-02-19 11:40:50
是的,内核绝对有能力跟踪当前持有的锁,但这很昂贵,而且只用于调试目的。您应该在启用调试的情况下配置和编译内核(特别是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内核调试器来具体查看内核代码运行时所发生的事情。
https://stackoverflow.com/questions/60297618
复制相似问题