顺序文件
debugfs 文件系统 允许只用几个函数调用,就实现一个双向的调试接口。
小的文件系统中的文件,通常用户层是 从头到尾顺序读取 的,其内容可能是遍历一些数据项创建的。
kprobe 机制包含了到上述 debugfs文件系统 的一个接口。一个顺序文件向用户层提供了所有注册的探测器。
顺序文件处理程序基本上,必须提供一个 struct file_operations
的实例,其中一些函数指针指向一些 seq_
例程,这样就可以利用顺序文件的标准实现了。
唯一需要实现的方法是 open
。实现该函数不需要多少工作量,简单的一行代码就可以将文件关联到顺序文件接口:
seq_open
建立顺序文件机制所需的数据结构,使用该指针建立了与 struct seq_file
的一个实例之间的关联, struct seq_file
中包含了顺序文件的状态信息:
从文件系统实现者的角度来看,最重要的成员是指针 op
,它指向 seq_operations
的一个实例。这将通用的顺序文件实现与提供具体文件内容的例程关联起来。
使用 libfs 编写 FS
libfs 是一个库,提供了几个非常通用的标准例程,可用于创建服务于特定用途的小型文件系统。函数原型定义在<fs.h>
中,没有<libfs.h>
头文件! libfs 提供的例程通常带有前缀 simple_
。
使用 libfs 建立的虚拟文件系统,其文件和目录层次结构可使用 dentry 树 产生和遍历。
simple_dir_operations
数据结构
普通文件不能使用 libfs 的 file_operations
模板。至少要手工指定 read
、 write
和 open
方法,这是必需的,read
负责从内核内存准备数据并将其复制到用户空间,而 write
可用于读取用户的输出并以一定方式应用它。文件系统还需要一个超级块。
libfs 提供了simple_fill_super
方法,可用于填充给出的超级块:
一个 struct tree_descr
的数组用来描述初始的文件集合。
调试文件系统
使用了 libfs 函数的一个特别的文件系统是调试文件系统 debugfs。它向内核开发者提供了一种向用户层提供信息的可能方法。这些信息并不会编译到产品内核中。它只是开发新特性时的一种辅助手段。仅当内核编译时启用了 DEBUG_FS
配置选项,才会激活对 debugfs
的支持。
因而向 debugfs
注册文件的代码,都会被 C 预处理器条件语句包围,来检查 CONFIG_DEBUG_FS
。
编程接口:
由于debugfs代码非常干净、简单、文档情况良好,所以不必对其实现多加评注。只需讨论其编程接口就足够了。这是对 libfs 例程的非常好的应用。有3个函数可用于创建新的文件系统对象:
文件系统对象可以是普通文件、目录或符号链接。两个附加的操作可用于重命名和删除文件: