《MTK动态加载平台开发介绍(1).ppt》由会员分享,可在线阅读,更多相关《MTK动态加载平台开发介绍(1).ppt(12页珍藏版)》请在三一办公上搜索。
1、基于MTK平台的应用开发,基本概念,加载器 应用程序不是存储在ROM空间中,而是存储在T卡上。要运行时通过菜单加载到内存中,运行结束后释放内存。平台 所谓的平台就是一个基于一个加载器的APP管理环境。包括程序编译阶段的ADS编译环境,从T卡加载的程序加载器以及程序加载到内存后的运行管理,为了拓展平台的功能,应用程序的下载也会放在平台上实现。,基本原理,输出节区 RO,RW,ZI ADS链接器规定了三种节区:RO,RW和ZI。RO:代码和全局静态只读数据。RW:全局可读写数据。ZI::全局未初始化数据,加载后初始化为0,基本原理,内存映射 程序在加载之前的内存映射(Load view)和加载到内
2、存之后(Execution view)的映射略有不同。(保证RO开始和ZI结尾4个字节对齐),基本原理,代码无关和数据无关 ROPI:函数的调用不是绝对地址的跳转,而是当前pc指针 加上函数地址偏移量的相对跳转.符号的访问,也 是基于pc指针和符号偏移量。ROPI对寄存器的使 用没有影响。RWPI:符号的访问也不是绝对地址的访问,是RW静态基 址寄存器(sb)加偏移量的方式访问。R9寄存器 用于静态基址寄存器。,基本原理,ATPCS ARM-Thumb过程调用标准定义了如何通过寄存器传递参数和返回值。前四个寄存器(R0-R3)用来传前四个参数,后续的参数通过下降式满堆栈来传递的。返回值放在R0
3、当中。另外局部变量的分配是放在R4-R8上,当局部变量多于可用的寄存器时,编译器会把多余的变量存储到堆栈。R9寄存器用于位置无关数据(RWPI)的实现,用来保存静态基址(sb)。,ATPCS,加载器,加载器的任务 加载器最主要的工作就是把T卡上的应用程序加载到内存当中运行。并在程序退出后收回分配的内存空间。为了搭配我们的应用,现在需要在加载器上做更多的工作,例如task的创建数据结构,在自己创建的模块的初始化以及下载模块等。例外,应用程序的加载和下载界面也放在加载器当中实现。,应用程序的加载,1.根据应用程序的大小(RO+RW+ZI)分 配内存空间。2.解析应用程序的头,包括版本号,RO,RW
4、,ZI的大小,并找到入口函数。3.获取RW的基地址,并保存基地址。4.导出(注)MTK函数表供应用程序使用。5.导出(注)MTK全局变量,并保存到结构体当中供应用程序使用。6.应用程序退出后释放内存。注:是从MTK端来看是导出,从T卡程序来看是导入。,应用程序的开发,汇编基本规则 ARM和 Thumb指令集通过使用 PC 相关指令(如 BL)支持与位置无关的代码,或称可重定位的代码(位置无关)。可以编写可重定位的汇编程序代码,但是它必须不含任何地址常数。指向代码的任何文字形式地址必须是相对 PC 的偏移量。在访问地址之前,应使用 ADD 指令加上 PC 的值。代码和数据都可以与位置无关:要使代
5、码能在不同的地址执行,它必须与位置无关或 可重定位。但是,它在固定地址只能访问一组静态 数据。与位置无关的数据要求所有数据访问都是相对于静态 基址寄存器 sb 的。,应用程序的开发,C语言基本规则 编写 ROPI 的 C 和汇编程序代码时:ROPI 段中的代码对同一个 ROPI 段中的符号的每个引用 必须是PC 相对的。ATPCS 不为只读段定义任何其他基址寄存器。一个 ROPI 段中的项的地址不能分配给其他 ROPI 段中的项。ROPI 段中的代码对不同 ROPI 段中的符号的每个引用必须是PC 相 对的。这两个段必须是相对固定的。ROPI 段中的任何其他引用必须是:绝对地址 对可写数据的相对于 sb 的引用 每当 ROPI 段移动时,寻址 ROPI 段中符号的读写字必须进行调整。,应用程序和MTK的交互调用,从T卡程序调用MTK程序,需要通过加载器引入MTK的函数地址,访问方式以绝对地址的方式。从MTK端调用T卡程序中的函数,必须通过加载导出T卡中的函数。导出的函数地址也是绝对地址,调用之前需要重新设置静态基址寄存器,因为MTK程序可能使用了R9寄存器并且没有恢复。,