【问题标题】:how exactly do bare metal C applications start?裸机 C 应用程序究竟是如何启动的?
【发布时间】:2017-08-28 09:24:48
【问题描述】:

我试图了解裸机 C 应用程序是如何工作的。我编写了自己的启动汇编代码,调用__libc_init_array,我看到它遍历preinit_array 部分并调用里面的所有函数。据我了解,gcc 为一些需要在 main 之前运行的自己的初始化例程添加了该部分,但随后在 .init 部分中出现了 _init() 函数。

gcc 会生成那个函数吗?它来自libc吗?还是我必须自己提供一份?有什么好的资源来学习这些东西?

【问题讨论】:

  • 好的资源包括你的平台文档和objdump
  • 符号与平台有什么关系? init_() 是由 gcc 在一个平台上生成而不是在另一个平台上生成的吗?:)
  • 所有过程都是特定于平台的。例如,在 AVR 上,init 代码必须包含一些填充以跳过中断向量表。然后内容本身在这里设置 C 程序运行的环境:初始化固定寄存器,设置堆栈指针,也许安装一些陷阱处理程序……同样,所有这些都是特定于平台的。
  • 是的,但谁生成_init?我要手动写吗?海合会?它是从某个库链接的吗?
  • __libc_init_array 只是一些奇怪的 gcc 特定的东西,它与处理器启动代码本身无关。较小的嵌入式应用程序根本不使用标准库是很常见的。

标签: c gcc arm startup libc


【解决方案1】:

符号与平台有什么关系?是由 init_() 生成的 gcc 在一个平台上而不是在另一个平台上?

是的,启动和结语例程留给实现,实际上gcc 不会生成它。

libc 提供了这些符号 - https://github.com/bminor/newlib/blob/e0f24404b3fcfa2c332ae14c3934546c91be3f42/newlib/libc/misc/init.c

根据您的目标硬件,初始化可能会以完全不同的方式完成。

STM32Fxxx 启动示例。

    .section    .text.Reset_Handler
    .weak   Reset_Handler
    .type   Reset_Handler, %function
Reset_Handler:
  ldr   sp, =_estack    /* Atollic update: set stack pointer */

/* Copy the data segment initializers from flash to SRAM */
  movs  r1, #0
  b LoopCopyDataInit

CopyDataInit:
    ldr r3, =_sidata
    ldr r3, [r3, r1]
    str r3, [r0, r1]
    adds    r1, r1, #4

LoopCopyDataInit:
    ldr r0, =_sdata
    ldr r3, =_edata
    adds    r2, r0, r1
    cmp r2, r3
    bcc CopyDataInit
    ldr r2, =_sbss
    b   LoopFillZerobss
/* Zero fill the bss segment. */
FillZerobss:
    movs    r3, #0
    str r3, [r2], #4

LoopFillZerobss:
    ldr r3, = _ebss
    cmp r2, r3
    bcc FillZerobss

/* Call the clock system intitialization function.*/
    bl  SystemInit
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
    bl  main

正如您在此实现中看到的那样,调用了两个函数 - 一个 SystemInit 用于非常低级别的硬件初始化,__libc_init_array

它是 newlib 库的内部初始化(现在最常用于裸机项目)

问题是如果您决定不使用标准库并且不想链接任何标准库。一些takechains只提供return语句的弱函数,有些则没有。如果您遇到链接器问题,只需在启动文件中注释此调用或自己提供一个空函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多