1、GUN中对MEMORY指令的描述
2、MEMORY命令的格式
MEMORY{ name [ ( attr) ] : ORIGIN = origin, LENGTH = len…} 实例:
MEMORY
{ rom ( rxa) : ORIGIN = 0x80000000 , LENGTH = 512 Kram ( wxa) : ORIGIN = 0x80080000 , LENGTH = 512 K
}
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命令还是比较方便的