代码重定位的思考.docx

代码重定位的思考.docx

ID:57650837

大小:27.37 KB

页数:6页

时间:2020-08-30

代码重定位的思考.docx_第1页
代码重定位的思考.docx_第2页
代码重定位的思考.docx_第3页
代码重定位的思考.docx_第4页
代码重定位的思考.docx_第5页
资源描述:

《代码重定位的思考.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、代码重定位的思考(1)----PC基址跳转所谓代码的重定位(relocate),就是把可执行代码移动到内存中的另外一个地址去。OS一般会把内核从硬盘COPY到内存中去执行,就是用到了重定位这个技术。可执行代码经过编译,连接和定位之后,代码段和数据段都已经被定位器固定了。那么移动这段代码之后,程序若碰到branch指令,会不会跳到错误的地址去执行呢?为了验证这个问题,笔者以RenesasSH2A体系的CPU为例,来做了相关的测试。硬件平台:CPU和外部SDRAM其中CPU内部包含一小块SRAM程序被下载到外部SDRAM里面执行。笔者将外部SDRA

2、M地址08010000到08010120区间的代码复制到CPU内部SRAM地址FFF80000处,并跳转到FFF80000去执行。08010000到08010120区间包含了flush_cache()和它调用的init_node()的代码。下面是代码拷贝的汇编函数_relocate:MOVML.LR6,@-R15STS.LPR,@-R15MOV.L#H'FFF80000,R0;startaddressoftheinternalRAM.MOV.L#_flush_cache,R1;startaddressofflush_cache()MOV.L#H

3、'8010120,R6;copystopaddressCopy_Loop:MOV.L@R1,R2MOV.LR2,@R0;开始拷贝代码到SRAMADD#H'4,R0ADD#H'4,R1CMP/EQR6,R1BTContinue;ifT=1,copyfinishedMOV.L#Copy_Loop,R3JMP@R3NOPContinue:CLRTMOV.L#H'FFF80000,R5JSR@R5;executeflush_cache()intheinternalRAM.NOPLDS.L@R15+,PRMOVML.L@R15+,R6RTS/N.END下

4、面是flush_cache()的C函数,里面调用另一个函数init_node(),以便让CPU产生branch指令//入口地址为0x08010000voidflush_cache(void){CCNT.CCR1.BIT.ICF=1;CCNT.CCR1.BIT.OCF=1;//入口地址为0x08010028init_node(0);}经过调试,发现程序能正常跳转到地址FFF80000去执行flush_cache(),接下来也能正常跳转到init_node()去执行,CPU完成了代码的重定位。下面我们来看看编译器对flush_cache()生成的地

5、址,机器码和反汇编。移动之前:地址机器码指令08010014D703MOV.L@(H'000C:8,PC),R7;注意这里的R7就是init_node()的入口地址08010016472BJMP@R7;JMP是一条branch指令,用于子函数的跳转移动之后:地址机器码指令FFF80014D703MOV.L@(H'000C:8,PC),R7FFF80016472BJMP@R7我们发现了一个很奇怪的问题,就是移动之前和移动之后的代码是完全不变的,但是程序在执行JMP@R7之后,确都能准确地跳转到0x08010028去执行init_node()。这是

6、为什么呢?很明显,我们发现了MOV.L@(H'000C:8,PC),R7这条指令的与众不同。该指令是把PC的内容加上H'000C:8计算产生的偏移量之和送入R7,于是真相明白了。编译器在遇到branch指令时,是以PC为基址来跳转的。我们来查看该指令。16-bit/32-bitdisplacementPCindirectwithdisplacement(带转移的PC间接寻址)MOV.L@(disp:8,PC),R7TheeffectiveaddressisthesumofPCvalueandan8-bitdisplacement(disp).T

7、hevalueofdispiszero-extended,andisdoubledforawordoperation,andquadrupledforalongwordoperation.Foralongwordoperation,thelowesttwobitsofthePCvaluearemasked.Word:PC+disp*2Longword:PC&H'FFFFFFFC+disp*4由于copy代码的时候,是将flush_cache()和init_node()作为一个整体来COPY的,所以CPU还是可以跳转到init_node()去。最

8、后思考一个问题,如果不把init_node()的代码COPY到SRAM里去,flush_cache()还能不能调用它呢?实验证明,如果把MOV.L#H

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。