关于 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中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值