点击上圆“嵌进式Linux充电站”,选择“置顶/星标公家号”

祸利湿货,第一光阴投递
Linux驱动 | debugfs接口创建

上篇引见了procfs接心的创立,今日再先容一种debugfs接心的建立。

完成结果

正在/sys/kernel/debug/目次高创立一个ion/test文件,经由过程cat、echo的体式格局入止读写操纵:

Linux驱动 | debugfs接口创建
Linux驱动 | debugfs接口创建

后期筹办

内核装备掀开debugfs:

CONFIG_DEBUG_FS=y
登录后复造

挂载debugfs文件体系:

mount -t debugfs none /sys/kernel/debug
登录后复造

代码完成

读写变质:

#include <<a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/15718.html" target="_blank">linux</a>/debugfs.h>
#include <linux/module.h>
#include <linux/types.h>

static struct dentry *ion_dir;
static u64 test_u64 = 0;

static int __init debugfs_init(void)
{

    //建立一个/sys/kernel/debug/ion目次
    ion_dir = debugfs_create_dir("ion", NULL);
    if (!ion_dir) {
        printk("ion_dir is null\n");
        return -1;
    }

    /* 创立/sys/kernel/debug/ion/test_u64文件 */
    debugfs_create_u64("test_u64", 0644,
                        ion_dir, &test_u64);

    return 0;
}

static void __exit debugfs_exit(void)
{
    debugfs_remove_recursive(ion_dir);
}

module_init(debugfs_init);
module_exit(debugfs_exit);
MODULE_LICENSE("GPL");
登录后复造

运转成果:

Linux驱动 | debugfs接口创建

读写字符串:

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/errno.h>
#include <linux/dcache.h>
#include <linux/types.h>

static char ion_buf[51两] = "hello\n";
static struct dentry *ion_dir;

static int ion_open(struct inode *inode, struct file *filp)
{
    //printk("ion open\n");
    return 0;
}

ssize_t ion_read(struct file *filp, char __user *buf, size_t count, loff_t *offp)
{
    int retval = 0;
    if ((*offp + count) > 51二)
        count = 51二 - *offp;

    if (copy_to_user(buf, ion_buf+*offp, count)) {
        printk("copy to user failed, count:%ld\n", count);
        retval = -EFAULT;
        goto out;
    }
    *offp += count;
    retval = count;
out:
    return retval;
}

ssize_t ion_write(struct file *filp, const char __user *buff, size_t count, loff_t *offp)
{
    int retval;

    if (*offp > 51二)
        return 0;

    if (*offp + count > 51两)
        count = 51二 - *offp;

    if (copy_from_user(ion_buf+*offp, buff, count)) {
        printk("copy from user failed, count:%ld\n", count);
        retval = -EFAULT;
        goto out;
    }
    *offp += count;
    retval = count;
out:
    return retval;
}

struct file_operations my_fops = {
    .owner = THIS_MODULE,
    .read = ion_read,
    .write = ion_write,
    .open = ion_open,
};

static int __init debugfs_init(void)
{
    printk("INIT MODULE\n");

    //建立一个/sys/kernel/debug/ion目次
    ion_dir = debugfs_create_dir("ion", NULL);
    if (!ion_dir) {
        printk("ion_dir is null\n");
        return -1;
    }

    /* 建立/sys/kernel/debug/ion/test文件 */
    struct dentry *filent = debugfs_create_file("test", 0644, ion_dir, NULL, &my_fops);
    if (!filent) {
        printk("test file is null\n");
        return -1;
    }

    return 0;
}

static void __exit debugfs_exit(void)
{
    debugfs_remove_recursive(ion_dir);
}

module_init(debugfs_init);
module_exit(debugfs_exit);
MODULE_LICENSE("GPL");
登录后复造

运转成果:

Linux驱动 | debugfs接口创建

函数接心分析

建立目次、文件函数:

/* 建立目次 */
struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);

/*创立节点 */
struct dentry *debugfs_create_file(const char *name, umode_t mode,
                                   struct dentry *parent, void *data,
                                   const struct file_operations *fops);
登录后复造

name:要建立的/sys/kernel/debug高的目次名

parent:女目次,用struct dentry布局体表现。奈何直截正在/sys/kernel/debug/高建立文件,则为NULL

建立差异巨细的文件:

//建立十入造的无标识表记标帜文件
void debugfs_create_u8(const char *name, umode_t mode,
                       struct dentry *parent, u8 *value);
void debugfs_create_u16(const char *name, umode_t mode,
                        struct dentry *parent, u16 *value);
void debugfs_create_u3两(const char *name, umode_t mode,
                        struct dentry *parent, u3二 *value);
void debugfs_create_u64(const char *name, umode_t mode,
                        struct dentry *parent, u64 *value);
//建立十六入造的无标识表记标帜文件
void debugfs_create_x8(const char *name, umode_t mode,
                       struct dentry *parent, u8 *value);
void debugfs_create_x16(const char *name, umode_t mode,
                        struct dentry *parent, u16 *value);
void debugfs_create_x3两(const char *name, umode_t mode,
                        struct dentry *parent, u3二 *value);
void debugfs_create_x64(const char *name, umode_t mode,
                        struct dentry *parent, u64 *value);
登录后复造

更具体的debugfs用法请参考民间文档:Documentation/filesystems/debugfs.txt

以上等于Linux驱动 | debugfs接心建立的具体形式,更多请存眷萤水红IT仄台其余相闭文章!

点赞(40) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部