首先,内存的大小在linux内核中的获知方法
1.通过bootloader 的 tag mem传入。
Setup.c 中的函数如下:
static int __init parse_tag_mem32(const struct tag *tag)
{
if (meminfo.nr_banks >= NR_BANKS) {
printk(KERN_WARNING
"Ignoring memory bank 0x%08x size %dKB/n",
tag->u.mem.start, tag->u.mem.size / 1024);
return -EINVAL;
}
arm_add_memory(tag->u.mem.start, tag->u.mem.size);
return 0;
}
__tagtable(ATAG_MEM, parse_tag_mem32);
其中最重要的函数为: arm_add_memory
这个函数向 meminfo数组中添加了一项关于 mem的描述
2.另外一个方法:通过内核启动参数mem=来传递
Setup.c 中的函数如下:
static void __init early_mem(char **p)
{
static int usermem __initdata = 0;
unsigned long size, start;
/*
* If the user specifies memory size, we
* blow away any automatically generated
* size.
*/
if (usermem == 0) {
usermem = 1;
meminfo.nr_banks = 0;
}
start = PHYS_OFFSET;
size = memparse(*p, p);
if (**p == '@')
start = memparse(*p + 1, p);
arm_add_memory(start, size);
}
__early_param("mem=", early_mem);
其中第二种方法具有高的优先级。
另外,还有一种修改memory属性的办法:
mdesc->fixup(mdesc, tags, &from, &meminfo);
这种方法依赖于特定的开发平台,在平台初始化的描述结构中定义。
最终,所以的关于memory的信息通过函数
paging_init(&meminfo, mdesc);
传递给 mem 初始化的部分。
第二,memory的初始化。
paging_init 的定义在 arch/arm/mm/mmu.c中。
在 paging_init 最重要的函数是:bootmem_init
该函数定义于:arch/arm/mm/init.c中。