如何在C中编写一个简单的启动代码来初始化RISC-V处理器的堆栈指针? (必须编译thorugh risc-v编译器)
感谢
答案 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
,清除argc
和argv
(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
: