关于ARM Linux的meminfo的设定
这来自于在
http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=638456&page=0&view=collapsed&sb=5&o=all&fpart=all
上的帖子,我也顺着看了一下。
问题:
经过定义之后
static struct meminfo meminfo __initdata = { 0, };
我们可以看到初始化为0,然后没进行什么赋值操作,到调用
paging_init(&meminfo, mdesc);
的时候,meminfo里面已经含有内存信息,如何赋值的?
一种意见是:
static struct meminfo meminfo __initdata = { 0, };
2.4 & 2.6 这个定义都一样进行初始化,我认为关键是 __initdata 的用法了
static struct init_tags {
struct tag_header hdr1;
struct tag_core core;
struct tag_header hdr2;
struct tag_mem32 mem;
struct tag_header hdr3;
} init_tags __initdata = {
{ tag_size(tag_core), ATAG_CORE },
{ 1, PAGE_SIZE, 0xff },
{ tag_size(tag_mem32), ATAG_MEM },
{ MEM_SIZE, PHYS_OFFSET },
{ 0, ATAG_NONE }
};
所以这儿已经指定了缺省的变量值了,这里面就有MEM_SIZE=16M
只是这个变量同meminfo变量是怎么关联起来的,这种用法还比较少见
望哪位高兄来高见一翻!
这里仍然没有根本解决,但是点到了默认初始化的地方。
另外一种说法比较详细:
三种方式:
1.使用内核源代码中的定义
通常ARM嵌入式开发板的系统物理内存仅有一块,系统物理内存的指定通常通过三个宏:
PHYS_OFFSET:系统内存的物理起始地址,板级相关,在include/asm-arm/arch-xxx/memory.h中
PAGE_OFFSET:系统内存的虚拟起始地址,体系结构相关,为0xC0000000,在include/asm-arm/memory.h中
MEM_SIZE:系统内存大小,如果板级(include/asm-arm/arch-xxx/xxx.h)没有指定,则使用体系结构的缺省值16M(arch/arm/kernel/setup.c)
在没有内存命令从内核命令行(cmdline)传入的情况下 ,setup_arch()函数 (arch/arm/kernel/setup.c文件中)会使用PHYS_OFFSET和MEM_SIZE指定为系统内存并且映射到PAGE_OFFSET。
2.通过fixup函数设置
也可通过fixup_xxx()函数(arch/arm/mach-xxx/arch.c)设置内存的起始地址和大小,映射到PAGE_OFFSET,此项设置会覆盖(1)的设置
3.通过内核命令行传入
如果内核命令行中有系统内存相关的命令(mem=XXXM[@YYY])则会覆盖掉(1),(2)中所介绍的映射而将XXX作为内存大小,YYY作为内存物理起始地址(如果有)映射到PAGE_OFFSET
以上是2.4内核,2.6内核基本差不多 。
并且指定了查看的路径:
大概如下:
setup_arch()->parse_tags()->parse_tag()->parse_tag_mem32()->arm_add_memory()
经过查找,的确如此。

0 Comments:
Post a Comment
<< Home