linux arm内存学习(1)

linux 内存管理

1.高端内存的初始化,hash table size = 2^7 = 128
  page_address_init()   //high mem init
  void __init page_address_init(void)
  {
      int i;
  
      for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) {
          INIT_LIST_HEAD(&page_address_htable[i].lh);
          spin_lock_init(&page_address_htable[i].lock);
      }
  }
2.setup_arch
  a.init_mm的初始化
    代码段(text):存放可执行程序
    数据段(data):存放已经初始化的全局变量
    bss段:未初始化的全局变量
    堆:malloc申请的内存区域
    栈:局部非静态变量
    init_mm init进程的内存描述符.
  b.early_fixmap_init
    arm体系是两级页表,PGD=PMD,PTE
    PTRS_PER_PGD(2^7个) PGDIR_SHIFT(30) PGDIR_SIZE(2^30)
    PTRS_PER_PMD(2^9)     PMD_SHIFT(21)   PMD_SIZE(2^21)
    PTRS_PER_PTE(2^9)
    
    //
void __init early_fixmap_init(void)
{
    pgd_t *pgd;
    pud_t *pud;
    pmd_t *pmd;
    unsigned long addr = FIXADDR_START;
    //构建pgd,pmd,pte
    pgd = pgd_offset_k(addr);
    pgd_populate(&init_mm, pgd, bm_pud);
    pud = pud_offset(pgd, addr);
    pud_populate(&init_mm, pud, bm_pmd);
    pmd = pmd_offset(pud, addr);
    pmd_populate_kernel(&init_mm, pmd, bm_pte);

    /*
     * The boot-ioremap range spans multiple pmds, for which
     * we are not preparted:
     */
    BUILD_BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT)
             != (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT));

    if ((pmd != fixmap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)))
         || pmd != fixmap_pmd(fix_to_virt(FIX_BTMAP_END))) {
        WARN_ON(1);
        pr_warn("pmd %p != %p, %p\n",
            pmd, fixmap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)),
            fixmap_pmd(fix_to_virt(FIX_BTMAP_END)));
        pr_warn("fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
            fix_to_virt(FIX_BTMAP_BEGIN));
        pr_warn("fix_to_virt(FIX_BTMAP_END):   %08lx\n",
            fix_to_virt(FIX_BTMAP_END));

        pr_warn("FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
        pr_warn("FIX_BTMAP_BEGIN:     %d\n", FIX_BTMAP_BEGIN);
    }
}

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