首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

meminfo引见

2013-03-21 
meminfo介绍Chipset:MSM8x25QCodebase:Android 4.1Linux Kernel: 3.4.0在linux Kernel中,一开始内存相关的

meminfo介绍

Chipset:MSM8x25Q

Codebase:Android 4.1

Linux Kernel: 3.4.0

 

         在linux Kernel中,一开始内存相关的信息是由struct meminfo来保存的,每个物理连续的内存区域被保存为meminfo中的一个元素,也就是说在Linux使用中,整块物理内存可能是不连续的,可能其中某一中间区域是被其他cpu给使用掉了。

         那么内存相关信息又是从哪里收集到的呢,系统在boot阶段,如u-boot会将当前物理内存linux可以使用的部分通过TAG的形式传递给linux内核。Qualcomm使用的是叫lk的boot,不管用的是哪种boot类型,使用TAG来传递参数的原理是一样的。

         下面我们看下Linux内核是如何收集内存信息的。 

Meminfo信息收集

系统启动有如下流程:

start_kernel -> setup_arch -> setup_machine_tags-> parse_tags -> parse_tag.

void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc){int i;/*将struct meminfo的信息都放入到了struct memblock中去,它会将保留的区域和空闲的区域用memory 和reserved变量分别保存。*/for (i = 0; i < mi->nr_banks; i++)memblock_add(mi->bank[i].start, mi->bank[i].size);/* kernel的text段需要作为保留部分。其实看system.map会发现_stext为symbol里的其实地址,而_end为结束地址。所以这块memblockRegion包括了virtual memory layout中的.init, .bss, .data, .text这几个区域。*/memblock_reserve(__pa(_stext), _end - _stext);/* 本平台的phys_initrd_start 这里为0.*/#ifdef CONFIG_BLK_DEV_INITRDif (phys_initrd_size &&    !memblock_is_region_memory(phys_initrd_start, phys_initrd_size)) {pr_err("INITRD: 0x%08lx+0x%08lx is not a memory region - disabling initrd\n",       phys_initrd_start, phys_initrd_size);phys_initrd_start = phys_initrd_size = 0;}if (phys_initrd_size &&    memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) {pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n",       phys_initrd_start, phys_initrd_size);phys_initrd_start = phys_initrd_size = 0;}if (phys_initrd_size) {memblock_reserve(phys_initrd_start, phys_initrd_size);/* Now convert initrd to virtual addresses */initrd_start = __phys_to_virt(phys_initrd_start);initrd_end = initrd_start + phys_initrd_size;}#endif/*这部分空间是给页表留着的。*/arm_mm_memblock_reserve();/*空函数。*/arm_dt_memblock_reserve();/*如果平台有定义这几的reserve函数,那么调用它。在前面的mempool文章中,我们已经分析过了,平台会预留一百多M的memory供系统ION分配。*//* reserve any platform specific memblock areas */if (mdesc->reserve)mdesc->reserve();/*关于cma,是系统为了reserved memory而出现的。它的优点是:当某些模块如audio/camera需要连续物理大块内存时,能申请到,而不用的时候,又可以被其他模块申请。避免了内存浪费。其原理利用的是内存数据迁移。不过本平台没用使用到。*//* * reserve memory for DMA contigouos allocations, * must come from DMA area inside low memory */dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit));arm_memblock_steal_permitted = false;memblock_allow_resize();memblock_dump_all();}

到这里,接下来的任务基本上就交给struct memblock完成了!


 

20130318








热点排行