我在加载内核模块时遇到问题,有一个大数据结构,大约 2Gb 的内存大小 - 无论是我预分配表(以便它在我这样做时显示在 .bss 中,还是在加载时size -A module.ko
尝试它,模块vmalloc()
加载失败,出现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
所以问题是:
- Linux内核模块大小是否有通用的2G限制?
- usernode linux中的内核模块是否有特定的2G限制(我认为过去我注意到大型内核模块需要干净,连续的内存块......)
- 我可以指定
-mcmodel=large
一个内核模块并期望它工作吗?
我已经在 64 位、2.6.32-5-amd64(主机)和 8Gb 内存和 2.6.32 in uml 和 4G 内存的 64 位 2.6.32-5-amd64(主机)上尝试过这个,所以这不应该是一个普通的内存不足问题。
如果存在这样的限制,则可以在限制范围内工作的额外信用:)