c - linux proc大小限制问题

标签 c linux linux-kernel proc

我正在尝试编写一个 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 ***

我似乎遇到了一些限制,但我找不到任何关于它的东西。该错误似乎与内存泄漏有关,但缓冲区应该足够大,所以我看不到实际发生的位置。

最佳答案

procfs 的读写操作限制为 PAGE_SIZE(一页)。通常 seq_file 用于迭代条目(在你的情况下是模块?)以读取和/或写入较小的 block 。由于您遇到的只是更大数据的问题,我怀疑这里就是这种情况。

请看herehere如果您不熟悉 seq_files。

关于c - linux proc大小限制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497682/

相关文章:

Python 2.4 不加载主目录包

c - 命令 "make menuconfig"如何使用 ncurses 库?

c - 如何检查变量是否等于单词

linux - 使用 awk 和 sed 根据 awk 中的字段值查找使用文件中的行

c - Rebol 3 扩展和 "handles"

linux - 我是否需要 "enable"Linux 3.12 驱动程序中的 PCIe 内存区域?

linux-kernel - 我可以在内核模块中的指定物理地址分配内存页吗?

linux - Linux 中的 init_user 命名空间是什么?

c - C 数组中的合并排序算法 - .exe 未运行?

c++ - 可以从 C 例程调用随机 C++ 2011 标准函数吗?