GNU链接脚本的MEMORY命令解析

1、GUN中对MEMORY指令的描述

2、MEMORY命令的格式

MEMORY
  {
    name [(attr)] : ORIGIN = origin, LENGTH = len
    …
  }

实例:
MEMORY
{
	/* 描述设备的内存区域 */
	rom (rxa) : ORIGIN = 0x80000000, LENGTH = 512K
	ram (wxa) : ORIGIN = 0x80080000, LENGTH = 512K
}
  • name:内存区域的名字,在链接脚本中使用名字来引用内存区域
  • attr:内存区域的属性
    • r:只读属性
    • w:读写属性
    • x:可执行属性
    • a:可分配属性
    • i :初始化属性
    • l:和i一样的属性
    • !:对后面的属性取反
  • ORIGIN:内存区域的地址地址
  • LENGTH:内存区域的长度

3、链接脚本中相关命令

在这里插入图片描述

  • ORIGIN:获取内存区域的起始地址
  • LENGTH:获取内存区域的长度

4、MEMORY的使用场景

  • 使用MEMORY描述设备的内存区域,方便理解程序加载和内存布局,方便设置各段的加载地址和链接地址。可参考博客:《链接脚本常用命令(KEEP、MEMORY、PROVIDE、ENTRY、AT、ALIGN等)》
  • MEMORY中描述的内存区域属性的作用范围:
    • 属性会被记录在elf头中,内核执行elf文件时会检查属性,如果操作的内存区域不具备该属性会报错
    • 对于裸机程序或者RTOS程序,属性字段没有实际作用
      • 就算你在代码里使用指针明确写了不具备写属性的内存区域,编译也不会报错
      • 裸机程序和RTOS程序使用bin格式而不是elf格式,所以在代码运行中也不会检查内存区域属性
  • 换句话说,MEMORY并不是必须要使用,不在链接脚本中描述内存区域,一样可以正常编译出程序。但是需要代码重定位,使用MEMORY命令还是比较方便的
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值