可执行文件的组成

在 ADS 下,可执行文件有两种,一种是.axf 文件,带有调试信息,可供 AXD 调试工具使用.另一种是.bin

文件,可执行的二进制代码文件。我们重点是讲描.bin 文件的组成。 我们把可执行文件分为两种情况:分别为存放态和运行态。

1. 存放态

存放态是指可执行文件通过 fromelf 产生后,在存储介质(flash 或磁盘)上的分布. 此时可执行文件一 般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段(.text)和只读数据段(.rodata), 数据段又分为初始化数据段(.data)和未初始化数据段(.bss)。可执行文件的存放态如下:

+-------------+-----------

|   .bss      |

+-------------+-- 数据段

|   .data     |

+-------------+-----------

|   .rodata   |

|             | 代码段

|   .text     |

+-------------+-----------

2. 运行态

可执行文件通过装载过程, 搬入到 RAM 中运行, 这时候可执行文件就变成运行态。在 ADS 下对可执行代 码各段有另一个名称:

|    ...      |

+-------------+-----------

|   .bss      | ZI 段

+-------------+-- 数据段

|   .data     | RW 段

+-------------+-----------

|   .rodata   |

|             | 代码段(RO 段)

|   .text     |

+-------------+-----------

|    ...      |

装载前

当可执行文件装载后, 在 RAM 中的分布如下:

|    ...      |

+-------------+-- ZI 段结束地址

|    ZI 段     |

+-------------+-- ZI 段起始地址

|    保留区 2    |

+-------------+-- RW 段结束地址

|    RW 段     |

+-------------+-- RW 段起始地址

|   保留区 1     |

+-------------+-- RO 段结束地址

|    RO 段     |

+-------------+-- RO 段起始地址

|    ...      |

装载后

所以装载过程必须完成把执行文件的各个段从存储介质上搬到 RAM 指定的位置。而这个装载过程由谁来完 成呢?由我们的启动程序来完成.

装载过程

在 ADS 中,可以通过两种方式来指定可执行代码各段在 RAM 中的位置,一个是用 armlink 来指定,一种是

用 scatter 文件来指定.RAM 区的起始地址:0x30000000.

  1. armlink 指定代码段地址

我们通常的代码,只用指定两个段开始地址, RO 段的起始地址和 RW 段的起始地址, ZI 段紧接在 RW 段之

后.示例见该部分的 1.1.3.

  1. scatter 指定代码段地址

我们也可以通过 scatter 文件指定可执行文件各段的详细地址. Scatter 文件如下:

MYLOADER 0x30000000

;MYLOADER: 为可执行文件的名称, 可自定义

;0x3000000: 起始地址

{

RO 0x30000000

;RO 只读代码段的名称

;0x30000000: 只读代码段的起始地址

{

init.o (Init, +First)

; Init 代码段为可执行文件的第一部分.

* (+RO)                ;所有其它的代码段和只读数据段放在该部分

}

RW +0

;RW: RW 段的名称

;+0: 表示 RW 段紧接着 RO 段

{

* (+RW)              ;所有 RW 段放在该部分

}

ZI +0

;ZI: ZI 段的名称

;+0: 表示 ZI 段紧接着 RW 段

{

*(+ZI)                  ;所有 ZI 段放在该部分

}

}

3. ADS 产生的各代码段宏

|Image$$RO$$Base|     /* RO 代码段起始地址 */

|Image$$RO$$Limit|    /* RO 代码段结束地址 */

|Image$$RW$$Base|    /* RW 代码段起始地址 */

|Image$$RW$$Limit|   /* RW 代码段结束地址 */

|Image$$ZI$$Base|     /* ZI 代码段起始地址   */

|Image$$ZI$$Limit|    /* ZI 代码段结束地址 */

注意:在两个$$之间的名称, 与 scatter 中指定的段的名称相同.

4. 装载过程说明

当从 NorFlash 启动时, 要把 flash 芯片的首地址映射到 0x00000000 位置, 系统启动后, 启动程序本身把自己从 flash 中搬到 RAM 中运行. 搬移后的各段起始地址, 由以上宏来确定.

当从 NandFlash 启动时, S3C2410 会自动把前 NandFlash 的前 4k 搬到 S3C2410 的内部 RAM 中,并把内部 RAM 的首地址设为 0x00000000,CPU 从 0x00000000 开始执行. 所以, 在 nandFlash 的前 4k 程序中,必须包含从 NandFlash 把 BootLoader 的其余部分装入 RAM 的程序.

启动过程的汇编部分

当系统启动时, ARM CPU 会跳到 0x00000000 去执行。一般 BootLoader 都包括如下几个部分: 1.  建立中断向量异常表

2. 显示的切换到 SVC 且 32 指令模式

3. 关闭 S3C2410 的内部看门狗

4.  禁止所有的中断

5. 配置系统时钟频率和总线频率

6. 设置内存区的控制寄存器

7. 初始化中断

8. 安装中断向表量

9. 把可执行文件的各个段搬到运行态的各个位置

10. 跳到 C 代码部分执行

启动过程的 C 部分

1. 初始化 MMU 2.初始化外部端口

3. 中断处理程序表初始化

4. 串口初始化

5. 其它部分初始化(可选)

6. 主程序循环

转载于:https://www.cnblogs.com/fanweisheng/p/11103125.html

可执行文件组成及内存映射相关推荐

  1. Windows核心编程 第十七章 -内存映射文件(上)

    第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个 ...

  2. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...

  3. C#内存映射文件学习总结

    C#内存映射文件学习 http://www.cnblogs.com/flyant/p/4443187.html 内存映射文件是由一个文件到进程地址空间的映射. C#提供了允许应用程序把文件映射到一个进 ...

  4. mmap内存映射、system V共享内存和Posix共享内存

    linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  6. 网络传输大数据——内存映射

    内存映射技术相关知识 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页 ...

  7. Windows之内存映射文件

    =====================Windows之内存映射文件===================== 几乎每个应用程序都要处理文件,但要处理好并不容易.应用程序到底是先应该打开文件.再读取 ...

  8. windows 内存映射文件

    4.内存管理机制--内存映射文件 (Map)    和虚拟内存一样,内存映射文件可以用来保留一个进程地址区域:但是,与虚拟内存不同,它提交的不是物理内存或是虚拟页文件,而是硬盘上的文件. ·使用场合 ...

  9. 内存映射文件使用详细

    http://www.cppblog.com/woaidongmao/archive/2008/12/26/70439.html 摘要: 本文通过内存映射文件的使用来对大尺寸文件进行访问操作,同时也对 ...

最新文章

  1. WPF入门教程系列九——布局之DockPanel与ViewBox(四)
  2. 快速掌握Python的捷径-Python基础前传(1)
  3. LUT Utility for FCPX(Luts调色文件加载工具)支持M1
  4. 让电脑开机时直接登录
  5. QMessageBox 使用方法
  6. The Pilots Brothers' refrigerator
  7. pojo类不能有默认值怎么办_打印机不能打印是什么原因 打印机不能打印处理方法介绍【详解】...
  8. 元组可以直接添加进数据库吗_AWS Neptune 详细体验:OLTP的可扩展图数据库
  9. [转载] sklearn学习之:(3)决策树回归算法
  10. 数字信号处理--7.5--FIR数字滤波器
  11. [小技巧]为Atlas AutoComplete加上滚动条
  12. bootstrap modal 关闭时右侧滚动条消失,页面左移的解决方法
  13. 用户故事与敏捷方法—用户故事不良症兆
  14. AD单片机九齐单片机NY8B062D SOP16九齐
  15. 台式计算机如何升级,电脑硬件如何升级:PC硬件升级不盲目 对症下药最靠谱
  16. xftp7要继续使用此程序,您必须应用最新的更新,100%已解决.
  17. “联盟鱼”-国外广告联盟lead项目最新玩法介绍
  18. 魔兽地图编辑器--人物自定义语音的方法和进入游戏自定义语音不能播放的问题
  19. 系统学习——Bootstrap
  20. 修改html会影响seo,网站修改css影响seo吗?

热门文章

  1. 深入理解python中的select模块
  2. Python3学习笔记(一)简介 、 安装 、 解释器
  3. Ubuntu16.04 下 Python3 虚拟环境安装 OpenCV
  4. 【Qt】2D绘图之图形视图框架(一)
  5. 【MFC】带下拉菜单的工具栏
  6. C语言设备管理器作业,你知道到吗,C语言竟是如何调用硬件的?
  7. android勾选控件_Android中CheckBox复选框控件使用方法详解
  8. keepalived(6)——lvs和arrp集成操作(2)——完成
  9. Spark(3)——通过本机文件导入到RDD
  10. iOS Hacker obfuscator-llvm Xcode集成配置