ITPub博客

首页 > 应用开发 > > 内核proc文件系统与seq接口5---通用proc接口与seq_file接口

内核proc文件系统与seq接口5---通用proc接口与seq_file接口

作者:Boriszhang 时间:2019-09-04 14:59:10 0 删除 编辑

 前面几篇已经学习了procfs和seq_file接口的相关知识,最后当然要动手实验。如果没有实验,调试一下简单的程序,学的知识很快就会忘记。

一、使用默认的proc访问接口

这里我使用默认的proc访问函数并实现需要的read_proc和write_proc函数。


proc_test.rar 

这个测试程序的功能是实现简单的/proc/proc_test文件,这个文件在内核中有一个MAX_BUFFER_LENGTH大小的缓存,用户空间可以将字符串写入缓存(字符串长度可以大于1页,每个都以'\0'结尾),并可以分次去取出各段字符串。但是,的确,由于默认的proc访问接口的缓存只有一页内核,这种proc接口在输出大于一页的数据时,对于read_proc的调试的确是让人郁闷的事情(本人水平有限)。幸运的是最后通过了在shell命令行下的测试。以下是测试记录:

# insmod proc_test.ko

proc_test: Module loaded.

# echo tekkaman_0 > /proc/proc_test

# echo tekkaman_1 > /proc/proc_test

# echo tekkaman_2 > /proc/proc_test

# echo tekkaman_3 > /proc/proc_test

# cat test_6KB > /proc/proc_test

# echo tekkaman_4 > /proc/proc_test

# echo tekkaman_5 > /proc/proc_test

# echo tekkaman_6 > /proc/proc_test

# echo tekkaman_7 > /proc/proc_test

# cat /proc/proc_test > ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# cat /proc/proc_test >> ./result.log

# rmmod proc_test.ko

proc_test, exit !

你可以在./result.log 中看到读写的数据。

二、proc文件的访问使用seq_file接口

       前面有讲到,不仅对于大文件,对于一系列的内核结构体的访问(例如用链表串起的数据结构),如果使用procfs默认的访问函数,必须自己在read_proc中实现访问迭代,让人调试到吐血不说,还容易出bug。本身那种接口就不适合大于一页的数据访问。而解决这个问题正是seq_file存在的意义。在这个实验中,我在模块的初始化函数中创建了一系列用于读取的数据结构,并用内核双向链表将其串起。通过procfs输出这一系列的结构体中的数据。数据结构如下图所示:

 

源码:

proc_seq.rar 

测试结果如下:

# insmod proc_seq.ko

proc_seq, online !

proc_test: Module loaded.

# cat /proc/proc_seq

node-0 data[0] = 00; data[1] = 01; data[2] = 02; data[3] = 03;

node-1 data[0] = 04; data[1] = 05; data[2] = 06; data[3] = 07;

node-2 data[0] = 08; data[1] = 09; data[2] = 10; data[3] = 11;

node-3 data[0] = 12; data[1] = 13; data[2] = 14; data[3] = 15;

node-4 data[0] = 16; data[1] = 17; data[2] = 18; data[3] = 19;

node-5 data[0] = 20; data[1] = 21; data[2] = 22; data[3] = 23;

node-6 data[0] = 24; data[1] = 25; data[2] = 26; data[3] = 27;

node-7 data[0] = 28; data[1] = 29; data[2] = 30; data[3] = 31;

node-8 data[0] = 32; data[1] = 33; data[2] = 34; data[3] = 35;

node-9 data[0] = 36; data[1] = 37; data[2] = 38; data[3] = 39;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2435/viewspace-3135207/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-16

  • 博文量
    110
  • 访问量
    1068