内核笔记](六)——在debugfs中添加一个调试目录

简介: 内核笔记](六)——在debugfs中添加一个调试目录

一、介绍


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


二、配置


在内核配置中选中,一般是在Kernel hacking中:


image.png


cat/proc/mounts查看挂载信息:

debugfs文件系统挂载在/sys/kernel/debug/目录下

0a2653c851af460fa595bd959398a8f1.png


三、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全部用一个宏来完成了


相关文章
|
4月前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
51 0
|
7月前
|
存储 运维 Linux
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
157 0
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
|
7月前
|
Unix Linux
Linux文件空洞与fallocate快速创建大文件
在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。大部分文件系统是不占用的。
279 0
Linux文件空洞与fallocate快速创建大文件
|
编译器 Linux 开发工具
调试记录 | Linux 内核静态库封装问题
调试记录 | Linux 内核静态库封装问题
349 0
|
缓存 测试技术 芯片
内核笔记](二)——设备树基础
内核笔记](二)——设备树基础
526 0
|
Java Linux API
内核笔记](九)——sysfs相关API
内核笔记](九)——sysfs相关API
197 0
内核笔记](九)——sysfs相关API
|
Linux 虚拟化
浅入分析和Linux内核相关的文件夹/proc和/sys .
近来文章被踩的厉害,我只想把自己从马哥学的知识自己总结下发到博客里,但是没想到昨天一篇文章刚发一上午被踩了9次。。。如果您真的觉得我的文章很烂,请告诉我原因,不胜感激。   这星期,马哥讲了关于Linux内核的编译和Linux的内核模块,浅显易懂,所以写出来和大家一起分享学习成果。
981 0
|
Linux Shell
为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件
http://blog.csdn.net/morixinguan/article/details/77808088 上节,我们明白了proc文件系统的作用,接下来我们在友善之臂已经写好的led驱动的基础上,在proc目录下创建一个文件夹,然后加入led驱动的版本信息读取。
1388 0