前面几篇已经学习了procfs和seq_file接口的相关知识,最后当然要动手实验。如果没有实验,调试一下简单的程序,学的知识很快就会忘记。
一、使用默认的proc访问接口
这里我使用默认的proc访问函数并实现需要的read_proc和write_proc函数。
这个测试程序的功能是实现简单的/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;
阅读(399) | 评论(0) | 转发(0) |