歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核啟動參數“mem=xxx”的處理

對於一個這樣的參數
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參數的地方。
Copyright © Linux教程網 All Rights Reserved