zoukankan      html  css  js  c++  java
  • SoC嵌入式软件架构设计之五 :可执行程序的重构

              低端控制器对执行效率要求很高,成本敏感,因而SoC内置SRAM是紧缺资源。代码分块管理就是为了充分利用内存,提高内存的复用效率而提出的一种设计方法。代码分块管理不仅涉及到硬件,同样对操作系统和应用、驱动的设计都有要求,这些模块共同努力以使执行效率达到最高。

              本节讲述代码分块(Bank)管理思想下可执行文件的重构,即对程序编译后的可执行文件进行重新组织、打包,以在加载阶段获得最高的执行效率,减少内存占用。要使执行效率高,意味着可执行文件的格式尽可能简单,解析执行文件的流程简单,相应地,解析过程代码量少,即能够减少内存的占用。

              keil产生的Hex或者Bin,其实也是keil对axf调试文件进行抽取,重新打包生成。Hex和Bin可以通过烧写器下载到flash。GCC工具链会生成可执行格式ELF,也可以离线对ELF格式内容进行抽取,重新打包生产Hex格式,并烧写到flash中。本次讲述的是可执行文件存储在外存储设备(card,nand flash,硬盘)中,在运行前由操作系统将其加载到内存再执行这种情况。

              要对工具链生成的可执行文件(如ELF)进行重构,自然需要熟悉该执行文件的格式,如ELF,里面会包括文件头,SECTION节,符号段,代码段,数据段,还有调试信息等等。而程序的运行往往只需要其中较少的段信息。可执行文件就是要得到必要的段的信息和数据,将不必要的通通删除,并且根据代码分块管理的特点进行自定义格式的编制。这里不再对ELF等标准执行文件进行分析(以后可能另写文章),只描述重构后的目标格式,看看什么段信息和数据是操作系统必要要知道和获取的。

                1. 文件头

                1)格式标识符,如应用,驱动等

                2)版本号

                3)常驻代码段在文件中偏移

                4)常驻代码长度

                5)常驻代码段在内存中的起始地址

                6)常驻数据(.DATA)段在文件中偏移

                7)常驻数据(.DATA)长度

                8)常驻数据段(.DATA)在内存中的起始地址

                9).bss段长度

                10).bss段在内存中的起始地址

                11)程序入口地址ENTRY:第一行代码的地址,不是main哦,是运行时库的一行代码地址

                12)reserved,对齐到扇区或者1024字节。如果是驱动类型,则会增加两个字段:驱动入口地址和驱动退出地址。             

                 2. 代码块头

                 1)第一个Bank组的头,按顺序是第一个Bank的块信息、第二个Bank的块信息、。。。第N个Bank的块信息。一个Bank组最大含有N个Bank,不够的填0.

                 2)第二个Bank组的头,按顺序是第一个Bank的块信息、第二个Bank的块信息、。。。第N个Bank的块信息。一个Bank组最大含有N个Bank,不够的填0.

                 .....

                 有几个Bank组由文件头的格式标识符来判定,由架构师事先约定。

                 每个Bank块的块信息包括:bank块数据(代码和数据)在文件中的偏移,Bank长度,BAnk对应的内存地址。

     

        3.常驻代码段数据,对齐扇区

        4.常驻数据段数据,对齐扇区

        5.第一组Bank的数据,对齐扇区,只记录真实的Bank数据,一个Bank组不够N个bank时不需补0.

                  6. 第二组Bank的数据,对齐扇区,只记录真实的Bank数据,一个Bank组不够N个bank时不需补0.

                  7. 最后一个组的Bank数据。

     

             加载时解析该文件头,获得常驻代码段和数据段的信息,将两者加载到内存,对Bss段清0,然后读取到程序的ENTRY入口,跳到该地址执行即可,简单高效!

             Bank切换时,根据Bank组号和Bank号即快速定位到Bank的段信息地址,读出该Bank在文件中的偏移和Bank长度,进而读取并加载到复用的内存空间。    

  • 相关阅读:
    Two strings CodeForces
    Dasha and Photos CodeForces
    Largest Beautiful Number CodeForces
    Timetable CodeForces
    Financiers Game CodeForces
    AC日记——整理药名 openjudge 1.7 15
    AC日记——大小写字母互换 openjudge 1.7 14
    AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13
    AC日记——加密的病历单 openjudge 1.7 12
    AC日记——潜伏着 openjudge 1.7 11
  • 原文地址:https://www.cnblogs.com/yueqian-scut/p/4018807.html
Copyright © 2011-2022 走看看