活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设备号次设备号等等,只需要实现一个file_operations,然后通过debugfs_create_file就可以在debugfs中建立一个文件结点,就像字符设备驱动那样,只需要对这个文件结点进行open就可以进行read、write、ioctl,等等操作,这些操作对应到我们在驱动里为debugfs准备的file_operations。
cat/proc/mounts查看挂载信息:
debugfs文件系统挂载在/sys/kernel/debug/目录下
驱动中使用debugfs需要包含头文件
使用如下命令:
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介绍