經常在核心版看到網友發帖,問如何在核心态申請大塊記憶體,上百兆甚至上G的記憶體。
用kmalloc或get_free_pages都不能滿足這樣的要求。今天又在核心版看到這樣的文章,其中白金
兄回複說可以用vmalloc實作,并且給出了例程。本人也進行了實踐,初步看來是配置設定成功了,但
至于是否可以有效的應用于生産環境還有待于驗證。本文的總結僅作為學習環境上的探讨和時間。
以下是申請大塊記憶體的代碼。代碼是以白金兄提供的代碼:
(http://linux.chinaunix.net/bbs/viewthread.php?tid=1139485&page=2#pid7139143)為藍本,本
人僅添加了傳遞子產品參數的代碼。傳遞的子產品參數為申請記憶體的大小,機關為Mbyte。
#include <linux/module.h>
#include <linux/vmalloc.h>
/*Godbach added module parameter*/
static int memsize = 100;/*Unit: Mbyte*/
module_param(memsize, int, S_IRUGO);
__u8 *data;
int init_module (void)
{
data = vmalloc(1024 * 1024 * memsize);
if (!data)
return -ENOMEM;
memset(data, 0xff, 1024 * 1024 * memsize);
printk("module loaded.\n");
return 0;
}
void cleanup_module(void)
{
vfree(data);
printk("module unloaded.\n");
return ;
}
MODULE_AUTHOR("platinum");
MODULE_DESCRIPTION("This is a module sample.");
MODULE_LICENSE("GPL");
本人的核心版本是2.6.18.3,編譯該核心子產品,生成 alloc_large_mem.ko.
以下是預設申請100M記憶體時系統前後記憶體的變化。
[[email protected] alloc_large_mem]# free
total used free shared buffers cached
Mem: 385624 188760 196864 0 1908 54936
-/+ buffers/cache: 131916 253708
Swap: 522104 8068 514036
[[email protected] alloc_large_mem]#
[[email protected] alloc_large_mem]# insmod alloc_large_mem.ko
[[email protected] alloc_large_mem]# free
total used free shared buffers cached
Mem: 385624 290388 95236 0 1960 54948
-/+ buffers/cache: 233480 152144
Swap: 522104 8068 514036
[[email protected] alloc_large_mem]#
那麼,另外一個問題,vmalloc可以配置設定的記憶體上限是多少呢?參考白金兄的說法,vmalloc配置設定的
記憶體上限是和cat /proc/meminfo中VmallocTotal的值有關的。我這裡的顯示結果為:
[[email protected] alloc_large_mem]# cat /proc/meminfo
……
VmallocTotal: 638968 kB
VmallocUsed: 3512 kB
VmallocChunk: 633644 kB
是以,vmalloc最大可配置設定的記憶體為600M,由于我的剩餘實體記憶體隻有200M左右。是以這裡嘗試
300M的記憶體觀察一下結果。
[[email protected] alloc_large_mem]# free
total used free shared buffers cached
Mem: 385624 101216 284408 0 4348 46800
-/+ buffers/cache: 50068 335556
Swap: 522104 88400 433704
[[email protected] alloc_large_mem]# cat /proc/meminfo | grep Vmalloc
VmallocTotal: 638968 kB
VmallocUsed: 3512 kB
VmallocChunk: 633644 kB
[[email protected] alloc_large_mem]#
[[email protected] alloc_large_mem]# insmod alloc_large_mem.ko memsize=300
[[email protected] alloc_large_mem]# free
total used free shared buffers cached
Mem: 385624 380040 5584 0 1796 21896
-/+ buffers/cache: 356348 29276
Swap: 522104 88400 433704
[[email protected] alloc_large_mem]# cat /proc/meminfo | grep Vmalloc
VmallocTotal: 638968 kB
VmallocUsed: 311032kB
VmallocChunk: 326440 kB
[[email protected] alloc_large_mem]#
這裡測試的情況是虛拟記憶體的使用情況卻是增加了300M左右,而實體記憶體基本上已經耗盡了。
白金兄曾經測試在啟動時 kernel 裡 vmalloc=1280M,然後insmod核心子產品成功配置設定到1G的記憶體。
我也曾測試配置設定500M或400M的情況(虛拟記憶體上限600多M),但都失敗了:
[[email protected] alloc_large_mem]# insmod alloc_large_mem.ko memsize=500
insmod: error inserting 'alloc_large_mem.ko':-1 Cannot allocate memory
[[email protected] alloc_large_mem]# insmod alloc_large_mem.ko memsize=400
insmod: error inserting 'alloc_large_mem.ko':-1 Cannot allocate memory
究其原因,應該是超過了核心啟動時預設的vmalloc的值,可以通過指定核心啟動時vmalloc=xxx來
解決。
以上是用vmalloc申請大塊記憶體的總結。不足之處,請大家多多指教。