【发布时间】:2017-05-30 10:29:28
【问题描述】:
我正在尝试使用vmalloc() 为内核模块分配大内存。
我无法在具有 64GB 内存的 64 位 Linux (3.10.0-514.2.2.el7.x86_64) 上分配超过 2GB 的内存。
这些是相关的代码部分:
...
static int logical_block_size = 512;
module_param(logical_block_size, int, 0);
static int nsectors = 1024; /* How big the drive is */
module_param(nsectors, int, 0);
...
/*
* The internal representation of our device.
*/
static struct sbd_device {
unsigned long size;
spinlock_t lock;
u8 *data;
struct gendisk *gd;
} Device;
...
static int __init sbd_init(void) {
/*
* Set up our internal device.
*/
Device.size = nsectors * logical_block_size;
spin_lock_init(&Device.lock);
Device.data = vmalloc(Device.size);
...
可以通过vmalloc 分配的内存大小是否有限制?还有其他方法可以为内核模块分配大量内存吗?
【问题讨论】:
-
理论上,限制应该是 32TB 或物理上可用的 ram,无论哪个先出现;) 在尝试分配它时,您是否从内核收到一些消息?
-
告诉我们你是如何使用
vmalloc()的。 -
在内核模块中分配 2GiB RAM 听起来是个非常糟糕的主意。看起来像 XY 问题。
-
@Olaf Mind 详细说明为什么这是一个坏主意?我倾向于认为,这取决于应用程序并且找不到论据,为什么不应该有正当理由。
-
@Ctx:因为数据量必须以某种方式传递给应用程序。那么为什么不根据需要在用户空间动态分配内存并传递给内核呢?使用如此大的单个块的一个原因是在一个大而臃肿的内核模块中处理所有事情——这通常是混合不同功能的糟糕概念。只是要明确一点:我并没有说这总是一个坏主意。但从提出的问题来看,我几乎可以肯定它适用于任何 OP 的意图。
标签: c linux-kernel kernel-module