ARM初始化程序分析._第1页
ARM初始化程序分析._第2页
ARM初始化程序分析._第3页
ARM初始化程序分析._第4页
ARM初始化程序分析._第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM学习报告001 杜云海 duyunhai ARM映象文件及执行机理 学习报告 这几天为了弄清楚 系统是如何运行相应的可执行程序可谓费尽心机 整个五 一假期都没有休息 其中由于烧写 的软件出了些问题 使得理解 映象文 件及执行机理更加曲折 不过还好在自己的努力和论坛上兄弟的帮助下 终于还是 成功了 作为进入 系统设计的重要一步 我觉得这个过程是应该写下来的 既是为了自己的总结 也为了后来进入 的人可以少走些弯路 我的开发板配置如下 l 芯片 核 l 1片16 1M位数据宽度的FLASH 共2M 字节Flash MX29LV160BTC 速度70 90ns 位模式 l 内存 片4M 16位数据宽度的SDRAM HY57VB TC 10S 构成 共16M 字节SDRAM 2片16位拼做32位使用 共用一个片选 l 简易 调试 两个串口 一个以太网口 从我个人的学习经过认为 初学者最难突破的应该是以下三个方面 所以 本文基 本上从这三个方面来阐述 l 映象文件 包括 文件和 文件 的生成和组成 l 映象文件下在 中的状态和运行时的状态 加载域和运行时域 l 地址重映射 本文基本围绕附录给出的那个串口发送程序 而展 开的 这个程序的初始化和地址重映射部分参考了 的程序 串口发送部分参考了 的程序 那我自己写了什么呢 J 首先我们应该建立这样一种概念 对于一个裸机 里什么都没有 来说 所有 的细节都得自己设置 不要指望芯片或开发工具可以为你做些什么 所以从第一 条指令开始 你就必须负责所有的工作 对于 上电或复位后从 开 始执行指令 而硬件上我们把 接在了 的 处 所以 就是 从 的 处开始取指令 那么我们就必须保证 一开始可以取到正确的指 令 小插曲 我前几天就是被我的 下载程序害死了 由于下载程序的时序问题 开始的 多个字节里不能正常烧写 结果老是为 而我刚刚开始也不懂得 映象文 件的内涵 结果以为 文件就是可执行文件 将其烧入 所以程序真正的第 一条指令在 开始 不能正确烧写的部分正好是 文件的头 没有影响到真正 的指令 程序有时也可以执行 因为 相当于空指令一样 程序也可以执行到真 正的第一条指令 所以串口输出的都是不对的乱码或字母 一 的映象文件 初步认识 和 文件 1 ARM学习报告001 杜云海 duyunhai 这里我先谈谈 的映象文件 即可执行文件 的概念 我们生成的 的映象 文件有 格式和 格式两种 有时容易被二者混淆 其实 文件是真正的可执 行文件 而 文件是 特有的调试文件 里面除了包含 文件的内容之外 还 附加了许多其他调试信息 首先让我们来看看 和 的区别 图 图 是用 打开的 文件和 文件的头部和尾部 这两个文件都是 用 生成的 选中 中的 和 中的 这两个选项 就可以同时生成相应的 和 文件 在生成这两个映象文件时 请设置 的选项 设为 设为 作用将在本文后面 解释 图 是 文件 其中反显处才是真正的第一条指令 开始的 个字节都是 文件 头 而图 的 文件从 就是真正的第一条指令 所以为什么说 文件才是真正 的可执行文件 关键是从第一条指令开始的二个文件的比较了 哦 竟然是完全 相同的 一直到 文件的尾部 见图 和图 即 文件就是 文件的 不 过 二者的相应指令或数据的地址就不一样了 先记住这一点伏笔 文件结束 图 反显处 但 文件还没有结束 图 中反显指示 文件相应结束部分 其后 还有很多相关的调试信息 这些调试信息可以用在 或 的 的调试中 由于我们的烧写工具是原封不动地将映象文件烧入 中 所以 文件是不可 以烧入的 否则 的 处就不是真正的第一条指令 而是 头部分 我们应该 将 文件烧入 保证 的 处是第一条指令 我个人猜测 文件应该可以通过 中的下载功能 下载到 中运行 在 下载的过程中可能经过 相应的内部处理而导致真正烧入 中的还是 文件 到现在为止 我们只能感性认识一下映象文件 文件和 文件的不同 也就是 说 文件是 文件的一部分 最精华的一部分 那么到底哪部分是最精华的呢 文件中包含了哪些内容呢 指令和数据到底放在映象文件的什么地方呢 下面接着分析 图 中打开的 文件二进制形式 头部部分 2 ARM学习报告001 杜云海 duyunhai 图 中打开的 文件二进制形式 头部部分 图 中打开的 文件二进制形式 中间部分 3 ARM学习报告001 杜云海 duyunhai 图 中打开的 文件二进制形式 尾部部分 映象文件的内容 讨论到映象文件的内容 就应该打开源程序并理解源程序的内容了 这个程序比较 简单 我们这里讲解的都是初级知识 给大家一个入门的启示 复杂的以后可以再 慢慢学 所以大家看到这篇文章不要老是想到复杂的情况 那样本文有些阐述可能 就不太对头了 首先我们可以先不看程序具体做了什么 我们总应该可以看出这个简单程序分为 两个部分 一个是 部分 即指令代码部分 另一部分是 部分 即数据部 分 代码部分 数据部分 书上说 映象文件一般由域组成 域由最多三个输出段 组成 输出 段又由输入段组成 那么我们来看看生成的映象文件 到底怎么符合书上的概念 又怎么和上面源程序的代码和数据部分对应起来的 先来看看图 吧 我觉得实物最可以给人以说服力 4 ARM学习报告001 杜云海 duyunhai 图 中打开的 格式映象文件二进制形式 大部分 大家看到了吧 蓝色反显的前部其实就是源程序对应的指令代码部分 反显后对应 的就是源程序的数据部分 反显处就是指令部分 和数据部分 的分界处 大 家仔细看看 反显开始的地方往后其实就是要从串口输出的字符数据 由于屏幕关 系 没有完全显示出 大家可以自己用 打开看看 而从 开始至 处是程 序中的指令编码 编译好的二进制编码 所以 可以这么说 l 域 整个 映象文件 也就是说这个简单程序的映象文件只有一个域 加载域 其实大部分程序都是只有一个加载域 l 输出段 有两个输出段 和 没有 这个我们从源程序和图 也可以看出 l 输入段 两个输入段 即源程序的 部分和 部分 部分是 属于 输出段 部分是 属于 输出段 所以 域 输出段和输入段的关系如下图 5 ARM学习报告001 杜云海 duyunhai 图 例子程序的域 输出段和输入段的关系 在加载域中 直接跟在 后面 那我们刚刚设置的连接选项 有什么用呢 的确是从 开始 可是 却从 开始 和 不同阿 到底这是怎么回事呢 二 的映象文件的加载域和运行时域 所有这些 都是 连接 和 系统存储器多样化 惹的祸 连接器一个很重 要的工作就是要解析目标文件中各种符号 也就是得到各符号的值 还是先来看看图 吧 图 例子程序 编译连接的符号映射图 一部分 这张图是例子程序在 中编译连接后显示出的符号映射 的一部分 选中 6 ARM学习报告001 杜云海 duyunhai 中 选项卡的 和 即可 其中设置了 可以看到象 等符号的值都是相对于 而定位的 在 段中 而 和 却是相对于 而定位的 在 段中 这些符号值是在映象文件开始运行时才起作用 如果仅仅是放在 中或仅仅运 行前面几条初始化指令 加载域状态 那么这些值还暂时不起作用 否则问题就麻 烦了 所以真正运行时 就必须保证这些值是对的 于是引出了 数据移动 概念 什么是加载域和运行时域呢 我个人认为用 域 这个词实在很容易混淆 其实简 单明了的说 加载域就是最原始的 文件 就是映象文件烧入 时的状态 如 图 所示 跟在 后面 而运行时域就是经过了改头换面的映象文件 即由于 运行了相应的初始化程序而把 或 拷贝到相应的地方 这是映象文件已经四分 五裂成至多三个部分 图 示意例子程序映象文件的两个不同状态 当然运行时域也可以和加载域相同 就是不设置 那么运行时不需要移 动 依然跟在 后面 0 x 0 x 0 x00a00000 0 x 0 x 0 x 加载域 运行时域 图 例子程序加载域和运行时域比较示意图 在加载域状态 地址是正确的 意味着指令可以正确执行 但 是不正确的 从图 可知 但是暂时的错误不影响程序初始化 源程序的 都暂时没有用到 所以程序还是可以正确运行 即使 在 处 程序终究是要用到 的 那么怎么办 其实只要来个 乾坤大挪 移 就好了 在用到 之前将 移动到正确的位置即可 完成了这个 挪移 过程 当然移动前进行了地 址重映射 不过 地址重映射和 的数据移动其实是两回事 在 的 中 即例子程序的 在映射前 将 的备份拷到 中 然后将 重映射为 非常巧 指令运行不受任何影响 重映射后 的地址为 此时主动权已经到 中的 手上了 然后再将 移动到相应的位置 哪里才是 相应的正确位置呢 的数据移动 有一个概念很重要 加载域状态 的映象文件中 和 的所在地址都是临时 的 他们所在的真正位置 即连接时设置的地址值 都必须在程序初始化时由相应 程序 将他们 7 ARM学习报告001 杜云海 duyunhai 移动到相应的地方 这个数据移动过程由 完成 源程序由 个部分组成 主要是执行 的初始化和内存重映射 相 关资料可以参考文章 主要是通过串口发送几行字符 这里主要 解释一下 和 这六个全局变量分别是 输出段运行时起始地址 运行时存储区域界限 输出段运行时起始地址 运行时存储区域界限 输出段运行时起始地址 运行时存储区域界限 引入的这六个变量可说是在映象文件编译连接中起到至关 重要的作用 这里我们就不说得非常复杂了 就简单用例子程序来举例说明 现在再让我们回头看看前面编译连接时 中的 及 图的另外 一部分 如图 图 编译连接后的映射表一部分 其中 8 ARM学习报告001 杜云海 duyunhai l l l l l 其实 是不存在的 l 大家把这些地址再和图 的 文件 映象文件 对照看看 有哪些相似之处吗 的 和 和在 中打开的映象文件一样 也就是说和烧在 中 的一样了 和 明显不对 不过 仔细看看 除了地址不对外 其实相对值还是一样的 也就是说 只要把 中的 移到 所指示的位置即可 是 的存储地址界限 其实是 中 的开始地址 加载域状态时 因为加载域状态时 就是紧跟在 后面 而 是 运行时的开始地址 二者是不同的 中正是通过判断 和 是否 相等来决定程序运行时 是否需要 搬迁 这个例子中 二者是不等的 就是说 程序运行时 不应该在 中的这个位置 的后面 那么初始化程序就必须在未使用 前将 移到正确的位置 例子程 序中则将 移到了 处 从而使得编译连接时和 相关的标号值都正 确 一旦 被移动到 处 那么图 中的 和 等 段的符号值都是正确的了 在生成加载域 也就是映象文件 文件 时 是把 紧接在 后面 这并不是 的实际地址 而仅仅是加载时 也就是烧写到 时的代码和数据的临时地址 而程序真正开 始运行起来时 也就是运行时域 一切情况又都发生了变化 该到什么地方的 就应该去什么地方 所以 应该拷到 处 以保证连接时的符号值都是正确的 三 系统的地址重映射 其实如果真正懂了上面两个原理 那么理解地址重映射就很容易了 虽然他们之间 没有什么联系 但是 很多人不能理解地址重映射就是因为和映象文件的编译连接 地址搞得一团糊 地址重映射就是通过系统的存储管理部件改变系统中各个存储器的映射地址 在 9 ARM学习报告001 杜云海 duyunhai 中 通过改变系统控制寄存器组来改变存储器的映射地址 如果你对 芯片的存储管理部件还不是很熟的话 应该先把芯片资料再看看 一般的 开发板都是将 连接到 处 这样上电复位时 读的第一条指令是 的 处的值 例子程序中 程序在运行时 都没有映射 在 为了 的 的复制 特意初始化了 和 具体设置如图 的加载域所示 为 从 为 从 其他系统控制寄存器则设置为 这个 由 设置 地址重映射 先来看看例子程序 10 A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论