Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184546
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-01-11 17:10
个人简介

路漫漫其修远兮,吾将上下而求索!

文章分类
文章存档

2016年(115)

我的朋友

分类: LINUX

2016-01-12 10:52:21

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

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

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

  1. # insmod proc_test.ko
  2. proc_test: Module loaded.
  3. # echo tekkaman_0 > /proc/proc_test
  4. # echo tekkaman_1 > /proc/proc_test
  5. # echo tekkaman_2 > /proc/proc_test
  6. # echo tekkaman_3 > /proc/proc_test
  7. # cat test_6KB > /proc/proc_test
  8. # echo tekkaman_4 > /proc/proc_test
  9. # echo tekkaman_5 > /proc/proc_test
  10. # echo tekkaman_6 > /proc/proc_test
  11. # echo tekkaman_7 > /proc/proc_test
  12. # cat /proc/proc_test > ./result.log
  13. # cat /proc/proc_test >> ./result.log
  14. # cat /proc/proc_test >> ./result.log
  15. # cat /proc/proc_test >> ./result.log
  16. # cat /proc/proc_test >> ./result.log
  17. # cat /proc/proc_test >> ./result.log
  18. # cat /proc/proc_test >> ./result.log
  19. # cat /proc/proc_test >> ./result.log
  20. # cat /proc/proc_test >> ./result.log
  21. # rmmod proc_test.ko
  22. proc_test, exit !

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

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

 

源码:

 proc_seq.rar   

测试结果如下:

  1. # insmod proc_seq.ko
  2. proc_seq, online !
  3. proc_test: Module loaded.
  4. # cat /proc/proc_seq
  5. node-0 data[0] = 00; data[1] = 01; data[2] = 02; data[3] = 03;
  6. node-1 data[0] = 04; data[1] = 05; data[2] = 06; data[3] = 07;
  7. node-2 data[0] = 08; data[1] = 09; data[2] = 10; data[3] = 11;
  8. node-3 data[0] = 12; data[1] = 13; data[2] = 14; data[3] = 15;
  9. node-4 data[0] = 16; data[1] = 17; data[2] = 18; data[3] = 19;
  10. node-5 data[0] = 20; data[1] = 21; data[2] = 22; data[3] = 23;
  11. node-6 data[0] = 24; data[1] = 25; data[2] = 26; data[3] = 27;
  12. node-7 data[0] = 28; data[1] = 29; data[2] = 30; data[3] = 31;
  13. node-8 data[0] = 32; data[1] = 33; data[2] = 34; data[3] = 35;
  14. node-9 data[0] = 36; data[1] = 37; data[2] = 38; data[3] = 39;

阅读(598) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~