对于一个这样的参数
memsize=128M mem=151M mem=118M@768M
内核是怎么处理的呢?
- Arch/mips/kernel/setup.c:
- early_param("mem", early_parse_mem);
这里说明mem参数由early_parse_mem函数处理。该函数调用memparse处理每一个mem=size@addr格式的参数,表示从addr地址(物理地址)开始的size大小的内存区域。如果没有”@addr”则默认起始地址为零。
TODO:研究宏early_param的具体实现
对于每一个mem参数,都会调用add_memory_region(start, size, BOOT_MEM_RAM); 把指定的内存区域信息写到boot_mem_map数组中。该数组定义为:
- arch/mips/include/asm/bootinfo.h:
- /*
- * A memory map that's built upon what was determined
- * or specified on the command line.
- */
- struct boot_mem_map {
- int nr_map;
- struct boot_mem_map_entry {
- phys_t addr; /* start of memory segment */
- phys_t size; /* size of memory segment */
- long type; /* type of memory segment */
- } map[BOOT_MEM_MAP_MAX];
- };
整数nr_map表示有效boot_mem_map_entry的个数。紧跟着就是boot_mem_map_entry的数组。按照上述启动参数填充的值应该是:
- Nr_map =2;
- Map[0].addr=0
- Map[0].size=151M, map[0].type=RAM
- Map[1].addr=768M
- Map[1].size=118M, map[1].type=RAM
在处理命令行参数之前,还会自动检测物理内存大小,这是在arch_mem_init()函数中调用plat_mem_setup()函数实现的。Plat_mem_setup()函数是跟板子相关的,不同的板子需要实现自己的这个函数。但是如果用户在命令行中指定了mem参数,则自动检测的结果会被覆盖掉,正如early_parse_mem函数中的注释所说:
- /*
- * If a user specifies memory size, we
- * blow away any automatically generated
- * size.
- */
关于自动检测RAM,发现Plat_mem_setup()函数并没有真正的去检测DRAM,而是由用户用#define直接指定了一个值,或者从uboot环境变量中读取。而这个配置值并不等于真正的RAM大小。不知道能不能真正通过读硬件的方式自动获取RAM大小。而U-boot中RAM大小似乎也是用户配置的。
Memsize=128M的处理:
在内核代码中没有找到处理memsize参数的地方。
阅读(6824) | 评论(0) | 转发(1) |