深入解读Linux内存管理系列(6)——地址空间划分

日期 内核版本 CPU架构 作者
2019.04.06 Linux-4.4 PowerPC LoneHugo

系列文章:https://blog.csdn.net/Vince_/article/details/89055979

虚拟地址空间划分,包括一致映射,临时映射,永久映射,vmalloc,ioremap区域等

内存布局

enum fixed_addresses {

FIX_HOLE,

/* reserve the top 128K for early debugging purposes */

FIX_EARLY_DEBUG_TOP = FIX_HOLE,

FIX_EARLY_DEBUG_BASE = FIX_EARLY_DEBUG_TOP+((128*1024)/PAGE_SIZE)-1,

#ifdef CONFIG_HIGHMEM

FIX_KMAP_BEGIN,        /* reserved pte's for temporary kernel mappings */

FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,

#endif

/* FIX_PCIE_MCFG, */

__end_of_fixed_addresses

};

 

#define __fix_to_virt(x)        (FIXADDR_TOP - ((x) << PAGE_SHIFT))

#define __virt_to_fix(x)        ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)

 

  1. PTE_SHIFT为9, (PAGE_SHIFT - PTE_T_LOG2)
  2. PGDIR_SHIFT为21(PAGE_SHIFT + PTE_SHIFT)即(12+10)
  3. PUD_SHIFT为21, PGDIR_SHIFT
  4. PMD_SHIFT为21, PUD_SHIFT
  5. PMD_SIZE为0x200000即(1UL << PMD_SHIFT)
  6. PMD_MASK为0xffc0000(~(PMD_SIZE-1))

 

区域信息:

  1. HOLE:早期debug使用的区域
    1. FIX_HOLE/FIX_EARLY_DEBUG_TOP --> FIX_EARLY_DEBUG_BASE(0 --> 31)
  2. FIX_KMAP:temporary kernel mappings
    1. FIX_KMAP_BEGIN --> FIX_KMAP_END/(FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1) (32 --> 47)
  3. 结尾:__end_of_fixed_addresses --> 48
  4. FIXADDR_TOP为-PAGE_SIZE,即0xfffff000
  5. __FIXADDR_SIZE为(__end_of_fixed_addresses << PAGE_SHIFT), 0x30000
  6. FIXADDR_START为(FIXADDR_TOP - __FIXADDR_SIZE), 0xfffcf000
  7. PKMAP_BASE为((FIXADDR_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK)
    1. (0xfffcf000-0x1000*(4+1)) & 0xfffc0000
    2. 0xfffca000 & 0xfffc0000
    3. 0xfffc0000
  8. PKMAP_ORDER        PTE_SHIFT为2,LAST_PKMAP为4;
  9. FIX_MAP:
    1. paging_init中对于PPC32将FIX_HOLE到__end_of_fixed_addresses-1的所有页以fix方式映射
    2. 按照__fix_to_virt计算其区间为0xfffff000-0x00000000 --> 0xfffff000-0x2f000
    3. 即为0xfffd0000 --> 0xfffff000
  10. __builtin_ffs(x) - 1为x最后一个1所在的位置,比如0x2,为1
  11. Sfddfs
  12. Sdf

你可能感兴趣的:(Linux内存管理)