内核笔记](六)——在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全部用一个宏来完成了


相关文章
|
6月前
|
Ubuntu Linux
linux(三十六)文件和目录相关命令tree
linux(三十六)文件和目录相关命令tree
51 0
|
6月前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
85 0
|
3月前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
44 0
|
6月前
|
存储 运维 Linux
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
136 0
【Shell 命令集合 系统设置 】⭐Linux 显示Linux内核环缓冲区的内容 dmesg命令 使用指南
|
6月前
|
Unix Linux
Linux文件空洞与fallocate快速创建大文件
在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。大部分文件系统是不占用的。
247 0
Linux文件空洞与fallocate快速创建大文件
|
存储 API Windows
驱动开发:内核遍历文件或目录
在笔者前一篇文章`《驱动开发:内核文件读写系列函数》`简单的介绍了内核中如何对文件进行基本的读写操作,本章我们将实现内核下遍历文件或目录这一功能,该功能的实现需要依赖于`ZwQueryDirectoryFile`这个内核API函数来实现,该函数可返回给定文件句柄指定的目录中文件的各种信息,此类信息会保存在`PFILE_BOTH_DIR_INFORMATION`结构下,通过遍历该目录即可获取到文件的详细参数,如下将具体分析并实现遍历目录功能。
1436 0
|
编译器 Linux 开发工具
调试记录 | Linux 内核静态库封装问题
调试记录 | Linux 内核静态库封装问题
344 0
|
缓存 测试技术 芯片
内核笔记](二)——设备树基础
内核笔记](二)——设备树基础
510 0
|
Java Linux API
内核笔记](九)——sysfs相关API
内核笔记](九)——sysfs相关API
187 0
内核笔记](九)——sysfs相关API
下一篇
无影云桌面