linux proc 大小限制问题
linux proc size limit problems
我正在尝试编写一个 linux 内核模块,它可以将其他模块的内容转储到 /proc 文件(用于分析)。原则上它可以工作,但似乎我 运行 进入了一些缓冲区限制等。我对 Linux 内核开发还很陌生,所以我也很感激任何与特定问题无关的建议。
用于存储模块的内存在此函数中分配:
char *get_module_dump(int module_num)
{
struct module *mod = unhiddenModules[module_num];
char *buffer;
buffer = kmalloc(mod->core_size * sizeof(char), GFP_KERNEL);
memcpy((void *)buffer, (void *)startOf(mod), mod->core_size);
return buffer;
}
'unhiddenModules' 是一个模块结构数组
然后这里交给proc创建:
void create_module_dump_proc(int module_number)
{
struct proc_dir_entry *dump_module_proc;
dump_size = unhiddenModules[module_number]->core_size;
module_buffer = get_module_dump(module_number);
sprintf(current_dump_file_name, "%s_dump", unhiddenModules[module_number]->name);
dump_module_proc = proc_create_data(current_dump_file_name, 0, dump_proc_folder, &dump_fops, module_buffer);
}
proc读取函数如下:
ssize_t dump_proc_read(struct file *filp, char *buf, size_t count, loff_t *offp)
{
char *data;
ssize_t ret;
data = PDE_DATA(file_inode(filp));
ret = copy_to_user(buf, data, dump_size);
*offp += dump_size - ret;
if (*offp > dump_size)
return 0;
else
return dump_size;
}
较小的模块被正确转储,但如果模块大于 126,796 字节,则仅写入前 126,796 字节,并且在从 proc 文件读取时显示此错误:
*** Error in `cat': free(): invalid next size (fast): 0x0000000001f4a040 ***
我似乎 运行 到了某个极限,但我找不到任何关于它的东西。该错误似乎与内存泄漏有关,但缓冲区应该足够大,所以我看不到实际发生的位置。
一个可疑的事情是在 dump_proc_read 中你没有使用 "count" 参数。我本来希望 copy_to_user 将 "count" 作为第三个参数而不是 "dump_size" (在随后的计算中也是如此)。按照您的方式,总是将 dump_size 字节复制到用户 space,而不管应用程序期望的数据大小。 dump_size越大,损坏的用户区越大。
procfs 的读写操作限制为 PAGE_SIZE(一页)。通常 seq_file 用于遍历条目(在您的情况下是模块?)以读取 and/or 写入较小的块。由于您 运行 只遇到较大数据的问题,我怀疑这里就是这种情况。
我正在尝试编写一个 linux 内核模块,它可以将其他模块的内容转储到 /proc 文件(用于分析)。原则上它可以工作,但似乎我 运行 进入了一些缓冲区限制等。我对 Linux 内核开发还很陌生,所以我也很感激任何与特定问题无关的建议。
用于存储模块的内存在此函数中分配:
char *get_module_dump(int module_num)
{
struct module *mod = unhiddenModules[module_num];
char *buffer;
buffer = kmalloc(mod->core_size * sizeof(char), GFP_KERNEL);
memcpy((void *)buffer, (void *)startOf(mod), mod->core_size);
return buffer;
}
'unhiddenModules' 是一个模块结构数组
然后这里交给proc创建:
void create_module_dump_proc(int module_number)
{
struct proc_dir_entry *dump_module_proc;
dump_size = unhiddenModules[module_number]->core_size;
module_buffer = get_module_dump(module_number);
sprintf(current_dump_file_name, "%s_dump", unhiddenModules[module_number]->name);
dump_module_proc = proc_create_data(current_dump_file_name, 0, dump_proc_folder, &dump_fops, module_buffer);
}
proc读取函数如下:
ssize_t dump_proc_read(struct file *filp, char *buf, size_t count, loff_t *offp)
{
char *data;
ssize_t ret;
data = PDE_DATA(file_inode(filp));
ret = copy_to_user(buf, data, dump_size);
*offp += dump_size - ret;
if (*offp > dump_size)
return 0;
else
return dump_size;
}
较小的模块被正确转储,但如果模块大于 126,796 字节,则仅写入前 126,796 字节,并且在从 proc 文件读取时显示此错误:
*** Error in `cat': free(): invalid next size (fast): 0x0000000001f4a040 ***
我似乎 运行 到了某个极限,但我找不到任何关于它的东西。该错误似乎与内存泄漏有关,但缓冲区应该足够大,所以我看不到实际发生的位置。
一个可疑的事情是在 dump_proc_read 中你没有使用 "count" 参数。我本来希望 copy_to_user 将 "count" 作为第三个参数而不是 "dump_size" (在随后的计算中也是如此)。按照您的方式,总是将 dump_size 字节复制到用户 space,而不管应用程序期望的数据大小。 dump_size越大,损坏的用户区越大。
procfs 的读写操作限制为 PAGE_SIZE(一页)。通常 seq_file 用于遍历条目(在您的情况下是模块?)以读取 and/or 写入较小的块。由于您 运行 只遇到较大数据的问题,我怀疑这里就是这种情况。