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

被折叠的 条评论
为什么被折叠?



