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


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

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

文章目录

  • 一、介绍
  • 二、配置
  • 三、debugs的使用

一、介绍

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

二、配置

在内核配置中选中,一般是在Kernel hacking中:
[21天学习挑战赛——内核笔记](六)——在debugfs中添加一个调试目录_第1张图片

cat/proc/mounts查看挂载信息:
debugfs文件系统挂载在/sys/kernel/debug/目录下
[21天学习挑战赛——内核笔记](六)——在debugfs中添加一个调试目录_第2张图片

三、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);

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

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

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

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

Linux之debugfs介绍

你可能感兴趣的:(#,内核笔记,学习,linux,unix)