一:概述
????????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");