0

我们有一个写入文件的内核模块,我们读取 proc 文件以获取有关硬件操作的一些信息。硬件操作统计数据变成超过3072字节(PROC_BLOCK_SIZE);所以我们通过定义一个大小为 4096 字节的全局缓冲区来本地缓冲数据。一旦数据被完全读取,然后我们将数据移动到 proc_read_kernel 缓冲区到本地缓冲区。这是按照 linux-2.6.28/proc/fs/generic.c 中围绕第 165 行定义的 hack (2) 完成的。在读取整个缓冲区之前,我们不会发送 eof,因此 read proc 将被调用两次,一次为 3072 字节,下一次为 1024 字节。我们执行 memcpy 将数据复制到读取 proc 缓冲区。读取过程将仅由命令行调用。

但是在添加全局缓冲区之后插入这个特定的模块会对 get from storage device 的性能数字产生一些影响。如果我们不做这个内核模块的 modprobe,那么我们会看到更好的数字。从逻辑上讲,全局缓冲区将位于 BSS 区域中,并且由于未调用该命令,因此也不会调用 memcpy。我们无法解释这种异常情况。任何指针都会非常有帮助。

4

1 回答 1

3

我的水晶球今天在清洁工那里,所以恐怕我无法完全判断你做了什么样的“黑客”以及它是否会影响某些东西,更不用说真正的问题可能出在哪里了。

也就是说,我建议您开始消除可能的问题来源。删除部分模块并加载它,看看您是否仍然看到性能下降。杀死你的黑客(通过字符设备或其他东西获取你的统计数据!),看看是否有帮助。哎呀,加载一个虚拟的“你好世界!” 模块,看看是否有什么作用。一旦你缩小了原因,再回来,也许有人会帮助你——没有代码可以继续,也不知道你做了什么改变,不可能给你更具体的答案.

于 2012-04-28T09:08:31.223 回答