2011-8-1 21:40:28

来源:互联网 发布:蓝格美容院软件 编辑:程序博客网 时间:2024/04/30 04:19
 


2011-8-1 21:40:28


unsigned long __init bootmem_bootmap_pages(unsigned long pages)
{
 unsigned long mapsize;

 mapsize = (pages+7)/8;
 mapsize = (mapsize + ~PAGE_MASK) & PAGE_MASK;
 mapsize >>= PAGE_SHIFT;

 return mapsize;
}


typedef struct bootmem_data {
 unsigned long node_boot_start;
 unsigned long node_low_pfn;
 void *node_bootmem_map;
 unsigned long last_offset;
 unsigned long last_pos;
 unsigned long last_success; /* Previous allocation point.  To speed
      * up searching */
 struct list_head list;
} bootmem_data_t;

 

static void __init link_bootmem(bootmem_data_t *bdata)
{
 bootmem_data_t *ent;

 if (list_empty(&bdata_list)) {
  list_add(&bdata->list, &bdata_list);
  return;
 }
 /* insert in order */
 list_for_each_entry(ent, &bdata_list, list) {
  if (bdata->node_boot_start < ent->node_boot_start) {
   list_add_tail(&bdata->list, &ent->list);
   return;
  }
 }
 list_add_tail(&bdata->list, &bdata_list);
}

按起始地址从小到大的顺序进行插入到bdata_list中


static unsigned long __init get_mapsize(bootmem_data_t *bdata)
{
 unsigned long mapsize;
 unsigned long start = PFN_DOWN(bdata->node_boot_start);
 unsigned long end = bdata->node_low_pfn;

 mapsize = ((end - start) + 7) / 8;
 return ALIGN(mapsize, sizeof(long));
}

为什么要4取整

#define PHYS_OFFSET UL(0xb0000000)

物理DRAM的偏移

#define PAGE_OFFSET  UL(0xc0000000)

#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET)

 

原创粉丝点击