3

我正在编写一个裸机 ARM 引导加载程序,并尝试使用一些内部 SRAM 作为暂存器与应用程序代码进行通信。对于我的需要,我不需要初始化或归零内存。使用这个脚本,我可以把我想要的变量放在内存中就好了。

/**
 * Linker script for secondary bootloader.
 *
 * Allocatest the first 1Mb of DRAM for its use.
 * Scratchpad in internal SRAM.
 */

MEMORY
{
    SRAM : o = 0x402F0400, l = 0x0000FC00  /* 63kB available internal SRAM */
    DDR0 : o = 0x80000000, l = 1M          /* 1Mb external DDR Bank 0 */
}

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)

SECTIONS
{
    .startcode :
    {
        __AppBase = .;
        . = ALIGN(4);
        *init.o      (.text)
    } >DDR0

    .text :
    {
        . = ALIGN(4);
        *(.text*)
        *(.rodata*)
    } >DDR0

    .data :
    {
        . = ALIGN(4);
        *(.data*)
    } >DDR0

    .bss :
    {
        . = ALIGN(4);
        _bss_start = .;
        *(.bss*)
        *(COMMON)
        _bss_end = .;
    } >DDR0

    .stack :
    {
        . = ALIGN(4);
        __StackLimit = . ;
        *(.stack*)
        . = __AppBase + 1M;
        __StackTop = .;
    } >DDR0
    _stack = __StackTop;

    .internal_ram :
    {
        . = ALIGN(4);
        *(.internal_ram*)
    } >SRAM
}

当使用 objcopy 创建原始二进制文件时,我得到了巨大的文件。我假设这是因为原始二进制文件的第一个字节实际上是内部存储器,在 .text 部分的开头有几兆字节的填充。Objdump -h 显示 internal_ram 部分被标记有 CONTENTS、LOAD 和 DATA 标志,即使放置在那里的变量没有初始化。

我可以使用 --remove-section=.internal_ram 在 objcopy 中清理它,但似乎应该有一种方法可以让链接器识别出数据未初始化。

有没有办法适当地标记该部分?

4

1 回答 1

4

正确的部分声明是:

.internal_ram (NOLOAD) :
{
    . = ALIGN(4);
    *(.internal_ram*)
} >SRAM

NOLOAD 部分属性已记录在案,但说明的是程序加载器在加载时处理该部分。起初,这似乎不适用于裸机图像,但为此目的,objcopy 就像程序加载器一样,遵循目标文件中的标志设置,从原始图像中省略部分。

于 2014-02-22T22:12:59.533 回答