linux中的内核模块是否有大小限制?

Kim*_*ais 8 kernel-module linux-kernel vmalloc

我有一个加载内核模块的问题,有一个大的数据结构,大约2Gb的内存大小 - 我是否预先分配表(以便它在我执行时显示在.bss中size -A module.kovmalloc()在加载时尝试它,模块加载失败insmod: error inserting 'module.ko': -1 Cannot allocate memory.

我试着调试上的用户模式Linux上的问题,但我得到了一堆段错误的(可以继续在gdb,但有一个控制台消息结束了overflow in relocation type 10 val <value in the ball park of 6G>'module' likely not compiled with -mcmodel=kernel我认为与Kbuild-mcmodel应是正确的,对不对?

所以问题是:

  1. Linux内核模块大小是否有通用的2G限制?
  2. usernode linux中的内核模块是否有特定的2G限制(我认为在过去我注意到大型内核模块需要一个干净,连续的内存块......)
  3. 我可以指定-mcmodel=large内核模块并期望它工作吗?

我已经尝试过debian squeeze,64位,2.6.32-5-amd64(主机),8Gb内存和2.6.32 in uml 4G内存,所以这应该是普通的内存不足问题.

如果存在这样的限制,可以获得超出限制的额外功劳:)

Eug*_*ene 7

至于你的第一个问题 - 模块本身的限制是64兆字节.模块加载器将拒绝加载超过此大小的模块.来自kernel/module.c:

if (len > 64 * 1024 * 1024 || (hdr = vmalloc(len)) == NULL)
        return ERR_PTR(-ENOMEM);
Run Code Online (Sandbox Code Playgroud)

2.6.32和新内核都是如此,最高可达3.3.

编辑:在内核版本3.4中,删除了64 Mb限制.现在实际限制仅取决于vmalloc()可以分配多少内存.


Kim*_*ais 0

如果我将表定义为- 模块加载确实会失败 - 这可能是因为Andrew Aylettstatic的答案中提到的 1.5G 限制

然而,如果我进行动态vmalloc()调用,我能够在具有 8Gb 内存的主机上获得高达 7680Mb 的内存(直到内核杀死了一些关键进程并且我的 X 挂起)。

所以回答我的问题:

  1. 是的,但仅适用于编译为static
  2. 看起来不像。
  3. 没有必要这样做。

额外加分:就这么做vmalloc()

这只适用于高于 2.6.10 的Linux 内核- 在此之前,vmalloc() 限制为 64 Mb。