vmalloc()
を使用して、大きなメモリをカーネルモジュールに割り当てようとしています。 64GBのRAMを搭載した64ビットLinux(3.10.0-514.2.2.el7.x86_64)に2GB以上のメモリを割り当てることができません。vmallocを使用して大量のメモリをカーネルモジュールに割り当てる
これらは、関連するコード部分である:
...
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でなければなりません。)割り当てようとしているときにカーネルからメッセージを受け取りますか? – Ctx
'vmalloc()'をどのように使っているか教えてください。 – syntagma
2GiB RAMをカーネルモジュールに割り当てることは非常に悪い考えです。 XY問題のように見えます。 – Olaf