Linux内核里的DebugFS
2016-07-04 10:03
232 查看
DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据。类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上,而是Linux内核运行起来后才建立起来。
通常情况下,最常用的内核调试手段是printk。但printk并不是所有情况都好用,比如打印的数据可能过多,我们真正关心的数据在大量的输出里不是那么一目了然;或者我们在调试时可能需要修改某些内核变量,这种情况下printk就无能为力,而如果为了修改某个值重新编译内核或者驱动又过于低效,此时就需要一个临时的文件系统可以把我们需要关心的数据映射到用户空间。在过去,procfs可以实现这个目的,到了2.6时代,新引入的sysfs也同样可以实现,但不论是procfs或是sysfs,用它们来实现某些debug的需求,似乎偏离了它们创建的本意。比如procfs,其目的是反映进程的状态信息;而sysfs主要用于Linux设备模型。不论是procfs或是sysfs的接口应该保持相对稳定,因为用户态程序很可能会依赖它们。当然,如果我们只是临时借用procfs或者sysfs来作debug之用,在代码发布之前将相关调试代码删除也无不可。但如果相关的调试借口要在相当长的一段时间内存在于内核之中,就不太适合放在procfs和sysfs里了。故此,debugfs应运而生。
默认情况下,debugfs会被挂载在目录/sys/kernel/debug之下,如果您的发行版里没有自动挂载,可以用如下命令手动完成:
这个实作会在debugfs中建立如下的目录结构:
其中,a对应模块中的一个u8类型的变量,b和subdir下面的c都是对应模块里的一个字符数组,只是它们的实现方式不同。
在module_init里,我们首先要建立根目录mydebug:
子目录也是用debugfs_create_dir来实现:
Linux内核还提供了其他一些创建debugfs文件的API,请参考本文的附录。
b是一个32-bytes的字符数组,在debugfs里,数组可以用blob wrapper来实现。
如果需要对内核数组进行写的动作,blob wrapper就无法满足要求,我们只能通过自己定义文件操作来实现。在这个实作里,可以参考文件c的实现。c和b在模块里对应着同一块字符数组,不同的是,b是只读的,而c通过自定义的文件操作同时实现了读和写。
到这里,三个文件和子目录已经创建完毕。在module_exit中,我们要记得释放创建的数据。
附录:
创建和撤销目录及文件
创建BLOB文件
相关文章推荐
- Linux的后台执行进程之nohup
- 在Linux环境中使用Ext3文件系统
- centos 7 minimal 安装vmtool
- Linux学习(6)之安装Jenkins
- linux下给网卡加VLAN标签和私网地址
- 10个有用的Linux命令面试问题及答案
- linux命令 rm
- Linux常用命令备忘
- 生信 求旁系同源基因
- linux下dns配置详细步骤
- CentOS下6.5 FTP 文件服务器搭建
- CentOS 6.5下搭建vsftp服务器
- CentOS下SSH配置方法详解
- 每天一个linux命令(33)--du命令
- Linux下读取默认MAC地址
- 红帽、微软和 Codenvy 联合推出语言服务器协定(Language Server Protocol,LSP)项目
- 揭开Linux操作系统的Swap交换区之谜
- 揭开Linux操作系统的Swap交换区之谜
- 高效Linux用户需要了解的命令行技能
- 高效Linux用户需要了解的命令行技能