公开/公告号CN102207882A
专利类型发明专利
公开/公告日2011-10-05
原文格式PDF
申请/专利权人 杭州中天微系统有限公司;
申请/专利号CN201110141121.4
申请日2011-05-27
分类号G06F9/45;
代理机构杭州天正专利事务所有限公司;
代理人王兵
地址 310012 浙江省杭州市西湖区华星路99号创业大厦A409
入库时间 2023-12-18 03:26:04
法律状态公告日
法律状态信息
法律状态
2013-07-24
授权
授权
2011-11-23
实质审查的生效 IPC(主分类):G06F9/45 申请日:20110527
实质审查的生效
2011-10-05
公开
公开
技术领域
本发明涉及RISC处理器应用程序的编译和链接技术领域,尤其是一种应用程序编译中立即数的锚地址装载方法。
背景技术
在基于RISC处理器的嵌入式系统开发中,处理器编译和链接是必不可少的工具,编译模块将用户高级语言(一般为C/C++语言)编写而成的代码转换为处理器可识别的二进制代码,链接模块则将多个这样的二进制代码模块一起链接成为可以在处理器上运行的二进制可以执行程序。由于32位RISC架构处理器无法直接在指令中编码32位地址立即数,所以当前业内RISC架构处理器都是通过访问内存指令如LOAD指令来完成装载地址立即数,存在效率低和代码密度低的问题。目前RISC处理器应用程序的编译链接中,地址立即数装载主要采用处理器的访问内存指令,如LOAD指令完成。
嵌入式RISC处理器的访问内存指令一般需要占用外部数据地址总线,需要多个周期完成,从而导致该指令比一般的运算类,如加法指令运行效率更低。所以通过访问内存指令来装载地址立即数虽然实现简单,但是效率低,除了访问内存指令外,还需要额外的空间来存放32位的地址立即数。
发明内容
为了克服已有RISC处理器应用程序编译中立即数装载方法的工作效率低、占用额外的存储空间、实时性差的不足,本发明提供一种提升工作效率、不需要消耗额外内存空间、实时性良好的RISC处理器应用程序编译中立即数的锚地址装载方法。
本发明解决其技术问题所采用的技术方案是:
一种RISC处理器应用程序编译中立即数的锚地址装载方法,所述应用程序包括代码段和数据段;
为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式(Rx)+{IAx-(Rx)}对应的处理器加法指令实现锚地址装载;
同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式(Ry)+{IAy-(Ry)}对应的处理器加法指令实现锚地址装载。
进一步,所述锚地址装载方法包括以下步骤:
(1)为应用程序分配两个寄存器Rx,Ry,分别用于存放代码段锚地址和数据段锚地址;
(2)定义代码段地址立即数锚地址装载的重定位信息数组ARx,并做初始化;如果应用程序的代码段的地址Lx处需要装载属于代码段的地址立即数IAx到寄存器Rm,则生成一个代码段重定位信息RELx存放在数组ARx中,该信息包含需要重定位的代码段地址Lx,代码段符号地址立即数IAx和寄存器Rm;
(3)定义代码段地址立即数锚地址装载的重定位信息数组ARy,并做初始化;如果处理器应用程序的代码段的地址Ly处需要装载属于数据段的地址立即数IAy到寄存器Rn,则生成一个数据段重定位信息RELy存放在数组ARy中,该信息包含需要重定位的代码段地址Ly,数据段符号地址立即数IAy和寄存器Rn;
(4)对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为At和数据段锚地址为Ad;
(5)对各输入的代码段和数据段进行链接时,扫描步骤(2)输出的重定位信息数组ARx,对数组中每个代码段重定位信息RELx做如下操作:
(5.1)根据步骤(2)中生成的RELx所包含的IAx和步骤(4)中暂存的At,计算IAx-At,暂存为代码段立即数偏移量OFFSETx;
(5.2)在RELx包含的Lx处,生成Rm<-(Rx)+OFFSETx对应的处理器加法指令;
(6)对各输入的代码段和数据段进行链接时,扫描步骤(3)输出的重定位信息数组ARy,对数组中每个数据段重定位信息RELy做如下操作:
(6.1)根据步骤(3)中生成的RELy所包含的IAy和步骤(4)中暂存的Ad,计算IAy-Ad,暂存为数据段立即数偏移量OFFSETy;
(6.2)在RELy包含数的Ly处,生成Rn<-(Ry)+OFFSETy对应的处理器加法指令;
(7)将步骤(1)的Rx初始化为步骤(4)暂存的代码段锚地址At,步骤(1)的Ry初始化为步骤(4)暂存的数据段锚地址Ad。
本发明的有益效果主要表现在:
1)对地址立即数的装载不涉及访问内存,应用程序的运行效率高;
2)不需要消耗额外的内存空间,提高了应用程序的代码密度;
3)可以有效降低CPU对外部总线的占用率,提高系统实时性;
4)该方法可以在多种RISC处理器的编译链接模块中实现,有很强的移植性;
5)该方法对RISC处理器的编译链接模块的改动很小,改动代价低。
附图说明
图1是支持地址立即数锚地址装载的应用程序编译链接示意图;
图2是编译模块中地址立即数的锚地址装载执行遍流程图;
图3是链接模块对地址立即数的锚地址装载流程图。
具体实施方式
下面结合附图对本发明作进一步描述。
参照图1~图3,一种RISC处理器应用程序编译中立即数的锚地址装载方法,所述应用程序包括代码段和数据段;
为应用程序的代码段分配一个通用寄存器存放代码段锚地址Rx,并将其初始化为代码段的基地址,当应用程序需要装载一个代码段符号地址立即数IAx时,采用公式(Rx)+{IAx-(Rx)}对应的处理器加法指令实现锚地址装载;
同时,为应用程序的数据段分配一个通用寄存器作为数据段锚地址Ry,并将其初始化为数据段基地址,当应用程序需要装载一个数据段符号地址立即数IAy时,采用公式(Ry)+{IAy-(Ry)}对应的处理器加法指令实现锚地址装载。
参照图1,具体实施包括如下步骤:
(1)编译模块中,为处理器应用程序分配两个寄存器Rx,Ry,分别用于存放代码段锚地址和数据段锚地址,并参照图2的200以插件的方式增加立即数锚地址装载执行遍;
(2)参照图2的201,定义代码段地址立即数锚地址装载的重定位信息数组ARx,并做初始化,数组中每个成员变量包含需要重定位的代码段地址Lx,被装载的立即数和装载的目标寄存器;
(3)参照图2的202,定义代码段地址立即数锚地址装载的重定位信息数组ARy,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;
(4)参照图2的203~206,如果处理器应用程序的代码段中需要装载属于代码段的地址立即数A_Func到寄存器Rm,则生成一个重定位信息RELx存放在步骤(2)所初始化的数组ARx中,该信息包含需要重定位的代码段地址Lx,代码段的地址立即数A_Func和寄存器Rm;
(5)参照图2的207~210,如果处理器应用程序的代码段中需要装载属于数据段的地址立即数A_Data到Rn,则生成一个重定位信息RELy存放在步骤(3)所初始化的数组ARy中,该信息包含需要重定位的代码段地址Ly,数据段的地址立即数A_Data和寄存器Rn;
(6)在链接模块中,对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为At和数据段锚地址为Ad,同时参照图3的300,以插件方式增加立即数锚地址重定位过程;
(7)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(4)输出的重定位信息数组ARx,对数组中每个重定位信息RELx做如下操作:
(7.1)根据(4)中生成的RELx所包含的A_Func和步骤(6)中暂存的At,参照图3的301,计算A_Func-At,暂存为代码段立即数偏移量OFFSET_A_Func,即OFFSET_A_Func=A_Func-At;
(7.2)参照图3的302和303,在RELx包含的Lx处,生成Rm<-(Rx)+OFFSET_A_Func对应的处理器加法指令;
(8)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(5)输出的重定位信息数组ARy,对数组中每个重定位信息RELy做如下操作:
(8.1)根据(5)中生成的RELy所包含的A_Data和步骤(6)中暂存的Ad,参照图3的304,计算A_Data-Ad,暂存为数据段立即数偏移量OFFSET_A_Data,
即OFFSET_A_Data=A_Data-Ad;
(8.2)参照图3的305和306,在RELy包含数的Ly处,生成Rn<-(Ry)+OFFSET_A_Data对应的处理器加法指令;
(9)在应用程序启动时,将步骤(1)的Rx初始化为步骤(6)暂存的代码段锚地址At,步骤(1)的Ry初始化为步骤(6)暂存的数据段锚地址Ad。
实例:在RISC处理器编译模块和链接模块中使用本方法实现将myFunction装载到myCallback函数指针变量,将myData的地址装载到myDataPTR整数指针变量。实现本实施例具体所包含的步骤如下:
(1)在编译模块中,为处理器应用程序分配两个寄存器R30,R31,分别用于存放代码段锚地址和数据段锚地址,并参照图2的200以插件的方式增加立即数锚地址装载执行遍;
(2)参照图2的201,定义代码段地址立即数锚地址装载的重定位信息数组ARRAY_Relocation_Text,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;
(3)参照图2的202,定义代码段地址立即数锚地址装载的重定位信息数组ARRAY_Relocation_Data,并做初始化,数组中每个成员变量包含需要重定位的代码段地址,被装载的立即数和装载的目标寄存器;
(4)参照图2的203~206,为myCallback函数指针变量分配寄存器R1,并且发现处理器应用程序的代码段中需要装载属于代码段的地址立即数myFunction到myCallback函数指针变量即寄存器R1,则生成一个重定位信息REL_myFunction存放在数组ARRAY_Relocation_Text中,该信息包含需要重定位的代码段地址Location_myCallback,myFunction函数地址和R1;
(5)参照图2的207~210,如果处理器应用程序的代码段中需要装载属于数据段的myData变量的地址立即数到R2,则生成一个重定位信息REL_myData存放在数组ARRAY_Relocation_Data中,该信息包含需要重定位的代码段地址Location_myDataPTR,myData变量地址和R2;
(6)在链接模块中,对各输入文件的代码段和数据段进行链接,将链接结果重新输出到目标应用程序的代码段和数据段,并暂存输出目标应用程序的代码段锚地址为Address_Text_Start和数据段锚地址为Address_Data_Start,同时参照图3的300,以插件方式增加立即数锚地址重定位过程;
(7)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(4)输出的重定位信息数组ARRAY_Relocation_Text,对数组中每个重定位信息REL_myFunction做如下操作:
(7.1)根据步骤_(4)中生成的REL_myFunction所包含的myFunction和步骤(6)中暂存的Address_Text_Start,计算(myFunction-Address_Text_Start),暂存为OFFSET_myFunction;
(7.2)在REL_myFunction包含的Location_myCallback处,生成R1<-(R30)+OFFSET_myFunction处理器对应的加法指令;
(8)参照图3的300,对各输入的代码段和数据段进行链接时,扫描步骤(5)输出的重定位信息数组ARRAY_Relocation_Data,对数组中每个重定位信息REL_myData做如下操作:
(8.1)根据步骤(5)中生成的REL_myData所包含的myData和步骤(6)中暂存的Address_Data_Start,计算(myData-Address_Data_Start),暂存为OFFSET_myData;
(8.2)在REL_myData包含数的Location_myDataPTR处,生成R2<-(R31)+OFFSET_myData对应的处理器加法指令;
(9)在应用程序启动时,将步骤(1)的R30初始化为步骤(6)暂存的代码段锚地址Address_Text_Start,步骤(1)的R30初始化为步骤(6)暂存的数据段锚地址Address_Data_Start。
机译: 一种非常长的指令字处理器中的立即加载指令的装置,方法和编译器处理
机译: 一种允许和阻止在个人网络中同时使用Internet的用户PC的方法及其用于分析和确定有关NAT(网络地址翻译)的判断的方法,以及是否可以使用流量数据共享NAT的端子数
机译: 一种用于允许和阻止可以同时在私有网络中同时使用Internet的用户PC的方法,用于分析和确定有关NAT(网络地址翻译)的判断的方法可以使用,也可以不使用流量数据。共享NAT的端子数