gpt4 book ai didi

在 GNU 链接描述文件中创建额外的可重定位部分

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:13 24 4
gpt4 key购买 nike

我试图在我的 ARM MCU 中为初始化数据创建一个额外的 ram 部分(在我的 GNU 链接器脚本中)。该部分必须放置在已知地址,以便我可以在 MPU 中为其设置特定属性。我在使用所有链接器魔法时遇到了一些麻烦。

内存划分如下:

/* Memory Spaces Definitions */
MEMORY
{
rom (rx) : ORIGIN = 0x00420200, LENGTH = 0x001DFE00
ram (rwx) : ORIGIN = 0x20400000, LENGTH = 0x0005e000
ram_nocache_section (rwx) : ORIGIN = 0x2045e000, LENGTH = 0x00002000
sdram(rwx): ORIGIN = 0x70000000, LENGTH = 0x00200000
}

这是我要处理的“ram_nocache_section”。

我可以定义一个合适的部分如下:

/* no cache section */
.ram_nocache :
{
. = ALIGN(8);
*(.ram_nocache)
} > ram_nocache_section

这可行,但生成的二进制文件非常庞大。 0.5GB。这是因为 ram 地址空间与 flash 地址空间相差 0.5 GB。处理这个问题的方法是“重新定位”初始化的 ram 数据。该脚本像这样执行:

.text :
{
...
} > rom

. = ALIGN(4);
_etext = .;

.relocate : AT (_etext)
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} > ram

这将神奇地在闪存和 ram 中分配初始化数据(和 ram 函数)。所以这很容易复制,对吧?像这样:

. = ALIGN(4);
_etext = .;

.relocate : AT (_etext)
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} > ram

. = ALIGN(4);
_eramdata = .;

.relocate2 : AT ( _eramdata )
{
. = ALIGN(4);
_srelocate2 = .;
. = ALIGN(8);
*(.ram_nocache)
. = ALIGN(4);
_erelocate2 = .;
} > ram_nocache_section

这会编译,但生成的二进制文件仍然很大。这是因为 _eramdata 符号以某种方式放置在 ram 中,而不是像 _etext 一样放置在闪存中。

那么……根据这个document ,我应该能够做这样的事情:

.relocate2 : AT ( _etext + SIZEOF(.data) + SIZEOF(.ramfunc) )
{
. = ALIGN(4);
_srelocate2 = .;
. = ALIGN(8);
*(.ram_nocache)
. = ALIGN(4);
_erelocate2 = .;
} > ram_nocache_section

虽然这不会编译。相反,我可以像这样创建所需的结果:

.relocate2 : AT ( _etext + 10k )
{
. = ALIGN(4);
_srelocate2 = .;
. = ALIGN(8);
*(.ram_nocache)
. = ALIGN(4);
_erelocate2 = .;
} > ram_nocache_section

但是,这是一个相当脆弱且浪费的解决方案。

如何正确执行此操作?我想将“relocate2”部分放在常规“relocate”部分的旁边。没有任何多余的浪费或预定义的代码限制。

最佳答案

我更喜欢这个结构:

. = ALIGN(4);
_etext = .;

.relocate :
{
. = ALIGN(4);
_srelocate = .;
*(.ramfunc .ramfunc.*);
*(.data .data.*);
. = ALIGN(4);
_erelocate = .;
} > ram AT>rom

.relocate2 :
{
. = ALIGN(4);
_srelocate2 = .;
. = ALIGN(8);
*(.ram_nocache)
. = ALIGN(4);
_erelocate2 = .;
} > ram_nocache_section AT>rom

这两个部分都必须更改为 AT>rom。 (没有混合。)

关于在 GNU 链接描述文件中创建额外的可重定位部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com