debugfs

linux kernel debugfs API,可以帮助linux驱动工程师快速调试某个外设驱动,在应用层通过cat/echo命令修改内核层数据,目录位于/sys/kernel/debug/

1. linux内核层

1.1 头文件

#include <linux/debugfs.h>

1.2 创建目录、文件

struct dentry *dir;

const struct file_operations fops = {
    .read    = debugfs_read,
    .write   = debugfs_write,
};

/* 
 * "dir":目录名字
 * NULL :在/sys/kernel/debug创建目录
 * 即 /sys/kernel/debug/dir/
 */
dir = debugfs_create_dir("dir", NULL);

/* 
 * "data":文件名字
 * 0644  :文件权限
 * dir   :父目录
 * &fops:文件对应的操作函数
 * 即 /sys/kernel/debug/dir/data
 */
debugfs_create_file("data", 0644, dir, NULL, &fops);

1.3 删除目录、文件

/*
 * 删除/sys/kernel/debug/dir目录,包括子目录
 */
debugfs_remove_recursive(dir);

1.4 编写read/write函数

unsigned char data = 'd';

ssize_t debugfs_read(struct file *file, char __user *buf, size_t size, loff_t *offset)
{
    unsigned char kbuf[3];

    kbuf[0] = data;
    kbuf[1] = '\n'; // 可选
    kbuf[2] = '\0'; // 可选

    return simple_read_from_buffer(buf, size, offset, kbuf, sizeof(kbuf));
}

ssize_t debugfs_write(struct file *file, const char __user *buf, size_t size, loff_t *offset)
{
    unsigned char *kbuf;

    kbuf = kmalloc(size, GFP_KERNEL);

    copy_from_user(kbuf, buf, size);
    kbuf[size-1] = '\0'; // 可选
    data = kbuf[0];

    kfree(kbuf);

    return size;
}

注意:在debugfs_read()函数,不能用copy_to_user()函数,必须用simple_read_from_buffer()函数,具体原因,请看《使用cat读取和echo写内核文件节点的一些问题》

2. linux应用层

$ cd /sys/kernel/debug
$ echo y > dir/data
$ cat dir/data
y

Last updated

Was this helpful?