一种U―Boot压缩与自解压实现方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一种U―Boot压缩与自解压实现方法

一种U―Boot压缩与自解压实现方法   摘 要:本文阐述了PowerPC处理器平台的U-Boot[1]压缩和自解压的实现方法,并在PowerPC 8245处理器上成功验证。   关键词:U-Boot;压缩;自解压;PowerPC   中图分类号:TP332   U-Boot是Linux操作系统和PowerPC、ARM、MIPS架构处理器使用的最为常见的一种非压缩方式的Boot Loader,当Boot中增加一些功能时,版本大小会变大。本文研究了一种实现方法,对U-Boot代码做最小的修改即可实现U-Boot版本的压缩和自解压。   1 研究方法、手段   1.1 U-Boot启动流程分析。U-Boot的源代码中PowerPC体系结构的CPU启动代码结构基本一致(图2去除(5)为U-Boot启动流程):(1)系统上电时基本初始化(MMU、Cache等初始化);(2)第一阶段C语言堆栈初始化(使用芯片cache、dpram等作为堆栈);(3)执行第一阶段的第一个C函数cpu_init_f对CPU初始化;(4)执行第一阶段的第二个C函数board_init_f对外围设备、内存控制器等进行初始化,计算出U-Boot被拷贝到Ram中的位置。完成第二阶段的C语言堆栈初始化、以及U-Boot将要使用的全局参数(图1中的(6)bd_t与(7)id)的初始化;(5)执行relocate_code汇编代码,完成以下动作:1)设置第二阶段C语言堆栈指针(使用ram做堆栈,图1中(5)(8));2)代码从flash拷贝到ram;3)Cache操作;4)Got2表修正;5)跳转到Ram中开始执行;(6)执行第二阶段的C函数board_init_r,准备进入Boot主循环。其中的一个重要的步骤trap_init,将内存中的中断/异常向量拷贝到ram中0地址。   U-Boot在不同启动阶段在FLASH/内存中的位置如图1所示:   图1 不同启动阶段U-BOOT在FLASH/内存中的位置   图1(1)(2)显示了非压缩U-Boot在Flash中的位置,图1(11)-(13)显示了压缩U-Boot及解压代码在Flash中的位置,图1(3)-(10)显示了U-Boot在内存中的位置。   1.2 U-Boot压缩实现原则。为了调试和编码方便,压缩U-Boot实现方案考虑以下三个方面:(1)未压缩的U-Boot如果能正常启动,就可以保证压缩后能正常启动;(2)尽量保证启动过程与未压缩时一致;(3)尽量少修改和添加代码。   基于以上三点,结合1.1的分析及图1,设计解压缩方案如下:   保证现有U-Boot代码基本不变,将其进行压缩后,再与执行解压代码编译在一起形成最终放在FLASH/EEProm中的Boot。因此将压缩后U-Boot分为两部分(图1(11)(12)(13)):   第一部分的解压代码(图1(12),以下简称解压代码)将压缩后的U-Boot(图1(13),以下简称压缩U-Boot)解压到内存中,因此解压代码必须完成内存初始化。为了实现方便,解压代码将又由两部分构成,一部分直接来自于U-Boot,仅完成1.1节步骤一到步骤四(图2虚线部分(1)-(4));另一部分为新增代码(图2(5)),完成解压算法,将压缩U-Boot解压到内存并跳转到内存中执行。   第二部分为压缩U-Boot,执行CPU和外设初始化完成后的后续流程,由图2(1)-(4)、(a)、(c)、(d)、(e)、(7)-(9)组成(压缩U-Boot也包含(1)-(4)代码,但永远不会被执行到)。由图2可以看出,压缩U-Boot在U-Boot的基础上简单修改relocate_code函数即可。   图2 U-Boot及压缩后U-Boot启动流程   1.3 压缩U-Boot的编译与启动流程。最终的U-Boot代码由两次编译完成,第一次编译压缩U-Boot,然后使用压缩工具将其压缩生成一个C文件;第二次编译时将压缩生成的C文件与解压代码一起编译生成最终的压缩U-Boot版本文件,图3为整个Boot的生成过程。   图3 代码修改与编译步骤   最终的U-Boot代码执行流程为图2(1)-(5)、(a)、(c)-(e)、(7)-(9),解压代码与压缩U-Boot有重叠,即图2(1)-(4)。解压代码完全在Flash中执行,压缩U-Boot完全在内存中执行,并直接开始从图2(6)relocate_code函数开始执行,且压缩U-Boot包含图2(1)-(4)不被执行。   1.4 修改U-Boot为压缩U-Boot。从图2可以看出,压缩U-Boot与原始代码基本一致,只是去掉了将代码从flash拷贝到RAM的步骤(图2(b))。压缩U-Boot只需

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档