一、介绍
在调试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);
如上图所示,在binder目录下创建了proc/state/stats/transactions/transaction_log/failed_transaction_log这些文件。
在binder中这些文件的fops全部用一个宏来完成了