Linux Kernel Debugfs 全面讲解和实战指南

点击京东购买书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》

适用对象:Linux 内核驱动开发者、嵌入式工程师、系统调试人员

本文将从原理、代码、实战、调试与添加新接口等方面,全面讲解 Linux 内核 debugfs 文件系统的作用和使用方法。


一、Debugfs 概述

1.1 是什么?

debugfs 是 Linux 内核为了提供 调试接口和开发数据推送 而设计的一种虚拟文件系统,类似于 /proc/sys,但是 完全靠驱动程序动态创建,不依赖于实际硬件设备。

它允许开发者在 /sys/kernel/debug/ 目录下创建文件,以文件形式进行 读/写 操作,实现对内核状态的展示和控制。


二、优点和特性

类别说明
面向开发和调试非生产环境使用,不应用于正常用户或用户端功能
虚拟文件系统非实际文件,所有数据即时生成,即时消失
与 proc/sysfs 分工不为内核核心功能提供接口,而是面向开发者的特殊通道
简单化接口用户端通过 cat echo 即可使用,简单相对于 ioctl/sysfs

三、启用 debugfs

3.1 内核配置

需要打开以下配置:

CONFIG_DEBUG_FS=y

可通过:

zcat /proc/config.gz | grep CONFIG_DEBUG_FS

3.2 挂载 debugfs

mount -t debugfs none /sys/kernel/debug

默认挂载点是 /sys/kernel/debug ,但也可以挂载到自己指定的路径。


四、实战一:查看时钟状态 (clk_summary)

解释

i.MX8MP 和其他平台使用 common clock framework 和 debugfs 接口,实时展示全系统时钟树状态

操作

cat /sys/kernel/debug/clk/clk_summary

输出示例

   clock                        enable_cnt  prepare_cnt        rate
---------------------------------------------------------------------
   osc_24m                             1            1      24000000
     sys_pll1                          2            2     800000000
       sys_pll1_div2                  1            1     400000000

在这里插入图片描述

评估方式

  • enable_cnt=0 表示未启用
  • rate 是实际频率,可用于分析功能强度

五、实战二:编写自定义 debugfs 接口

基本步骤

  1. 创建目录:debugfs_create_dir()
  2. 创建文件:debugfs_create_file()
  3. 定义 file_operations 进行读/写
  4. 卸载时删除点:debugfs_remove_recursive()

示例代码

简单模块在 debugfs 中创建 status 文件,返回一个自定义值:

static u32 status_value = 42;

static ssize_t status_read(struct file *file, char __user *buf,
                           size_t count, loff_t *ppos)
{
    char tmp[64];
    int len = snprintf(tmp, sizeof(tmp), "status = %u\n", status_value);
    return simple_read_from_buffer(buf, count, ppos, tmp, len);
}

static const struct file_operations fops = {
    .owner = THIS_MODULE,
    .read  = status_read,
};

static struct dentry *mydir;

static int __init my_debugfs_init(void)
{
    mydir = debugfs_create_dir("mydebug", NULL);
    debugfs_create_file("status", 0444, mydir, NULL, &fops);
    return 0;
}

static void __exit my_debugfs_exit(void)
{
    debugfs_remove_recursive(mydir);
}

六、接口维护和经验

使用策略

  • 请勿在生产环境启用 debugfs
  • 请勿使用 debugfs 实现重要功能
  • 利用 u32/bool/指针,简化数据推送和重环解析

七、总结

  • debugfs 是开发环境下解析内核状态的第一选择
  • 可配合 cat/echo/grep 进行方便操作
  • 不应作为程序接口提供给用户
  • i.MX8MP 平台已实际应用于 clk/强电/gpu/vpu 等多个子系统

如需配合 Yocto 、自定义 debugfs 接口提供实战演示,可继续扩展第二部分。
点击京东购买书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值