我真的很困惑分散文件和在RAM中执行所需的步骤(对于引导加载程序)。
根据我的理解,startup.S文件和sysinit需要从Flash执行,在此期间,向量表需要在跳转到main之前复制到RAM吗?
我也不太了解散点文件的用途,如果我在跳转之前将向量和代码复制到ram,为什么我甚至需要它。
这是我错误的分散文件:
LR_IROM1 0x14000000 0x00400000 { ; load region size_region
ER_IROM1 0x14000000 0x00400000 { ; load address = execution address
startup.o (RESET, +FIRST)
* (InRoot$$Sections)
}
RW_IRAM1 0x10000000 0x00020000 { ; RW data
*.o
}
RW_IRAM2 0x20000000 0x00010000 {
* (+RO,+RW,+ZI)
}
}
答案 0 :(得分:1)
基于引导加载程序ram的链接描述文件的一种解决方案。假设您正在使用gnu链接器。这样做的方法不止一种。
MEMORY
{
ram : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > ram
.rodata : { *(.rodata*) } > ram
.bss : { *(.bss*) } > ram
.data : { *(.data*) } > ram
}
如果您的代码需要将.bss归零,您可以向链接描述文件添加更多代码,并为引导程序添加更多代码,但如果您使用上述内容并且保证至少有一个字节,gnu将为您执行此操作。某处的数据(当对二进制文件执行objcopy时,它将使用零填充.bss以获取正确相对位置的.data项目)。你选择如何解决这个问题。如果你不需要.bss归零,那么交换.data和.bss会使二进制文件更小。你要么在非常有效的循环中复制零,要么在链接器脚本中处理对齐时,在可能有效的循环中写入零。
如果它只需要像这样的东西,那么复制和跳转方面MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
}
最坏的情况(对于简单的程序集复制和跳转),也许可以摆脱.rodata行
以上是针对gnu ld假设你正在使用的,请注意内存名称没有意义,你可以这样做:
MEMORY
{
bob : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > bob
.rodata : { *(.rodata*) } > bob
}
或
MEMORY
{
joe : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > joe
.rodata : { *(.rodata*) } > joe
}
或
MEMORY
{
pizza : ORIGIN = 0x00000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > pizza
.rodata : { *(.rodata*) } > pizza
}
或
MEMORY
{
thehut : ORIGIN = 0x08000000, LENGTH = 0x2000
pizza : ORIGIN = 0x20000000, LENGTH = 0x2000
}
SECTIONS
{
.text : { *(.text*) } > thehut
.rodata : { *(.rodata*) } > thehut
.bss : { *(.bss*) } > pizza
.data : { *(.data*) } > pizza AT > thehut
}
你可以使用gnu ld攻击MEMORY或SECTIONS方面的内容。如果你觉得需要两个.texts或两个.datas两个.bss等(一个用于bootloader的复制/跳转部分,一个用于bootloader本身,并且有一个链接器脚本和所有bootloader的链接)你可以做那件事或采取你正在采取的方法。但是除了每个与链接器脚本密切相关的引导程序之外,还必须使用工具链特定的解决方案,使ram上的引导加载程序适合于正确的.text / .bss等,或者将它们覆盖到其他一些(。 my_bl_text ...)或在链接描述文件或其他解决方案中调用目标文件名。不幸的是,gnu链接器脚本语言具有许多功能,同时,假设您已经了解该语言,则文档更多地是一个参考。很难看出编写精心设计的链接描述文件的人如何从现有的gnu文档中找出,然后尝试编写第一个或修改别人的文件。我推荐两个程序ram程序和包含ram程序作为数据的复制跳转程序。