- 论坛徽章:
- 0
|
在kernel中文邮件列表里看到一个人写的程序:
我的机器是32位,2G内存,3G/1G虚拟地址。
一直以为vmalloc分配的地址高于0xc0000000+896M+8M,今天写了个程序验证:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
MODULE_LICENSE("Dual BSD/GPL");
static char *k_addr, *v_addr;
static int malloc_init(void)
{
k_addr = kmalloc(1024, GFP_KERNEL);
if (!k_addr)
return -1;
v_addr = vmalloc(1024);
if (!v_addr) {
kfree(k_addr);
return -1;
}
printk(KERN_INFO "k_addr=0x%p\nv_addr=0x%p\n", k_addr, v_addr);
printk(KERN_INFO "k_addr offset=%dM\nv_addr offset=%dM\n",
((int)k_addr-0xc0000000)/1024/1024, \
((int)v_addr-0xc0000000)/1024/1024);
return 0;
}
static void malloc_exit(void)
{
if (!k_addr)
kfree(k_addr);
if (!v_addr)
vfree(v_addr);
}
module_init(malloc_init);
module_exit(malloc_exit);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
结果却出乎意料:
[ 8994.826089] k_addr=0xf193f400
[ 8994.826091] v_addr=0xf7e61000
[ 8994.826093] k_addr offset=793M //kmalloc分配的地址是在896M以内
[ 8994.826094] v_addr offset=894M //这里vmalloc分配的为什么不是在896M+8M以上呢?
我想是不是zone high 空间不够了,所以fall back到zone normal了? |
|