Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59651
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-12 21:41
个人简介

路人甲

文章分类

全部博文(5)

文章存档

2015年(5)

我的朋友

分类: LINUX

2015-08-18 17:39:26

memblockmem_maplinux内存管理中非常重要的两个全局变量。memblock保存着所有物理内存区域,包括可用的(memory)与保留的(reserved)mem_map是全局page数组,物理内存每个页对应一个page结构体,顺序存储在mem_map中。

1 memblock初始化

可用的物理内存区域由bootloader通过dts传递给kernel,节点名称是“memory”。这个节点的内容可以由用户指定,也有可能是用户只预留这个节点(通过skeleton.dtsi),然后bootloader修改其具体内容。kernel中解析memory节点,添加可用内存区域的流程如下:

start_kernel

  --> setup_arch
   
--> setup_machine_fdt
   
 --> of_scan_flat_dt(early_init_dt_scan_memory, NULL);
      
--> early_init_dt_add_memory_arch
        
--> memblock_add

从而把dts指定的所有内存区域添加在memblockmemory中。

随后kernel会把不能使用的保留内存区域添加到memblockreserved中,这些区域包括kernel自己使用的text,data区、页表内存,还有用户在dts中定义预留给其它硬件或内核特定模块使用的内存。它们通过以下代码来实现:

  1.     arm_mm_memblock_reserve();
  2.     arm_dt_memblock_reserve();

  3.     /* reserve any platform specific memblock areas */
  4.     if (mdesc->reserve)
  5.         mdesc->reserve();

  6.     /*
  7.      * reserve memory for DMA contigouos allocations,
  8.      * must come from DMA area inside low memory
  9.      */
  10.     dma_contiguous_reserve(min(arm_dma_limit, arm_lowmem_limit));

 memblock的物理内存区域决定了后续kernel内存管理的范围,首先在bootmem_init过程中,memblockmemory区域全部被添加到bootmem,然后遍历memblockreserved区域,同样在bootmem中标记。

 再到后续的buddy system初始化时,把bootmem可用的内存释放到buddy system中,从而完成了物理内存到buddy system的转化。

2 mem_map初始化

每个物理内存页都对应mem_map的一个元素,而且通过页号pfn能够迅速转化成物理地址,这就决定了mem_map的元素是按物理地址顺序排列的,而不是仅仅是可用的内存。如果可用内存区域之间间隔很大,会导致mem_map浪费很多内存来存储无效page,因此在mem_map完成初始化后,会把中间不用的元素占用的内存释放到buddy中,节省空间。于是mem_map可能是一个很大的数组,但中间有很多元素不能作为page访问,因为这些内存已经作为buddy的空间内存供他人使用了。

mem_map的初始化流程如下:

start_kernel

  --> setup_arch
   
--> paging_init

      --> bootmem_init

        --> arm_bootmem_free
           --> free_area_init_node
             
--> alloc_node_mem_map
             
--> free_area_init_core
               
--> memmap_init
 
其中alloc_node_mem_map使用的size是从第一个物理内存区域起始地址算起,到最后一个物理内存区域结束地址截止。然后kernel释放了这其中不使用内存:

start_kernel

  --> mm_init
     
--> mem_init
       
--> free_unused_memmap
  释放的目标是bootmem,这些内存随后会被buddy使用


阅读(5043) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~