`
gaofen100
  • 浏览: 1190056 次
文章分类
社区版块
存档分类
最新评论

关于 linux 内存

 
阅读更多

首先,内存的大小在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中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics