【问题标题】:Access rights in RISC-V linkerscriptsRISC-V 链接描述文件中的访问权限
【发布时间】: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


【解决方案1】:

它们并不是真正的“访问权限”,而是“这里可以放置什么样的部分”。

来自GNU LD documentation(在 quotint 过程中出现了一些格式错误:

attr 字符串必须只包含以下字符:

  • ‘R’
    只读部分
  • ‘W’
    读/写部分
  • ‘X’
    可执行部分
  • ‘A’
    可分配部分
  • “我”
    初始化部分
  • ‘L’
    和“我”一样
  • ‘!’
    反转任何属性的意义

如果未映射的部分匹配除“!”之外的任何列出的属性,它将被放置在内存区域中。 ‘!’ 属性会反转对后面字符的测试,因此只有当未映射的部分与后面列出的任何属性都不匹配时,才会将未映射的部分放置在内存区域中。因此,'RW!X' 的属性字符串将匹配具有 'R' 和 'W' 属性之一或两者的任何未映射部分,但前提是该部分还没有 'X' 属性。

在此背景下,我将您的配置解释如下:

flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 64k

...意味着“flash”区域可以包含除可写部分之外的任何内容,并且

ram   (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 20k 

...意味着“ram”区域可以包含除只读和初始化部分之外的任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2015-12-23
    • 1970-01-01
    • 2021-11-17
    • 2019-12-13
    相关资源
    最近更新 更多