用于堆栈指针初始化的RISC-V启动代码

时间:2018-05-07 12:59:21

标签: riscv

如何在C中编写一个简单的启动代码来初始化RISC-V处理器的堆栈指针? (必须编译thorugh risc-v编译器)

感谢

2 个答案:

答案 0 :(得分:3)

设置堆栈的最简单的起始代码类似于

_start:
    /* Clear the link register, so debuggers know to terminate their
     * backtrace. */
    cfi_undefined (ra)

    /* Setup the global pointer, which the ABI assumes points to the
     * __global_pointer$ symbol. */
    .option push
    .option norelax
    la gp, __global_pointer$
    .option pop

    /* Setup the stack pointer.  This symbol will only be looked at
     * here, so you can pick any name you want. */
    la sp, __stack_pointer$

    /* Call main, leaving the arguments undefined. */
    call main

    /* Spin after main() returns. */
1:
    j 1b

您可能还想做一些事情,比如致电__libc_init_array并使用__libc_fini_array注册atexit,清除argcargv(a0和a1到主要版本) ,重新定位数据部分,并将BSS归零,具体取决于您想要支持多少C ABI。

SiFive的Freedom E SDK包含我们的完整启动代码:https://raw.githubusercontent.com/sifive/freedom-e-sdk/master/bsp/env/start.S,以及我们某些平台的相关链接描述文件。您还可以在newlib(https://github.com/riscv/riscv-newlib/blob/riscv-newlib-2.5.0/libgloss/riscv/crt0.S)和glibc(https://github.com/riscv/riscv-glibc/blob/riscv-glibc-2.26/sysdeps/riscv/start.S)中看到更复杂的内容,尽管这些都假设堆栈已经由执行环境初始化。

答案 1 :(得分:1)

SCR1是一个开源的RISC-V兼容核心 (https://github.com/syntacore/scr1)使用SDK(https://github.com/syntacore/scr1-sdk,请使用子模块进行克隆,递归)。

您可以在SDK中找到示例应用程序。

启动代码位于引导加载程序(https://github.com/syntacore/sc-bl)。

请参阅src / startup.S中的标签_crt_start

  • init CSRs
  • clear .bss
  • init stack
  • init TLS
  • 引导
  • call main