【发布时间】:2021-01-31 19:32:39
【问题描述】:
在编写基于 ARM 的微控制器时,我习惯于在链接脚本中看到一个 MEMORY{..} 段,如下所示:
MEMORY
{
FLASH (rx): ORIGIN = 0x08000000, LENGTH = 128K
RAM (xrw): ORIGIN = 0x20000000, LENGTH = 32K
}
访问权限很容易理解:
-
r:阅读 -
w:写 -
x:执行
我在基于 RISC-V 的微控制器领域迈出了第一步。 GigaDevice 的GD32VF103CBT6 微控制器在其链接脚本中有以下MEMORY{..} 段:
MEMORY
{
/* Run in FLASH */
flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 64k
ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 20k
/* Run in RAM */
/* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 15k */
/* ram (wxa!ri) : ORIGIN = 0x20003C00, LENGTH = 5K */
}
我应该如何解释这些访问权限?
【问题讨论】:
-
这些链接描述文件只是碰巧根据自己的喜好和品味编写它们的个人。对于 ARM 或 Risc-V 或任何其他目标,您不必在链接描述文件中设置任何访问权限,或者您可以发送垃圾邮件或介于两者之间的任何内容。一件事与另一件事完全无关。正如所回答的那样,它们的意思是在链接器文档中。由于未指定,此处假定为 gnu,链接器脚本不假定为可移植的。
-
同样,没有一个用于 arm 的链接器脚本,一个用于 risc-v 的链接器脚本,也没有一个用于 GD32VF103CBT6 的链接器脚本,你碰巧每个人都有一个为这些内核编写的而不是通用的,这必须用于每个人大多数人都很懒惰并使用他们发现的第一件事,他们很少像你一样花时间学习,然后可能会适应他们的应用程序。
-
还要理解链接描述文件与引导程序,通常是 C 库(和应用程序)有着密切的关系,所以你不能将它们分开,你可以将它们一起设计适应他们的应用/解决方案。
-
谢谢@old_timer。不幸的是,大多数链接脚本只有很少的 cmets。我希望他们能被更好地记录下来。这将使世界变得不同。您能否推荐一本好书、网站或其他资源来了解有关链接脚本、引导代码以及与 C 库的关系的更多信息?
-
在接受的答案中是指向 ld 文档的链接。但您也必须进行实验,这是其中的一部分。 99% 的裸机工作是阅读和实验,在实际应用上花费的时间相对为零。使用其他 binutils 工具以及 ld、readelf。 objdump 等,看看该工具做了什么。如果这些工具不够用,像 elf 这样的文件格式很容易编写自己的程序来解析。另外 binutils 是开源的,没有比源代码本身更好的文档了...
标签: embedded microcontroller riscv linker-scripts riscv32