【问题标题】:C .data initialization and .bss clearingC .data 初始化和 .bss 清除
【发布时间】:2019-03-24 05:56:28
【问题描述】:

小背景:

我正在开发一个 RISC-V 处理器,我为个人布置了内存(它在 FPGA 上),我所做的是将程序内存和常量数据放入板载闪存中。我编写了自己的自定义_start 例程,它应该将.data 初始内容从闪存复制到RAM 并清除.bss 部分。

我有什么方法可以验证我的_start 例程是否有效(我的灯在闪烁,但我对这个测试没有信心)?

【问题讨论】:

  • 你是否有能力检查内存,例如使用调试器或 JTAG?
  • @hellow 不,我没有......我一直在研究这个......但假设我做了(我愿意升级我的工具集)
  • 在你最喜欢的串行总线上简单地喷出整个.data
  • @Lundin 本质上这就是我的测试程序目前所做的(它会在一堆 LED 上闪烁内容)
  • 如果您对 fpga 开发很认真,您应该研究 Intel Quartus(前 Altera)或 Xilinx ISE 等工具,它们具有系统内内存检查器,允许您检查和修改您配置的内存块.

标签: c startup boot


【解决方案1】:

你应该查看 bootrom 并确保它开始读取内存,然后在 crt 文件中(如果你需要它们)你需要指定一个链接到启动程序的过程,例如,到 _start 或_主要的。 Аlso 你需要在链接描述文件 link.ld 中构建部分的结构,如下所示:

OUTPUT_ARCH( "riscv" )
ENTRY(_start)

SECTIONS
{
  . = 0x80000000;
  .text.init : { *(.text.init) }
  . = ALIGN(0x1000);
  .tohost : { *(.tohost) }
  . = ALIGN(0x1000);
  .text : { *(.text) }
  . = ALIGN(0x1000);
  .data : { *(.data) }
  .bss : { *(.bss) }
  _end = .;
}

然后一起编译:riscv64-unknown-elf-gcc hello.c crt.S -Tlink.ld -o hello.riscv。也只能使用 bootrom,例如:

#define RAM_BASE 0x80000000

.section .text.start, "ax", @progbits
.globl _start
_start:
  j _hang

.section .text.hang, "ax", @progbits
.globl _hang
_hang:
  li s0, RAM_BASE
  csrr a0, mhartid
  la a1, _dtb
  jr s0

.section .rodata.dtb, "a", @progbits
.globl _dtb
.align 5, 0
_dtb:
.ascii "DTB goes here"

并使用简单的汇编程序,没有任何 _start 或 _main 或其他东西,只是旧的好 asm 代码。

无论如何,您可以查看示例: https://github.com/riscv/riscv-tests

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2011-05-14
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多