Linux驱动

2023年 8月 7日 35.1k 0

Linux驱动 | debugfs接口创建

上篇介绍了procfs接口的创建,今天再介绍一种debugfs接口的创建。

实现效果

/sys/kernel/debug/目录下创建一个ion/test文件,通过catecho的方式进行读写操作:

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

前期准备

内核配置打开debugfs:

CONFIG_DEBUG_FS=y

登录后复制

挂载debugfs文件系统:

mount -t debugfs none /sys/kernel/debug

登录后复制

代码实现

读写变量:

#include
#include
#include

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 nulln");
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
#include
#include
#include
#include
#include
#include

static char ion_buf[512] = "hellon";
static struct dentry *ion_dir;

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

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

if (copy_to_user(buf, ion_buf+*offp, count)) {
printk("copy to user failed, count:%ldn", 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 > 512)
return 0;

if (*offp + count > 512)
count = 512 - *offp;

if (copy_from_user(ion_buf+*offp, buff, count)) {
printk("copy from user failed, count:%ldn", 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 MODULEn");

//创建一个/sys/kernel/debug/ion目录
ion_dir = debugfs_create_dir("ion", NULL);
if (!ion_dir) {
printk("ion_dir is nulln");
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 nulln");
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_u32(const char *name, umode_t mode,
struct dentry *parent, u32 *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_x32(const char *name, umode_t mode,
struct dentry *parent, u32 *value);
void debugfs_create_x64(const char *name, umode_t mode,
struct dentry *parent, u64 *value);

登录后复制

更详细的debugfs用法请参考官方文档:Documentation/filesystems/debugfs.txt

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论