• [21天学习挑战赛——内核笔记](六)——在debugfs中添加一个调试目录



    活动地址:CSDN21天学习挑战赛

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    一、介绍

    在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设备号次设备号等等,只需要实现一个file_operations,然后通过debugfs_create_file就可以在debugfs中建立一个文件结点,就像字符设备驱动那样,只需要对这个文件结点进行open就可以进行read、write、ioctl,等等操作,这些操作对应到我们在驱动里为debugfs准备的file_operations。

    二、配置

    在内核配置中选中,一般是在Kernel hacking中:
    请添加图片描述

    cat/proc/mounts查看挂载信息:
    debugfs文件系统挂载在/sys/kernel/debug/目录下
    请添加图片描述

    三、debugs的使用

    驱动中使用debugfs需要包含头文件,为了在用户态下使用debugfs,必须把它mount到一个目录下,我们可以把它放在mnt目录下。

    使用如下命令:

    mount-t debugfs none /mnt

    然后进入 /mnt后就可以看到我们在系统中创建的这些文件。
    下面我们开始说一下如何在驱动中使用debugfs.

    首先我们需要创建一个自己的目录,利用如下函数:

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

    name 就是创建的目录的名字, parent 是该目录的父目录,如果是 NULL 的话,则所创建的目录就在 debugfs 的根目录,具体使用如下:

    static struct dentry *binder_debugfs_dir_entry_root;
    binder_debugfs_dir_entry_root= debugfs_create_dir(“binder”, NULL);

    这样就会在debugfs的根目录下创建一个binder的目录,有了目录还需要有可供读写的文件吧,下边就是另一个重要的函数,文件的创建:

    struct dentry *debugfs_create_file(const char *name, mode_t mode,
    struct dentry *parent, void *data,
    const struct file_operations *fops)

    如其函数名,这个函数的作用就是在parent这个目录下创建一个名为name的文件,mode是这个文件读写权限,data是传入的参数,fops就比较重要了,为我们的文件提供实际的读写操作。

    在binder驱动中创建了如下文件

    debugfs_create_file("state",
    S_IRUGO,
    binder_debugfs_dir_entry_root,
    NULL,
    &binder_state_fops);
     
    debugfs_create_file("stats",
    S_IRUGO,
    binder_debugfs_dir_entry_root,
    NULL,
    &binder_stats_fops);
     
    debugfs_create_file("transactions",
    S_IRUGO,
    binder_debugfs_dir_entry_root,
    NULL,
    &binder_transactions_fops);
     
    debugfs_create_file("transaction_log",
    S_IRUGO,
    binder_debugfs_dir_entry_root,
    &binder_transaction_log,
    &binder_transaction_log_fops);
     
    debugfs_create_file("failed_transaction_log",
    S_IRUGO,
    binder_debugfs_dir_entry_root,
    &binder_transaction_log_failed,
    &binder_transaction_log_fops);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    如上图所示,在binder目录下创建了proc/state/stats/transactions/transaction_log/failed_transaction_log这些文件。

    在binder中这些文件的fops全部用一个宏来完成了

    参考文章:
    RK3399平台开发系列讲解(内核调试篇)2.13、如何在debugfs中添加一个调试目录及文件

    Linux驱动调试中的Debugfs的使用简介

    Linux之debugfs介绍

  • 相关阅读:
    lightgbm使用multiclass训练二分类模型
    2024/03/01
    白银现货销售如何提升自己?
    qiankun项目搭建手册
    【操作系统-存储】存储的分配和管理方式
    油管125万粉顶级交易员_教你使用macd
    IDEA中点击New没有Java Class
    OpenCV画图(画OpenCV的标志)
    为什么Vue组件中的data是一个函数
    分布式事务(四)———SAGA 解决方案
  • 原文地址:https://blog.csdn.net/m0_52592798/article/details/126301332