1.前言

链接器的默认配置允许所有有效内存的分配,你可以使用MEMORY命令来重新定义它

2.MEMORY命令

MEMORY命令描述了一个内存块的位置和大小。你可以用它来描述哪块内存区域可以被链接器使用,哪块内存区域一定要避开。

你可以将段分配到特定的内存区域内,链接器会基于此内存区域设置段地址,如果满了就会有警告,链接器是不会压缩段使之适合放到区域中

一个链接脚本最多只能拥有一个MEMORY命令,然而,你可以定义很多内存块,语法如下:

  1. MEMORY
  2. {
  3. name [(attr)] : ORIGIN = origin, LENGTH = len
  4. ...
  5. }

这个name定义了区域的名字。区域的名字对于脚本外部没有意义,它会存储在一个隔离的名字空间里,不会和符号名、文件名或者段名冲突。

在MEMORY命令里的每个内存区域名字不能冲突,不过,你可以给已经存在的内存区域定义别名,see REGION ALIAS (3.4.4 Assign alias names to memory regions)

这个attr字符串是可选项,它指明那些在链接脚本中没有被映射的输入段会被放到哪个特殊的内存区域。如 SECTIONS (3.6 SECTIONS Command)小节

对于没有指定输出段的那些输入段,链接器会创建一个同名的输出段。如果定义了区域属性,链接器可以使用它们为那些创建的输出段指定内存区域

这个attr字符串可以有一下字符组成:

  1. `R'
  2. Read-only section
  3. `W'
  4. Read/write section
  5. `X'
  6. Executable section
  7. `A'
  8. Allocatable section
  9. `I'
  10. Initialized section
  11. `L'
  12. Same as `I'
  13. `!'
  14. Invert the sense of any of the attributes that follow

如果一个没有映射的段符合这些属性,除了‘!’属性,它就会被放入此内存区域中。这个‘!’属性保留来给那些任何属性都不符合的那些没有映射的段

origin是一个数字表达式,表示内存区域的起始地址。这个表达式必须由常数来计算得到,不能包含任何符号。关键字ORIGIN还可以缩写为org或者o(但是不能是ORG)

len表示了内存区域的大小。和origin表达式一样,只能使用常数计算。关键字LENGTH可以缩写为len或者l

下面有个例子,我们定义两个可以有效分配的内存区域:一个是起始地址为0大小为256K,另一个的起始地址为‘0x40000000’大小为4M。

MEMORY
{
rom (rx) : ORIGIN = , LENGTH = 256K
ram (!rx) : org = 0x40000000, l = 4M
}

链接器会将每个没有映射的只读或者可执行的段放入‘rom’内存区域中,将其余没有映射的段放入‘ram’的内存区域

一旦你定义了一个内存区域,你可以使用‘>region’输出段属性直接给输出段指明一个内存区域。

比如,有一个‘mem’的内存区域,那么你可以在输出段中使用‘>mem’,see Output Section Region (3.6.8.6 Output Section Region)。

如果没有给这个输出段指明地址,链接器会将它放到该内存区域内下一个有效地址,如果把输入段放入内存区域中太大了,链接器就会报错

通过ORIGIN(memory)和LENGTH(memory)可以访问内存区域的其实地址和大小:

_fstack = ORIGIN(ram) + LENGTH(ram) - ;  

参考文献

[1] http://blog.csdn.net/han22647/article/details/64920623

[2] http://blog.csdn.net/huiyuyang_fish/article/details/16884593

 

Linker Scripts3--MEMORY Command的更多相关文章

  1. Redis4.0新特性(一)-Memory Command

    Redis4.0版本增加了很多诱人的新特性,在redis精细化运营管理中都非常有用(猜想和antirez加入redislabs有很大关系):此系列几篇水文主要介绍以下几个新特性的使用和效果. Redi ...

  2. Linker scripts之MEMORY

    1 MEMORY command The MEMORY command describes the location and size of blocks of memory in the targe ...

  3. Linker scripts之Intro

    1 Intro Every link is controlled by a linker script. The main purpose of the linker script is to des ...

  4. Sharp Memory LCD (ls013b7dh03)驱动

    网上找不到什么靠谱的资料,甚至我调好了夏普原厂和代理商还来找我要demo,  哎,苦逼的码农. lcd_main.c #include "ls013b7dh03.h" #inclu ...

  5. IAR Build from the command line 环境变量设置

    http://supp.iar.com/Support/?Note=47884 Technical Note 47884 Build from the command line The alterna ...

  6. Linux Command Line learning

    https://www.codecademy.com/en/courses/learn-the-command-line Background The command line is a text i ...

  7. Visual Studio 调试技巧[Command Window & Immediate Window ](Tips)

    Visual Studio 调试技巧[Command Window & Immediate Window ](Tips) 1. immediate window 定义的一些 alias (// ...

  8. Dr.memory

    Run Dr.memory on visual c++ 2013 Title: Dr. Memory Command: C:\Program Files (x86)\Dr. Memory\bin\dr ...

  9. IOS XE-show memory

    有些时候,我们可能会遇到IOS XE设备的high memory的情况.我们可以使用的命令去查看相关信息. 例如: Router# show version Router# show memory R ...

  10. Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)

    Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...

随机推荐

  1. 兄弟连Linux运维学习笔记

    最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux----------------------Unix与Linux ...

  2. Hadoop基础-通过IO流操作HDFS

    Hadoop基础-通过IO流操作HDFS 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.上传文件 /* @author :yinzhengjie Blog:http://www ...

  3. nGrinder Loadrunner vs nGrinder

    s d 功能 参数类型 取值方式 迭代方式 Loadrunner实现方式 nGrinder实现方式 参数化 文件  sequential (顺序取值) Each Iteration (每次迭代) 在参 ...

  4. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  5. 设计模式---对象性能模式之享元模式(Flyweight)

    一:概念 通过与其他类似对象共享数据来减少内存占用 如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字 ...

  6. keeping.py

    定时push+告警 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author : 71standby@gmail.com # Description ...

  7. windows安装mysql示例

    1. 下载mysql安装包,如: mysql-5.6.34-winx64.zip2. 解压安装包到指定目录,如:D盘,即:D:\mysql-5.6.34-winx643. 配置 cd D:\mysql ...

  8. Spring boot 配置自己的拦截器

    框架使用的是spring boot 2.0 首先,自定义拦截器实现HandlerInterceptor接口,preHandler是在执行controller方法前执行的  此外还有两个方法,具体作用最 ...

  9. Mono.Cecil

    Mono Cecil十分强大,强大到可以静态注入程序集(注入后生成新的程序集)和动态注入程序集(注入后不改变目标程序集,只在运行时改变程序集行为),它甚至可以用来调试PDB MDB调试符号格式文件. ...

  10. Docker 容器的隔离性

    Docker 容器的隔离性 就是 使用Linux namespace 来隔离运行环境和成 cgroup 限制容器使用的资源.  namespace 可以顾名思义 命名空间:所以可以理解为每个独立的容器 ...