天天看點

核心态使用vmalloc申請大塊記憶體

        經常在核心版看到網友發帖,問如何在核心态申請大塊記憶體,上百兆甚至上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申請大塊記憶體的總結。不足之處,請大家多多指教。

繼續閱讀