【问题标题】:Developing a simple bootloader for an Embedded system为嵌入式系统开发简单的引导加载程序
【发布时间】:2014-08-22 23:41:24
【问题描述】:

我的任务是为嵌入式系统开发一个简单的引导加载程序。我们没有运行任何操作系统或 RTOS,所以我希望它非常简单。

此代码将存储在 ROM 中,处理器将在开机时开始执行。

我的目标是用 ASM 编写第一部分来处理以下操作:

  • 初始化处理器
  • 将 .data 段从 ROM 复制到 RAM
  • 清除 RAM 中的 .bss 段
  • 调用main

Main 显然是用 C 编写的,并执行更高级别的操作,如自检等......

现在我真的不知道如何将这两个程序合并为一个程序。我发现了一个糟糕的工具,它基本上使用 objcopy 从可执行文件中收集 .text 和 .data 部分,并在前面附加了一些 asm 但这似乎是一种非常丑陋的方法,我想知道是否有人能指出我的正确方向?

【问题讨论】:

    标签: embedded boot bootstrapping


    【解决方案1】:

    您可以(原则上)链接从汇编代码生成的目标文件,就像链接程序中的任何对象一样。

    问题是您需要对生成的可执行文件进行布局,以便您的启动代码位于开头。如果您使用 GNU ld,那么执行此操作的方法是 linker script

    原始设置(不检查语法错误):

    MEMORY
    {
        FLASH (RX) : ORIGIN = 0,          LENGTH = 256K
        RAM (RWX)  : ORIGIN = 0x40000000, LENGTH = 4M
    }
    
    SECTIONS
    {
       .bootloader 0 : AT(0) { bootloader.o(.text) } >FLASH AT>FLASH
       .text : { _stext = .; *(.text .text.* .rodata .rodata.*); _etext = . } >FLASH AT>FLASH
       .data : { _sdata = .; *(.data .data.*); _edata = .; _sdata_load = LOADADDR(.data) } >RAM AT>FLASH
       .bss (NOLOAD) { _sbss = .; *(.bss .bss.*); _ebss = . } >RAM
    }
    

    基本思路是让链接器大致了解内存映射,然后将输入文件中的节分配给最终程序中的节。

    链接器为每个输出部分保留“虚拟”和“加载”地址之间的区别,因此您可以告诉它生成一个二进制文件,其中代码为最终地址重新定位,但可执行文件中的布局是不同(这里,我告诉它将 .data 部分放在 RAM 中,但将其附加到闪存中的 .text 部分)。

    然后,您的引导加载程序可以使用提供的符号(_sdata_edata_sdata_load)在 RAM 和闪存中查找数据部分,并复制它。

    最后警告:如果您的程序使用静态构造函数,您还需要一个构造函数表,并且引导加载程序需要调用静态构造函数。

    【讨论】:

    • 非常感谢您的解释,非常有帮助。
    【解决方案2】:

    西蒙是正确的。有比这更简单的链接器脚本可以很好地用于您正在做的事情,但最重要的是它是获取对象并生成二进制文件的链接器,因此根据您使用的链接器,您必须了解您的方式可以告诉链接器做一些事情,然后让它去做。不幸的是,我认为这没有行业标准,您必须逐个链接器去链接器并理解它们。当然,使用 gnu ld 有许多非常复杂的链接器脚本,有些人活着就是为了解决链接器中的问题。

    【讨论】:

    • github.com/dwelch67/raspberrypi 我有一个 databss 或其他目录,其中包含一些通过 gnu ld 进行实验的文本,您可以尝试自己制作所需的链接器脚本,然后从那里获得变量您可以在引导程序中使用来复制 .data、零 .bss 以及您可能感兴趣的任何其他内容。
    • 非常感谢。我会看看。我家里也有 Raspberry pi,所以它会派上用场 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多