微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux中断向量表搬移设计过程

ARM Linux中断向量表搬移设计过程

时间:11-09 来源:互联网 点击:

我刚才讲过了第一场景的情况,忘了的回到第一场景中去看,两个memcpy的执行过程在图中也有表示,就是蓝色和红色的带箭头的虚线,这就是代码从code view到exec view的拷贝过程,一目了然,不用多说。

现在出现了一个问题,就是我们发现在__vector_start和__vector_end之间的代码有点怪异,我们再次摘到这里来看:

.equstubs_offset, __vectors_start + 0x200 - __stubs_start

.globl__vectors_start

__vectors_start:

swiSYS_ERROR0

bvector_und + stubs_offset

ldrpc, .LCvswi + stubs_offset

bvector_pabt + stubs_offset

bvector_dabt + stubs_offset

bvector_addrexcptn + stubs_offset

bvector_irq + stubs_offset

bvector_fiq + stubs_offset

.globl__vectors_end

__vectors_end:

在第二个场景中我们说过,这叫做位置无关的代码,因为要拷贝到别的地方。而且里面都是跳转指令。我们发现了除了第三个行代码用了绝对地址进行了跳转,其它都是用的b跳转。举个例子,bvector_dabt + stubs_offset,(vector_dabt在__stubs_start和__stubs_end之间),如果你用b vector_dabt,这肯定是有问题的,因为copy之后exec view的组织(map)是不一样的,所以b后这个偏移就不对了。这里面,我们就要对这个偏移进行一次调整。Stubs_offset就是这个调整值,是可以计算出来的,具体的计算过程在图中讲得比较清楚,这里不提了。大家可以在图中看到详细的推导过程。

其实尽管ldrpc, .LCvswi + stubs_offset这条指令用的是绝对地址跳转,用得跳转表的方法,但找地址的过程也用到了这个技术。我们看到

.align5

.LCvswi:

.wordvector_swi

.LCvswi这个位置存储的是一个地址,就是要跳到这个地方。.align 5的意思是32字节对齐,这个是保证cache line对齐的,不提了。在exec view中找这个地址,就得加上个offset.原理是一样的,因为.LCvswi在__stubs_start和__stubs_end之间,这个区域被搬移了,不能直接用这个标签地址了,vector_swi没有被搬移,所以可以直接用。

总结一下。我觉得我要讲的东西虽然是Linux中的技术细节,描述的确是代码搬移过程原理和注意事项。其实更重要的是,我们如何把这一个过程倒过来,即在涉及到代码搬移的场合中如何进行设计,如何运用这些技术实现这一设计过程。你可以遵循这样的指导步骤:

1.画出那个大图来,按自己的要求确定Code view和Exec view,设计搬移区段和设计搬移的位置

2.写出要搬移的代码,运用位置无关的技术(上面提到的)进行编码和检验

3.用类似memcpy的代码进行搬移

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top