系统启动时,lockdep报告了一次锁异常信息,然后系统自动关闭了lockdep,我可以在启动后通过创建/proc文件系统节点的方式来修改内核变量debug_locks来重新开启lockdep吗,修改的时候是否需要重置lockdep,调用什么内核代码
时间: 2023-11-29 08:04:37 浏览: 268
是可以通过创建/proc文件系统节点的方式来修改内核变量debug_locks来重新开启lockdep。需要注意的是,修改debug_locks的值之前,需要先将lockdep重置,否则修改debug_locks的值是无效的。
可以通过调用lockdep_reset()函数来重置lockdep,该函数定义在文件kernel/locking/lockdep.c中。具体修改debug_locks的值的代码可以参考如下示例:
```c
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
static int debug_locks = 0;
static int proc_lockdep_show(struct seq_file *m, void *v)
{
seq_printf(m, "%d\n", debug_locks);
return 0;
}
static int proc_lockdep_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_lockdep_show, NULL);
}
static ssize_t proc_lockdep_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
{
int val;
if (sscanf(buffer, "%d", &val) != 1)
return -EINVAL;
lockdep_reset();
debug_locks = val;
return count;
}
static const struct file_operations proc_lockdep_fops = {
.owner = THIS_MODULE,
.open = proc_lockdep_open,
.read = seq_read,
.write = proc_lockdep_write,
.llseek = seq_lseek,
.release = single_release,
};
static int __init lockdep_init(void)
{
proc_create("lockdep_debug", 0, NULL, &proc_lockdep_fops);
return 0;
}
static void __exit lockdep_exit(void)
{
remove_proc_entry("lockdep_debug", NULL);
}
module_init(lockdep_init);
module_exit(lockdep_exit);
```
以上代码创建了一个名为"lockdep_debug"的/proc文件系统节点,读取该节点的值可以获取debug_locks的当前值,写入该节点的值可以修改debug_locks的值,并且会在修改前重置lockdep。
阅读全文