1

在编写基于 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  */
}

我应该如何解释这些访问权限?

4

1 回答 1

1

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

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

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

  • 'R'<br> 只读部分
  • 'W'<br> 读/写部分
  • 'X'<br> 可执行部分
  • 'A'<br> 可分配部分
  • 'I'<br> 初始化部分
  • 'L'<br> 和'I'一样</li>
  • '!'<br> 反转任何属性的意义

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

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

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

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

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

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

于 2020-10-17T16:19:18.987 回答