引导阶段中数据从闪存到RAM的重定位

问题描述 投票:0回答:1

我目前正在尝试解决在引导阶段需要将数据从闪存移动到RAM的问题。目前,仅使用基于开源PULPissimo的微控制器架构对所有内容进行仿真。对于仿真,我使用Mentor Graphics的QuestaSim。工具链是GNU。

不幸的是,在引导阶段如何重定位数据我几乎没有零经验,因此我阅读了有关该主题的一些文章和教程,但是我仍然对很多事情感到困惑。

情况如下:我将启动模式设置为从闪存启动,在这种情况下,这意味着代码已经驻留在闪存内部。该代码只是一个简单的问候世界或其他任何程序。当我模拟时,所有内容都会编译并加载模块。引导阶段之后,将显示输出“ hello world”并完成仿真。这意味着一切都按预期进行,这显然是一个好兆头和一个良好的起点。

旁注:据我所知,PULPissimo架构目前不支持从闪存直接启动,因此必须将闪存中的数据移至RAM(他们称为L2)并执行。

据我了解,引导过程涉及很多事情。如果下一段有任何错误,请纠正我:

第一:将要执行的代码。它是用C编写的,并且必须翻译成架构可以理解的语言。此操作应自动完成,并位于闪存的预引导阶段。考虑到实际上如上所述正在执行代码,这里没有太多混乱。

第二:引导程序。这也是用C语言编写的。它也经过翻译,以后将被刻录到ROM中,因此更改它没有多大意义。它加载引导所需的数据。如果您要从Flash或JTAG引导,它也可以区分开。

第三:主启动文件crt0.S。这是令我困惑的事情之一,尤其是它的确切功能以及引导加载程序和主启动文件之间的区别。维基百科(是的,我知道...)将其定义为:“ crt0(也称为c0)是链接到C程序的一组执行启动例程,该例程在调用程序的主要功能之前执行所需的任何初始化工作。”那么这是否意味着它与引导阶段无关,而是“初始化”和/或仅加载我要执行的代码?

第四:链接描述文件link.ld。即使这是我最常阅读的部分,仍然有很多问题。据我了解,链接描述文件包含有关在何处重定位数据的信息。要重定位的数据是我要执行的代码的数据(?)。它由解释的不同部分组成here

.text program code;
.rodata read-only data;
.data read-write initialized data;
.bss read-write zero initialized data. 

有时候,我看到的不只是这些部分,而不仅仅是文本,rodata,数据,bss。但是链接描述文件如何知道“文本”是什么,“数据”是什么,等等?

我知道很多人对很多人来说可能是非常基本的东西,但是我真的很困惑。

我要完成的工作是在引导阶段将数据从闪存重定位到RAM。不仅我要执行的代码,而且还位于闪存中的更多数据。考虑以下简单情况:我想运行一个hello world C程序。我想从闪存启动。到目前为止,没有什么特别的,一切都很好。现在,在代码数据之后,我还将更多数据加载到闪存中,比如说256字节的A(十六进制),因此我可以通过查找AAAAAAAA节来检查QuestaSim中的内存。我还想说一下我希望在引导阶段将数据加载到何处,例如0x1C002000。我尝试使用crt0.S和linker.ld文件,但没有成功。它唯一有效的时间是我修改了bootloader.c文件时,但我必须假定它已经刻录到ROM中,并且我无法对其进行任何修改。老实说,我什至不确定在没有对bootloader进行任何更改的情况下,我尝试做的事情是否可能。

谢谢您的时间。

我目前正在尝试解决在引导阶段需要将数据从闪存移动到RAM的问题。现在,仅使用...

c flash linker boot riscv
1个回答
1
投票

这里有很多要问的问题。我要回答部分问题。你问:

© www.soinside.com 2019 - 2024. All rights reserved.