1. 程式人生 > >[問答] 在arm-linux上如何修改系統記憶體的大小?

[問答] 在arm-linux上如何修改系統記憶體的大小?

http://bbs.elecfans.com/jishu_1603506_1_1.html
demo板上預設的系統記憶體是512M,我修改了一下boot啟動引數為256M後,發現記憶體啟動過程中掛掉了
而且發現dts檔案中的

memory [     
    device_type = "memory";
    reg = <0x80000000 0x8000000>;
]

不起作用,註釋掉之後不影響啟動,清TI的工程師解答一下吧 多謝;

修改boot引數過應該程是沒有問題的,

setenv bootargs 'console=ttyS0,115200n8 mem=256M rootwait=1 rootfstype=ubifs root=ubi0:rootfs rootflags=sync rw ubi.mtd=2,2048'

您好:

修改Memory大小不單單需要修改Linux Kernel,還需要修改U-Boot中的相應程式碼,我以Arago網站上最新版本(DEV.SC-MCSDK-02.00.01.15P7)的TCI6614的U-Boot中的程式碼為例:
您也許從您之前帖子中的列印資訊中注意到,一開始通過TFTP載入dtb檔案的大小與U-Boot列印的最終loading的Device Tree檔案大小不一致:

Filename ‘tci6614-evm.dtb’.

Load address: 0x80000200
Loading: ## done
Bytes transferred = 15255 (3b97 hex)
… … …
OK
Loading Device Tree to 9febe000, end 9fec4b96 … OK // 0x9FEC_4B96 - 0x9FEB_E000 = 0x6B96

實際上U-Boot會根據實際硬體檢測和配置的資訊對已編譯好的DTB檔案進行再一次的更新以及封裝,所以傳入Linux Kernel裡面的檔案大小會有所改變。

做這些修改的程式碼在$[U_BOOT_CODE_ROOT]/arch/arm/lib/bootm.c中的函式"bootm_linux_fdt",這個函式會在引導Kernel之前對已有的DTB檔案進行解析和更新再封裝(前提是在使用Device Tree的巨集使能的情況下,使用Tags的時候不會執行)。
在這個函式裡會呼叫位於同一檔案中的函式“fixup_memory_node”對DTB中的“Memory”節點進行更新:

static int fixup_memory_node(void *blob)
 [  
    bd_t *bd = gd->bd;  
    int bank;  
    u64 start[CONFIG_NR_DRAM_BANKS];  
    u64 size[CONFIG_NR_DRAM_BANKS];
    for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++)
    [   
        start[bank] = bd->bi_dram[bank].start;   
        size[bank] = bd->bi_dram[bank].size;  
    ]
    return fdt_fixup_memory_banks(blob, start, size, CONFIG_NR_DRAM_BANKS);
]

位於$[U_BOOT_CODE_ROOT]/common/fdt_support.c中的函式"fdt_fixup_memory_banks"會將“ start[bank]”和“size[bank]”帶入DTB中進行更新“memory”節點資訊;其中:
“ start[bank]”和“size[bank]”的值分別是標頭檔案$[U_BOOT_CODE_ROOT]/include/configs/tci6614_evm.h中定義的(此處略過賦值過程):

/* Memory Info */
#define PHYS_SDRAM_1   0x80000000
#define PHYS_SDRAM_1_SIZE  (512 << 20) /* 512 MB, 0x20000000*/

所以,單純修改DTS之後重新編譯DTB檔案的話,DTB裡面的“memory”節點內容會被U-Boot中的配置引數所覆蓋,這也就是為什麼您總是看到列印 - 80000000 , 20000000的原因。
謝謝你的詳細回答,我還想知道,如果我要修改arm的系統記憶體從【80000000,a0000000】改為[a0000000,c0000000],請問如何修改?

我把boot中的配置修改為

#define PHYS_SDRAM_1_SIZE        (512 << 20)    /* 512 MB */
#define PHYS_SDRAM_1            (0xc0000000-PHYS_SDRAM_1_SIZE)

但是沒有找到在哪兒修改核心入口地址的地方,所以核心跳轉不了
TCI6614 EVM # tftp 0xa0000200 tci6614-evm.dtb
Using TCI6614-EMAC device
TFTP from server 192.168.1.189; our IP address is 192.168.1.222
Filename ‘tci6614-evm.dtb’.
Load address: 0xa0000200
Loading: ##
done
Bytes transferred = 15255 (3b97 hex)
TCI6614 EVM # tftp 0xa8000000 uImage
Using TCI6614-EMAC device
TFTP from server 192.168.1.189; our IP address is 192.168.1.222
Filename ‘uImage’.
Load address: 0xa8000000
Loading: #################################################################
#################################################################
#################################################################
#########
done
Bytes transferred = 2983256 (2d8558 hex)
TCI6614 EVM # bootm 0xa8000000 - 0xa0000200

Booting kernel from Legacy Image at a8000000 …

Image Name: Linux-3.3.0
Created: 2013-09-17 2:42:59 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2983192 Bytes = 2.8 MiB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum … OK

Flattened Device Tree blob at a0000200

Booting using the fdt blob at 0xa0000200
Loading Kernel Image … OK
OK
Loading Device Tree to afb3f000, end afb45b96 … OK

Starting kernel …
您好:
請您參考我們的Wiki Page,裡面有一些Linux和U-Boot常用修改的一些方法與步驟,對於您這個問題,請見連結如下:
http://processors.wiki.ti.com/index.php/MCSDK_UG_Chapter_Exploring#How_to_run_Linux_kernel_from_a_different_physical_address_than_default_.280x80000000.29.C2.A0.3F