免费注册 查看新帖 |

Chinaunix

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

[内存管理] ARM架构下关于内核内存管理的一些疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-18 15:29 |只看该作者 |倒序浏览
各位高手,在下请教几个关于内存管理的问题,由于刚刚开始看内存管理相关的内容,水平很有限,还望知道的不吝赐教,多谢了。

我正在研究两部手机,都是Android系统,一部2.3,对应的内核版本是2.6.35.7,另外一个4.0,对应内核版本号是3.0.8。两部手机都采用了512MB的RAM。


1. 首先说Android 2.3那部手机,我执行了cat /proc/zoneinfo后看到有两个zone:Normal以及Movable。这个Movable内存域貌似是为了阻止物理内存碎片而引入的机制。Normal内存域通过zoneinfo的信息看到start_pfn为512,按照4k一个页帧,也就是说这部手机的Normal内存域是从物理内存2M处开始的,这点和芯片手册内存映射图是完全对应的,手册里面写着为了CPU和Modem之间的通信,物理内存的1M~2M的区域作共享内存使用,而0~1M的区域是bootloader使用的。所以这个start_pfn完全合理。但是Movable这个内存域的start_pfn是262144,按照4k的一个页帧,Movable内存域将从1024M,也即1G的物理内存处开始,这个是否正确?因为物理内存也就512MB,扣除Modem占用的内存,交给Linux管理的物理内存也就是400MB左右,哪位老大能够解惑ZONE_MOVABLE到底是怎么使用的?


2. 再说说Android 4.0这部手机, /proc/zoneinfo的信息显示有两个zone:Normal以及HighMem。首先HighMem这个zone很令人费解,对于物理内存只有512MB的系统而言,怎么会有HighMem呢?通过查看代码,发现原来CONFIG_HIGHMEM这个选项在方案提供商提供的config文件中原本就是打开的,那么对于只有512MB物理内存的系统而言,是否需要关闭这个选项呢?

另外,即使是打开了CONFIG_HIGHMEM,从zoneinfo中看到,HighMem这个内存域的start_pfn是135680,按照4k页帧,HighMem内存域将从物理内存530M处开始。这也超出了物理内存的范围了。这又是怎么回事呢?(关于这个问题,可能和第三个问题有关)。


3. 对于嵌入式系统而言,物理内存地址经常是不连续的。以Android 2.3的这台手机为例,512MB的物理内存分在两个die中,内存物理地址分别映射在0x0000 0000~0x1000 0000以及0x4000 0000~0x5000 0000区间内。对于这种类型的内存分布模型,内核初始化内存域时是如何分配页帧号的呢?比如0x4000 0000这个地址开始的4k页帧,其pfn是直接接着前面物理内存编号,还是直接除以4k来编号呢?


4. 如何知道一个zone中有多少物理内存?其范围是从哪到哪?


新手上路,如果是很白痴的问题,各位莫笑。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2012-07-19 10:47 |只看该作者
本帖最后由 linuxfellow 于 2012-07-19 10:54 编辑

回复 1# fiddle
如果你的系统有512MB内存, 这些内存不会全部用于内核直接映射。要留出128M用于vmalloc.
你的直接影射区在0xc0000000--0xd80000 有384MB
vmalloc区在0xd880000--0xe0000000 有120MB  中间有8MBgap来捕捉地址越界。

两块内存区的处理方法很多。我的系统里有internal RAM 和external RAM. internal RAM在初始化时静态(mapio)射到固定地址;external ram交给linux kernel管理。

   

论坛徽章:
0
3 [报告]
发表于 2012-07-20 11:15 |只看该作者
回复 1# fiddle

问得好。第一个问题没有看过。试着回答后面几个问题:

    2. 再说说Android 4.0这部手机, /proc/zoneinfo的信息显示有两个zone:Normal以及HighMem。首先HighMem这个zone很令人费解,对于物理内存只有512MB的系统而言,怎么会有HighMem呢?通过查看代码,发现原来CONFIG_HIGHMEM这个选项在方案提供商提供的config文件中原本就是打开的,那么对于只有512MB物理内存的系统而言,是否需要关闭这个选项呢?

另外,即使是打开了CONFIG_HIGHMEM,从zoneinfo中看到,HighMem这个内存域的start_pfn是135680,按照4k页帧,HighMem内存域将从物理内存530M处开始。这也超出了物理内存的范围了。这又是怎么回事呢?(关于这个问题,可能和第三个问题有关)。

关于HIGHMEM,在Kernel是这样解释的:
HIGHMEM
        bool "High Memory Support"
        depends on MMU
        help
          The address space of ARM processors is only 4 Gigabytes large
          and it has to accommodate user address space, kernel address
          space as well as some memory mapped IO. That means that, if you
          have a large amount of physical memory and/or IO, not all of the
          memory can be "permanently mapped" by the kernel. The physical
          memory that is not permanently mapped is called "high memory".

          Depending on the selected kernel/user memory split, minimum
          vmalloc space and actual amount of RAM, you may not need this
          option which should result in a slightly faster kernel.



3. 对于嵌入式系统而言,物理内存地址经常是不连续的。以Android 2.3的这台手机为例,512MB的物理内存分在两个die中,内存物理地址分别映射在0x0000 0000~0x1000 0000以及0x4000 0000~0x5000 0000区间内。对于这种类型的内存分布模型,内核初始化内存域时是如何分配页帧号的呢?比如0x4000 0000这个地址开始的4k页帧,其pfn是直接接着前面物理内存编号,还是直接除以4k来编号呢?



页帧号=物理地址<<12

/*
* Convert a physical address to a Page Frame Number and back
*/
#define __phys_to_pfn(paddr)    ((unsigned long)((paddr) >> PAGE_SHIFT))



4. 如何知道一个zone中有多少物理内存?其范围是从哪到哪?

这个要根据kernel 最终拿到的cmdline中"mem"参数来决定物理内存有多大。

新手上路,如果是很白痴的问题,各位莫笑。

论坛徽章:
0
4 [报告]
发表于 2012-07-20 11:19 |只看该作者
回复 2# linuxfellow


    如果有512MB的物理内存,VMALLOC_START的地址是 3GB+512MB+8MB. vmalloc的作用是,当连续的物理内存不够的时候,提供一个非线性的连续虚拟地址映射的物理内存。所以,不会预留。

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
5 [报告]
发表于 2012-07-21 13:03 |只看该作者
回复 4# omycle
楼上两位都对, 说反了。应该预留的是逻辑地址,当物理内存大于896M时仍要留够128M逻辑空间。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP