【linux kernel】linux内核中的debugfs

本文详细介绍了Linux内核中的debugfs,它是一个小型文件系统,用于内核向用户空间提供信息,便于系统开发和调试。文章涵盖了debugfs的相关文件、创建目录和文件的API,包括创建不同类型的文件如整数、十六进制、布尔值、二进制数据块等,并给出了实验代码,展示了如何在debugfs中创建和操作文件。
摘要由CSDN通过智能技术生成

一、👉相关文件

  • /fs/debugfs/file.c:debugfs的file描述文件。

  • /fs/debugfs/inode.c:debugfs的inode描述文件。

  • /fs/debugfs/internal.h:用于debugfs的内部声明。

二、👉简介

debugfs可用于内核向用户空间提供信息,debugfs是个小型的文件系统,与/procsysfs不同,debugfs根本没有较为严苛的规则和定义,开发人员可以在里面放置想要的任何信息,以便于系统开发和调试。

通常使用如下命令安装debugfs

mount -t debugfs none /sys/kernel/debug

或者:

mount -t debugfs debugfs /sys/kernel/debug/

也可以在/etc/fstab文件中使用等效的语句:

默认情况下,在一些发行版的linux系统中,只有root用户可以访问debugfs根目录。

注意,在内核源码中,debugfs API仅以GPL方式导出到模块。

三、👉debugfs的API

  • 1、在debugfs中创建目录

使用debugfs的代码应包含<linux/debugfs.h>头文件。然后首要任务是创建至少一个目录来保存一组debugfs文件,可使用下列API实现:

struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);

当函数执行成功后,将在指定的父目录下创建一个名为name的目录,如果parent为NULL,则该目录将在debugfs根目录中创建。成功后,返回一个指向struct dentry的指针,可用于在目录中创建文件。如果返回值为ERR_PTR(-ERROR)则表明出现了问题,如果返回ERR_PTR(-ENODEV),则表明内核是在没有debugfs支持的情况下构建,这时候相关的API将失效。

  • 2、在debugfs目录中创建文件

在debugfs目录中创建文件的常用的API是:

struct dentry *debugfs_create_file(const char *name, umode_t mode,struct dentry *parent, 
                                   void *data,const struct file_operations *fops);
  • name是要创建文件的名称。

  • mode描述了文件应具有的访问权限。

  • parent表示应保存该文件的目录,数据将存储在生成的inode结构的i_private字段中。

  • fops是一个实现文件行为的一组文件操作。struct file_operations中有关于文件操作的很多接口函数,此处至少应提供read()write()操作,其他的操作可以根据实际情况实现。

    该函数返回值将是指向所创建文件的dentry指针,如果发生错误,则返回ERR_PTR(-ERROR),如果缺少debugfs支持,则返回ERR_PTR(-ENODEV)

  • 3、创建一个具有初始大小的文件

创建一个具有初始大小的文件,需使用以下API:

void debugfs_create_file_size(const char *name, umode_t mode, struct dentry *parent, void *data, 
                              const struct file_operations *fops, loff_t file_size);

file_size是初始文件大小,其他参数与函数debugfs_create_file相同。

  • 4、创建包含单个整数值(十进制)的文件

在多数情况下,创建一组文件操作并不是必需的,这时候可以使用以下助手函数创建包含单个整数值的文件:

//创建包含u8整数值的文件
void debugfs_create_u8(const char *name, umode_t mode, struct dentry *parent, u8 *value); 

//创建包含u16整数值的文件
void debugfs_create_u16(const char *name, umode_t mode, struct dentry *parent, u16 *value); 

创建包含u32整数值的文件
void debugfs_create_u32(const char *name, umode_t mode, struct dentry *parent, u32 *value); 

//创建包含u64整数值的文件
void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent, u64 *value);

这些文件支持读取和写入给定值;如果不写入特定文件,只需相应地设置模式位即可,使用上述API创建的文件中的值是十进制的。

5、创建包含单个十六进制值得文件:

如果需要设置十六进制,可以使用以下API函数:

void debugfs_create_x8(const char *name, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iriczhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值