setup_memory

来源:互联网 发布:淘宝改库存有影响吗 编辑:程序博客网 时间:2024/06/12 21:28

建立内存bitmap并在bitmap中标记内存使用状态,标记保留空间,未使用为0,保留为1。

内存bitmap的启始地址为contig_page_data.bdata->node_bootmem_map,实际上就是跟在pg0后面。大小尺寸为(max_low_pfn+7)/8,就是每一bit位代表一个页面是否被占用。

见文件arch/i386/kernel/setup.c

#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)

min_low_pfn = PFN_UP(init_pg_tables_end);在这里init_pg_tables_end保存的是pg0的物理地址+0x1000,即pg0的表尾,如果为0x103000,得到min_low_pfn=256+3。

find_max_pfn();从e820里获取最大页面数max_pfn

max_low_pfn = find_max_low_pfn(); 获取最大的低端内存页数,max_low_pfn最大值可为MAXMEM_PFN,即内核可掌握的1G内存减去内核为vmalloc保留的128M,即896M内存所对应的页面数。高端内存页面数highmem_pages=max_pfn-MAXMEM_PFN。

setup_bootmem_allocator();初始化max_low_pfn的低端内存映射图bitmap,并对系统启动时使用一些特殊占用内存进行保留设置。

  • bootmap_size = init_bootmem(min_low_pfn, max_low_pfn);
    • init_bootmem_core(NODE_DATA(0), start, 0, pages);在这里NODE_DATA(0)是全局变量contig_page_data的地址,start是min_low_pfn,pages是max_low_pfn
      • bdata->node_bootmem_map = phys_to_virt(PFN_PHYS(mapstart));mapstart=start=min_low_pfn,获得min_low_pfn指向的虚拟地址

      • bdata->node_boot_start = PFN_PHYS(start);设置了start=0,即物理地址0x0000

      • bdata->node_low_pfn = end;end=max_low_pfn,低端内存页面数目

    • link_bootmem(bdata); 将(&contig_page_data)->bdata插入到全局变量bdata_list尾部

    • mapsize = get_mapsize(bdata);
      • mapsize = ((end - start) + 7) / 8;end=max_low_pfn,start=PFN_DOWN(bdata->node_boot_start)=0,即低端页面表所占用尺寸

    • memset(bdata->node_bootmem_map, 0xff, mapsize);设置min_low_pfn后内存供低端页面表占用的空间为0xFF

    register_bootmem_low_pages(max_low_pfn);根据e820表将未使用的内存在bdata->node_bootmem_map中对应的位置清0

    • free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
      • free_bootmem_core(NODE_DATA(0)->bdata, addr, size);通过test_and_clear_bit设置bdata->node_bootmem_map中对应页面位置

  • reserve_bootmem(pa_symbol(_text), (PFN_PHYS(min_low_pfn) + bootmap_size + PAGE_SIZE-1) - pa_symbol(_text));启始地址是内核启始指针,尺寸为从内核开始到内存映射表结束,保留从内核开始到内存映射表结束的内存
    • reserve_bootmem_core(NODE_DATA(0)->bdata, addr, size);通过使用test_and_set_bit,将保留空间设置为1

  • reserve_bootmem(0, PAGE_SIZE);保留启始4K内存
  • reserve_ebda_region();保留EBDA开始4K内存
原创粉丝点击