linux ram大小 arm,在arm-linux上如何修改系统内存的大小?

您好:

修改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;

}

returnfdt_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的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值