2011-8-1 21:40:28

本文详细介绍了Linux内核中bootmem内存管理模块的核心函数实现,包括bootmem_bootmap_pages函数用于计算内存映射大小,以及link_bootmem函数用于将bootmem_data结构链接到bdata_list链表中。同时,还探讨了get_mapsize函数如何确定内存映射的大小,并解释了为何需要对内存映射大小进行对齐。
 


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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值