debugfs檔案系統

lethe1203發表於2024-03-25
可用下列的命令檢視已經掛載的檔案系統:
mount                // 檢視當前系統中已掛載的檔案系統
cat /etc/fstab       // 瞭解系統中所有定義的檔案系統
lsblk                // 顯示系統中的塊裝置資訊
df -h                // 顯示檔案系統的磁碟空間使用情況,幷包含已掛載的檔案系統資訊

命令在imx6ull上顯示如下圖所示:
0
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目錄:
0
常用有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");
測試如下:
0

相關文章