免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: kernelinside
打印 上一主题 下一主题

high_memory可以被进程使用吗? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-08-31 12:36 |只看该作者
High Memory这个概念之所以会存在是因为,
在32位的Non-PAE的系统中,kernel只有1G
的虚拟地址空间。而这1G的虚拟地址空间中只有
前面的896M可以用来直接映射物理内存,所以,
Linux的kernel可以直接映射的物理内存只有
896M,而这896M的内存映射的页面表是在
kernel启动以后就建立起来的。
在Linux Kernel对物理内存的描述中,物理内存
被分为了三个部分:ZONE_DMA - 0 ~ 16M
ZONE_NORMAL - 16M ~ 896M
ZONE_HIGHMEM - 896M ~ MAXMEM

上面说了,KERNEL可以直接进行映射的物理内存
的大小为896M,那高于896M的内存该怎么映射呢,
Linux使用的发方法是将大于896M的物理内存中使用到
的那部分临时映射到 896M-1G中间的某一部分虚拟内存
空间中 ,也就是“KMAP Address Space”。当这部分物理
内存不再使用了,就将这个映射拆除 ,下次使用高端内存
的时候可以继续使用这个方法进行映射。

vmalloc和高端内存唯一的联系就是:
当vmalloc将不连续的物理内存映射成为连续的虚拟内存时,
这个连续的虚拟内存空间一般是在896M-1G的这个128MB中的
一部分虚拟内存空间。

给楼主推荐一个资料 : Mel Gorman的 《understanding the linux virtual memory manager>
如果楼主有兴趣可以参考它的chapter 7 和 chapter 9

论坛徽章:
0
22 [报告]
发表于 2011-08-31 15:27 |只看该作者
回复 3# luoyan_xy


   high_memory  在内核里面指的是虚拟地址,而非物理地址
  1. void __init initmem_init(void)
  2. {
  3.         x86_numa_init();

  4. #ifdef CONFIG_HIGHMEM
  5.         highstart_pfn = highend_pfn = max_pfn;
  6.         if (max_pfn > max_low_pfn)
  7.                 highstart_pfn = max_low_pfn;
  8.         printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
  9.                pages_to_mb(highend_pfn - highstart_pfn));
  10.         num_physpages = highend_pfn;

  11.        //看这儿,将物理地址转化为虚拟地址,然后赋给high_memory
  12.         high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
  13. 。。。
复制代码
其它的我的理解和这位兄台一样。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
23 [报告]
发表于 2011-08-31 16:41 |只看该作者
1.assume: x86, 2.6.3x, 物理内存1G,则由896+8M开始的一块128M的物理内存,linux称为high_memory.那么这一块128M内存,是不是由内核和进程共享的?
即内核通过vmalloc()可以分配到这块物理内存,而进程在向内核请求分配内存时也有可能分配到这块物理内存?
还是说内核是"排它"性的,仅仅由vmalloc()使用?
在x86体系结构上,高于896MB的所有物理内存的是高端内存
不是896MB+8MB开始的,这个是指线性地址,你的意思应该是说896MB~1G的物理内存是不是由内核和进程共享的。
内核和进程都可以对这块物理内存进行映射。
而3G+896MB+8MB开始的动态内存分配区是vmalloc的天下。

2.再assume: x86, 2.6.3x物理内存512m,此时没有high_memory.这种情况下内核的vmalloc()在哪部分的物理内存中去分配呢?

如果内存低于512MB,则不存在高端内存这一说了。
ZONE_DMA   <16MB
ZONE_NORMAL 16~896MB
ZONE_HIGHMEM >896MB

vmalloc只是分配3G+(直接映射区大小)+8MB开始的动态内存映射区,与物理地址多大无关。

论坛徽章:
0
24 [报告]
发表于 2011-08-31 17:59 |只看该作者
本帖最后由 muzi19861113 于 2011-08-31 18:08 编辑

#回复22楼
此high_memory非彼High Memory


vonnyfly兄可以参考一下Linux内核代码中关于这个变量的注释。

论坛徽章:
0
25 [报告]
发表于 2011-09-01 13:01 |只看该作者
回复 24# muzi19861113
其实他们差不多,从不同的角度理解。从代码上看,是我说的那样,要是从物理内存、概念上,也可以说物理内存高于896M的部分。

论坛徽章:
0
26 [报告]
发表于 2011-09-01 14:49 |只看该作者
当某进程在内核态用vmalloc()申请内存超过128m的时候,会不会因为用于映射的线性地址空间不够而失败呢?

论坛徽章:
0
27 [报告]
发表于 2011-09-02 08:54 |只看该作者
首先,那128M空间中只有一部分线性空间用来映射vmalloc所得到的
不连续的物理地址空间。
而当你使用vmalloc所申请的内存大于用来映射它的那部分线性空间时,
这个分配肯定是失败的。
kernelinside兄可以去看一下源码,源码中vmalloc函数在开始阶段
就会判断给它预留的线性空间够不够的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP