博文

目前显示的是 七月, 2012的博文

Linux/ARM物理内存探测(2)-uBoot atags

图片
Linux/ARM 物理内存的探测不同于 Linux/X86, 在 Arm Linux 物理内存探测 (1) – CMDLINE 一文中有提及过。在本文中,重点谈下 Kernel 如何解析 uBoot 传过来的内存参数。 tag 数据结构是 uBoot 构建的,其数据结构分布图如下: 与内存有关的两个tag,一个是mem32,另外一个是cmd. 关于cmd这个tag,和build Kernel是的config_cmdline作用是一样的,但是具体选择哪一个还是两者都拷贝在一起,是根据.config的配置情况。对于cmdline的parse,在 Arm Linux  物理内存探测  (1) – CMDLINE  有所描述,这里不再重复。 在 Kernel 中处理 uBoot 传递的 tag 参数的过程如下   start_kernel->setup_arch->setup_machine_tags: 843 static struct machine_desc * __init setup_machine_tags(unsigned int nr)  844 {  845         struct tag *tags = (struct tag *)&init_tags;  846         struct machine_desc *mdesc = NULL, *p;  847         char *from = default_command_line;//Kernel 's data  848  849         init_tags.mem.start = PHYS_OFFSET;  850  851         /*  852          * locate machine in the list of supported machines.  853          */  854         for_each_machine_desc(p)  855                 if (nr == p->nr) {  856                         printk("M

Linux/ARM物理内存探测(1) - CMDLINE

ARM Linux中物理内存的探测并不像X86那样复杂。在X86中,物理内存的探测完全依赖于BIOS中的E820数据结构。对于ARM,物理内存的探测,其实谈不上“探测”,完全靠手工指定。指定的方法有两种: 第一种是通过 uBoot 向 Kernel 中传递参数,第二种是通过 Kernel 中的 CONFIG_CMDLINE 配置项。本文对 CMDLINE 中传递的的 mem 参数进行总结。 Linux Kernel 设置了各个可能参数的名字和处理函数。比如物理内存的参数名字是 ”mem” 和 ”early_mem” 。 arch/arm/kernel/setup.c : 567 early_param("mem", early_mem); 567 行的宏展开为: 251 #define early_param(“mem”, early_mem)                                    \ 252         __setup_param(“mem”, early_mem, early_mem, 1) 238 #define __setup_param(str, unique_id, fn, early)                        \ 239         static const char __setup_str_early_mem[] __initconst __aligned(1) = “mem”; \ 241         static struct obs_kernel_param __setup_early_mem  __used __section(.init.setup) __attribute__((aligned((sizeof(long)))))        \ 244                 = { __setup_str_ early_mem, early_mem, 1 } 定义了一个 obs_kernel_param 结构体,其结构体的定义为: 226 struct obs_kernel_param { 227         const char *str; 228