Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188933
  • 博文数量: 20
  • 博客积分: 543
  • 博客等级: 下士
  • 技术积分: 411
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-06 20:38
文章存档

2012年(12)

2009年(8)

分类: 嵌入式

2012-03-10 00:00:00

             
对于一个这样的参数
memsize=128M mem=151M mem=118M@768M
内核是怎么处理的呢?

  1. Arch/mips/kernel/setup.c:
  2. 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数组中。该数组定义为:

  1. arch/mips/include/asm/bootinfo.h:
  2. /*
  3.  * A memory map that's built upon what was determined
  4.  * or specified on the command line.
  5.  */
  6. struct boot_mem_map {
  7.     int nr_map;
  8.     struct boot_mem_map_entry {
  9.         phys_t addr; /* start of memory segment */
  10.         phys_t size; /* size of memory segment */
  11.         long type; /* type of memory segment */
  12.     } map[BOOT_MEM_MAP_MAX];
  13. };
整数nr_map表示有效boot_mem_map_entry的个数。紧跟着就是boot_mem_map_entry的数组。按照上述启动参数填充的值应该是:

  1. Nr_map =2;
  2. Map[0].addr=0
  3. Map[0].size=151M, map[0].type=RAM
  4. Map[1].addr=768M
  5. Map[1].size=118M, map[1].type=RAM
在处理命令行参数之前,还会自动检测物理内存大小,这是在arch_mem_init()函数中调用plat_mem_setup()函数实现的。Plat_mem_setup()函数是跟板子相关的,不同的板子需要实现自己的这个函数。但是如果用户在命令行中指定了mem参数,则自动检测的结果会被覆盖掉,正如early_parse_mem函数中的注释所说:

  1. /*
  2.      * If a user specifies memory size, we
  3.      * blow away any automatically generated
  4.      * size.
  5.      */
关于自动检测RAM,发现Plat_mem_setup()函数并没有真正的去检测DRAM,而是由用户用#define直接指定了一个值,或者从uboot环境变量中读取。而这个配置值并不等于真正的RAM大小。不知道能不能真正通过读硬件的方式自动获取RAM大小。而U-boot中RAM大小似乎也是用户配置的。

Memsize=128M
的处理:
在内核代码中没有找到处理
memsize参数的地方。
阅读(6824) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~