本文也即《Linux Device Drivers》,LDD3的第四章Debuging Techniques的读书笔记之三,但我们不限于此内容。
在上次我们使用了read_proc的方式通过/proc文件读取kernel module的信息。作者给的例子他自己说是ugly。而我们在读取大量数据时发现,受到用户buffer大小的限制(page的大小),可能需要读取多次,不仅需要记录上次读取的位置,而且由于每次读取我们申请了信号量,读取完释放,那么如果多次读取的间隔中,如果信号量被写所获取就好出现混乱。linux kernel提供seq_file更好的方式来解决这个问题,除非我们确定读取的信息量非常少,能够在page中返回,我们应使用seq_file的方式而不是read_proc 。
LDD3中介绍的方式,我觉得是典型的西方人和中国人思维方式的不同。在seq_file的介绍中,LDD3先从每个操作具体将其,然后到如何和proc文件联系,最后到如何创建proc文件,我喜欢反过来的方式,先创建proc,在一步步细化。老外是日月年,我们是年月日,嘿嘿。seq_file的处理方式开看有点发展,步骤有些多,但是安全,是规范的处理方式。
步骤一:建立proc文件。
通过一个struct proc_dir_entry的元素,在/proc中建立文件,如下:
struct proc_dir_entry * entry = create_proc_entry(“scullseq”,0,NULL)。参数的内容和read_proc,第一个参数表示文件名,第二个参数表示文件属性,对于只读方式为0,第三个参数表示文件路径,NULL表示缺省路径,即/proc。
步骤二:关联proc的操作。
需要对文件进行操作,见过文件和struct file_operations相关联,我们注意到这个数据结构也用于模块操作关联中。具体操作如下:
#ifdef SCULL_SEQ_FILE
/* 步骤二:2、定义proc文件所关联的文件操作数据 */
static struct file_operations scull_proc_ops = {
.owner = THIS_MODULE,
.open = scull_proc_open, //open通常这是我们唯一需要重新定义的函数,需要和特定的seq_file关联起来。
.read = seq_read, //采用系统的处理方式
.llseek = seq_lseek, //采用系统的处理方式
.release = seq_release, //采用系统的处理方式
};/* 步骤二:4、在前面的步骤二