Debugfs是Linux内核提供的一个虚拟文件系统,专门用于调试目的。它允许内核开发者在 /sys/kernel/debug/
目录下创建文件和目录,从而与内核模块进行交互,动态调整调试级别、查看状态信息或控制行为。
函数 | 描述 |
---|---|
debugfs_create_dir() |
创建一个debugfs目录 |
debugfs_create_file() |
创建一个debugfs文件,并指定操作函数 |
debugfs_create_u8() 等 |
创建特定数据类型的文件(如u8、u16等) |
debugfs_remove() |
删除debugfs条目 |
以下是一个简单的内核模块示例,它在debugfs中创建一个文件 /sys/kernel/debug/my_debug/level
,用于动态调整调试级别。
#include#include #include #include #include static struct dentry *dir; static u8 debug_level = 0; static ssize_t level_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { char buf[10]; int len = snprintf(buf, sizeof(buf), "%u\n", debug_level); return simple_read_from_buffer(user_buf, count, ppos, buf, len); } static ssize_t level_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { char buf[10]; unsigned long val; if (copy_from_user(buf, user_buf, min(count, sizeof(buf)))) return -EFAULT; if (kstrtoul(buf, 0, &val)) return -EINVAL; debug_level = val; printk(KERN_INFO "Debug level set to %u\n", debug_level); return count; } static const struct file_operations level_fops = { .read = level_read, .write = level_write, }; static int __init my_debug_init(void) { dir = debugfs_create_dir("my_debug", NULL); if (!dir) return -ENOMEM; debugfs_create_file("level", 0644, dir, NULL, &level_fops); return 0; } static void __exit my_debug_exit(void) { debugfs_remove_recursive(dir); } module_init(my_debug_init); module_exit(my_debug_exit); MODULE_LICENSE("GPL");
/sys/kernel/debug/my_debug/level
文件。echo 3 > /sys/kernel/debug/my_debug/level
cat /sys/kernel/debug/my_debug/level
/sys/kernel/debug
,如果没有,可以手动挂载:
mount -t debugfs none /sys/kernel/debug