[问答] 在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

Linux系统中安装arm-linux-gcc编译器通常是为了编译针对ARM架构的程序。以下是安装arm-linux-gcc编译器的一般步骤: 1. **使用发行版的包管理器安装**: 大多数Linux发行版都提供了arm-linux-gcc的软件包。例如,在基于Debian的系统(如Ubuntu)中,你可以使用以下命令安装: ```bash sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabi ``` 或者对于32位ARM架构: ```bash sudo apt-get install gcc-arm-linux-gnueabihf ``` 在基于Red Hat的系统(如Fedora或CentOS)中,你可能需要使用`yum`或`dnf`命令,具体命令取决于你的系统版本。 2. **从源代码编译**: 如果你的Linux系统中没有预编译的包或者你需要特定版本的编译器,你可以从源代码编译arm-linux-gcc。这通常包括下载工具链的源代码,然后使用`make`命令编译和安装。 ```bash wget http://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz tar -xf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz sudo mkdir -p /opt/cross sudo mv gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu /opt/cross sudo ln -s /opt/cross/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/* /usr/bin/ ``` 请注意,上述链接和版本仅为示例,你需要访问[GNU Arm Embedded Toolchain](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)下载最新或你需要的版本。 3. **环境变量设置**: 安装完成后,可能需要设置环境变量,比如`PATH`,以便在任何目录下使用arm-linux-gcc。可以通过修改`~/.bashrc`或`~/.profile`文件来实现,添加如下行: ```bash export PATH=/opt/cross/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin:$PATH ``` 请根据实际安装路径修改上述路径。 完成上述步骤后,你可以通过运行`arm-linux-gcc -v`来验证编译器是否正确安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值