免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1566 | 回复: 4
打印 上一主题 下一主题

vmalloc zone_high问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-01 10:16 |只看该作者 |倒序浏览
在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了?

论坛徽章:
0
2 [报告]
发表于 2012-04-01 12:39 |只看该作者
关注一下。zone high没那么容易用完吧

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
3 [报告]
发表于 2012-04-01 23:27 |只看该作者
回复 1# kernel_liwp
先确认一下, 你的系统里, VMALLOC_START究竟定义在哪里? 根据系统RAM实际大小以及使用情况,VMALLOC_START可以调整。

   

论坛徽章:
0
4 [报告]
发表于 2012-04-02 09:07 |只看该作者
#define VMALLOC_OFFSET          (8*1024*1024)
#define VMALLOC_START          (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
#define VMALLOC_VMADDR(x) ((unsigned long)(x))
#define VMALLOC_END          (0xE0000000)

这里high_mem 是动态计算出来的, 你说的896M 是kernel directly mmaped 虚拟内存的最大值,当物理内比896小时, 那么vmalloc_start就往下移了,当物理内存大于896M时, 超过的就是HIGM_MEM了。

可以参考我写的胶片,应该就会一切都明白了。  任何问题可以+q 752070534 ,欢迎交流

ARM_Linux_Course_17_Kernel_Memory_Management.PDF

496.02 KB, 下载次数: 23

论坛徽章:
0
5 [报告]
发表于 2012-04-02 17:47 |只看该作者
moniskiller 发表于 2012-04-02 09:07
#define VMALLOC_OFFSET          (8*1024*1024)
#define VMALLOC_START          (((unsigned long)high_memory + VMALL ...


主楼说了2G物理内存,我想那人的内核八成被动过手脚。。。去查一下high_memory的值案情就清楚了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP