您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > arm启动原理及代码分析
ARM启动代码原理和分析内容大纲映像文件ZI未初始化数据段RW数据段LoadAddress加载地址ExecuonAddress执行地址StackPointer栈空间指针内容关键字:RO代码段Boot相关硬件•FlashRom(可作为bootrom的存储器)Boot相关硬件•Nandflash(不可作为bootrom的存储器)Boot相关硬件Boot的主要功能•建立异常向量表•初始化中断•初始化硬件设备•初始化应用程序执行环境•跳转到主应用程序BResetHandlerBHandlerUndefBHanderSWIBHanderPabortBHanderDabortB(保留)BHandlerIRqBHandlerFIQ0x000x040x080x0c0x100x140x180x1c异常中断向量表的建立初始化硬件•软件的运行离不开硬件,boot必须对硬件进行初始化。硬件的初始化主要通过配置特殊控制寄存器来完成,包括下面几部分:关闭开门狗屏蔽所有的中断初始化PLL和时钟。初始化储存系统初始化应用程序的执行环境•Elf文件的类型:可执行文件、可重定位文件、共享库object(又叫做共享库)文件。•Elf文件的功能:1、用作链接器的输入生成可执行的映像文件2、可装载到内存里运行,完成特定功能的文件。elf文件的物理结构•Elf文件头•Secon:.text.data.bss.symtab•Programheader•可重定位文件与可执行文件的区别:区与段的概念programheaderSystemcodeSystemdataELF头main()intnn=11.symtab.debug.symtabSeconHeaderTableELF头sqr()intnum=10Uninializeddata.symtab.debug.symtabSeconHeaderTableELF头ProgramHeadersSystemcodemain()sqr()Systemdataintnn=11intnum=10Uninializeddata.symtab.debug.symtab.text区.data区.text区.data区.text区.data区.bss区.Text段.Data段.BSS段Hello.oExecuonimageLinkingimage可执行映像文件的逻辑结构由几个可重定位的目标文件的相同属性区组成了可执行映像的段,那么段有组成什么?在逻辑结构里,段组成了更大的组织:域SystemcodeSystemdataELF头main()intnn=11.symtab.debug.symtabSeconHeaderTableELF头main()intnn=11Uninializeddata.symtab.debug.symtabSeconHeaderTableELF头ProgramHeadersSystemcodemain()sqr()Systemdataintnn=11intnum=10Uninializeddata.symtab.debug.symtab输入区ro输入区rw输入区ro输入区rw输入区ZI输出域ro输出域rw输出域ZI输入区ro输入区rw可执行映像文件的逻辑结构Output输出段Output输出段Output输出段域装载域和运行域•域又组成什么呢?当然就是组成可执行文件了,一个映像文件可以包含一到多个域。与看起来有些多余,实际上更为重要的是用域来描述输出区运行前和运行时在存储系统上的位置。所以,域分为装载域和运行域。装载域描述运行前输出段在rom/ram中的分布状态,运行域描述运行时输出段在rom/ram中的分布状态•大多数情况下,映像文件在执行前把它装载到rom中,而当运行时域里的有些输出段必须复制到ram中,程序才能正常运行,所以,在装载和运行时,有些段处在不同的位置(地址空间)。Main()Sqr()SystemdataIntnum=10Uninializeddata输出区ro输出区rw输出区ziIntnum=10SystemdataMain()Sqr()SystemcodeRAMROMUninializeddataSystemdataIntnum=10Main()Sqr()SystemcodeziRw运行域Ro运行域拷贝输出区装载域运行域•由图可以看出,映像文件zi段在装载域里是不存在的,在运行域里才建立的;映像文件在运行时,第一件工作就是把rw输出段复制到ram里的正确位置,第二件工作就是建立zi输出段并初始化为0。这就是应用程序执行环境的初始化。然而,在运行时,代码和数据分布到了不同的地址空间,形成了三个运行域:ro运行域、rw运行域、zi运行域。那么这个过程是如何来实现的?•|Image$$RO$$Base|;BaseofROMcode|Image$$RO$$Limit|;EndofROMcode(=startofROMdata)|Image$$RW$$Base|;BaseofRAMtoinialise|Image$$ZI$$Base|;Baseandlimitofarea|Image$$ZI$$Limit|;分散装载技术•分散装载技术可以把用户的应用程序分割成多个RO运行域和RW运行域,并且给他们指定不同的地址,这在嵌入式系统的实际应用中有很多的好处。在一个嵌入式系统中,flash、16位ram、32位ram都可能存在于系统中,所以将不同功能的代码定位于特定的位置上会大大提高系统的运行效率。•最为常用的两种情况:1、32位的RAM速度快,因此就把中断程序作为一个单独的运行域,放在32位的RAM中,是他相应时间最短。2、程序在RAM中运行,其效率远高于在ROM中运行,所以将启动代码之外的所有代码都复制到RAM中运行,可以提高运行效率。
本文标题:arm启动原理及代码分析
链接地址:https://www.777doc.com/doc-5351804 .html