Debugfs控制器:动态调试的艺术

什么是Debugfs?

Debugfs是Linux内核提供的一个虚拟文件系统,专门用于调试目的。它允许内核开发者在 /sys/kernel/debug/ 目录下创建文件和目录,从而与内核模块进行交互,动态调整调试级别、查看状态信息或控制行为。

/sys/kernel/debug/ 动态调试接口

为什么使用Debugfs?

核心API函数

函数 描述
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");
        

软件架构图

用户空间 内核空间 Debugfs API 自定义驱动

使用步骤

  1. 加载模块后,debugfs会自动创建 /sys/kernel/debug/my_debug/level 文件。
  2. 通过echo命令写入数值来调整调试级别:
    echo 3 > /sys/kernel/debug/my_debug/level
  3. 通过cat命令读取当前级别:
    cat /sys/kernel/debug/my_debug/level

注意事项