debugfs文件系统
可用下列的命令查看已经挂载的文件系统:
mount // 查看当前系统中已挂载的文件系统 cat /etc/fstab // 了解系统中所有定义的文件系统 lsblk // 显示系统中的块设备信息 df -h // 显示文件系统的磁盘空间使用情况,并包含已挂载的文件系统信息
命令在imx6ull上显示如下图所示:
debugfs的相关操作函数:
1. 创建和销毁文件
- debugfs_create_file(): 用于在 debugfs 中创建一个新的文件。
- debugfs_create_u32(), debugfs_create_u64(): 用于创建一个包含 32 位或 64 位整数的文件。
- debugfs_create_bool(): 用于创建一个布尔类型的文件。
2. 创建目录
- debugfs_create_dir(): 用于在 debugfs 中创建一个新的目录。
3. 读写文件内容
- simple_read_from_buffer(), simple_write_to_buffer(): 用于读取和写入文件的内容。
4. 注册和注销
- debugfs_create_regset32(), debugfs_create_regset64(): 用于创建一个寄存器集合,允许用户空间读写内核寄存器的值。
- debugfs_remove(): 用于从 debugfs 中删除文件或目录。
5. 其他
- debugfs_create_blob(): 用于创建一个二进制数据的文件。
- debugfs_create_symlink(): 用于创建一个符号链接。
debugfs文件系统挂载:
mount debugfs /sys/kernel/debug
debugfs目录:
常用有clk、gpio等
debugfs是为了调试内核而存在的一个文件系统,与sys、proc不同点如下:
1、procfs 主要用于提供有关当前运行进程和系统信息的访问。通过在 /proc 目录下查看和读取对应的文件,可以获取有关进程、内存、CPU 和其他系统信息的详细数据。
2、sysfs 提供了对设备、总线和驱动程序的信息的访问。它通常用于管理和配置系统中的硬件设备,包括 CPU、内存、总线、设备驱动等。
3、debugfs 提供了用于调试内核和驱动程序的接口,开发人员可以使用它来访问和修改内核中的调试信息和参数。
测试demo:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/debugfs.h> #include <linux/uaccess.h> #include <linux/slab.h> #define DEBUGFS_DIR "example_debugfs" #define DEBUGFS_FILE "example_file" static struct dentry *debugfs_dir; static struct debugfs_blob_wrapper blob_data; static ssize_t example_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { return simple_read_from_buffer(buffer, count, ppos, blob_data.data, blob_data.size); } static ssize_t example_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) { return simple_write_to_buffer(blob_data.data, blob_data.size, ppos, buffer, count); } static const struct file_operations example_fops = { .read = example_read, .write = example_write, }; static int __init debugfs_demo_init(void) { debugfs_dir = debugfs_create_dir(DEBUGFS_DIR, NULL); if (!debugfs_dir) { pr_err("Failed to create debugfs directory\n"); return -ENOMEM; } blob_data.data = kmalloc(256, GFP_KERNEL); if (!blob_data.data) { pr_err("Failed to allocate memory for blob data\n"); return -ENOMEM; } blob_data.size = 256; debugfs_create_blob(DEBUGFS_FILE, 0644, debugfs_dir, &blob_data); pr_info("Debugfs demo module loaded\n"); return 0; } static void __exit debugfs_demo_exit(void) { debugfs_remove_recursive(debugfs_dir); kfree(blob_data.data); pr_info("Debugfs demo module unloaded\n"); } module_init(debugfs_demo_init); module_exit(debugfs_demo_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name");
测试如下: