系统启动时,lockdep报告了一次锁异常信息,然后系统自动关闭了lockdep,我可以在启动后通过创建/proc文件系统节点的方式来修改内核变量debug_locks来重新开启lockdep吗,修改的时候是否需要重置lockdep,调用什么内核代码
时间: 2023-11-29 18:04:21 浏览: 181
可以通过创建/proc文件系统节点的方式来修改内核变量debug_locks来重新开启lockdep。下面是具体的步骤:
1. 在内核源码的文件`fs/proc/generic.c`中添加以下代码,用于创建/proc文件系统节点:
```c
static int proc_debug_locks_show(struct seq_file *m, void *v)
{
seq_printf(m, "%d\n", debug_locks);
return 0;
}
static ssize_t proc_debug_locks_write(struct file *file, const char __user *buf,
size_t count, loff_t *pos)
{
int val;
if (kstrtoint_from_user(buf, count, 10, &val))
return -EINVAL;
debug_locks = val;
lockdep_reset();
return count;
}
static int proc_debug_locks_open(struct inode *inode, struct file *file)
{
return single_open(file, proc_debug_locks_show, NULL);
}
static const struct file_operations proc_debug_locks_fops = {
.open = proc_debug_locks_open,
.read = seq_read,
.write = proc_debug_locks_write,
.llseek = seq_lseek,
.release = single_release,
};
static int __init proc_debug_locks_init(void)
{
proc_create("debug_locks", 0644, NULL, &proc_debug_locks_fops);
return 0;
}
fs_initcall(proc_debug_locks_init);
```
这段代码定义了一个名为debug_locks的/proc文件系统节点,并提供了读和写操作。读操作用于获取debug_locks的当前值,写操作用于设置debug_locks的值,并调用lockdep_reset()函数重置lockdep。
2. 在内核配置中启用/proc文件系统支持:
```sh
make menuconfig
```
在Kernel hacking菜单下找到"Enable the /proc file system"配置项,勾选上并保存退出。
3. 重新编译内核并安装。
4. 启动系统后,在终端中输入以下命令即可修改debug_locks的值:
```sh
echo 1 > /proc/debug_locks # 开启lockdep
echo 0 > /proc/debug_locks # 关闭lockdep
```
需要注意的是,修改debug_locks的值时需要重置lockdep,以确保生效。可以调用lockdep_reset()函数或使用lockdep_reset_off()和lockdep_reset_on()函数对lockdep进行重置。例如,在上面的代码中,写操作函数中的lockdep_reset()函数就用于重置lockdep。
阅读全文