linux 内核 debugfs 使用介绍
一:概述
debugfs
是 Linux 内核提供的一个特殊的虚拟文件系统,用于 暴露内核模块(如驱动)内部的调试信息或控制接口,供开发者、调试人员实时查看和排查问题。即 debugfs
就是一个“调试专用的 /proc 或 /sys”,方便你在不重启或不修改代码的情况下,查看内核模块的运行状态、统计信息,甚至直接向内核模块传递调试指令。
二:挂着位置和查看方式
1. 默认挂载在 /sys/kernel/debug
2. 如果没有挂着,可以手动挂载 sudo mount -t debugfs none /sys/kernel/debug
3. 常见的挂载节点有:
三: 示例
创建一个内核模块,挂载 debugfs
,暴露一个文件 /sys/kernel/debug/hello_debugfs,
可以用 cat
来读取内容,用 echo
向它写入数据。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/debugfs.h>
#include <linux/uaccess.h>#define BUF_SIZE 128static struct dentry *dir_entry;
static struct dentry *file_entry;static char message[BUF_SIZE] = "Hello, debugfs!\n";// 读操作
static ssize_t hello_read(struct file *filp, char __user *buffer,size_t len, loff_t *offset)
{return simple_read_from_buffer(buffer, len, offset, message, strlen(message));
}// 写操作
static ssize_t hello_write(struct file *filp, const char __user *buffer,size_t len, loff_t *offset)
{if (len >= BUF_SIZE)return -EINVAL;if (copy_from_user(message, buffer, len))return -EFAULT;message[len] = '\0';return len;
}static const struct file_operations hello_fops = {.owner = THIS_MODULE,.read = hello_read,.write = hello_write,
};static int __init hello_debugfs_init(void)
{dir_entry = debugfs_create_dir("hello_dir", NULL);if (!dir_entry) {pr_err("Failed to create debugfs directory\n");return -ENOMEM;}file_entry = debugfs_create_file("hello_debugfs", 0666, dir_entry, NULL, &hello_fops);if (!file_entry) {pr_err("Failed to create debugfs file\n");debugfs_remove(dir_entry);return -ENOMEM;}pr_info("hello_debugfs module loaded\n");return 0;
}static void __exit hello_debugfs_exit(void)
{debugfs_remove_recursive(dir_entry);pr_info("hello_debugfs module unloaded\n");
}module_init(hello_debugfs_init);
module_exit(hello_debugfs_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("OpenAI ChatGPT");
MODULE_DESCRIPTION("Example using debugfs");