Android培训班(95)内核解压过程8

内核在上面处理完关闭中断,并且确认进入系统模式后,就需要解决第一个问题:解决自己到底在那里运行的问题。这个问题,就好比一个人在大海里航行而没有指南针,根本找不到北在那里,急切地想知道方向在那里。如果在白天还可以靠大阳就知道了方向,在晚上可以靠北斗星,在内核里是否也有这样的大自然的指示呢?在内核里没有天然的指示,但可以有人为的,下面就来看看内核到底是怎么添加自己的太阳,自己的北斗星呢。内核在那里运行,在编译时就已经决定了,如果还不了解,可以看前面编译的文章。如果运行地址与编译时的不一致,就会导致很严重的问题产生,内核直接死掉,或者刚运行一段,就不再往下跑了,又或者运行的数据乱七八糟,导致IO口乱输出,很有可能烧掉硬件,导致装入此软件控制的汽车失控的危险。其实软件的重定位技术发展得很快,以前编译出来的软件,都是只能加载到固定的位置运行,不能随便加载运行,因而不适应不同的芯片,不同的地址设计,从而导致不能固定到某个物理地址上运行。现在有了重定位技术,就解决这个问题。虽然增加了复杂性,但适应性更强了。下面就来学习这段代码,如下:


.text

adr r0,LC0

ldmia r0,{r1, r2, r3, r4, r5, r6, ip, sp}

subs r0,r0, r1 @ calculate the delta offset


@if delta is zero, we are

beq not_relocated @running at the address we

@were linked at.

这段代码的第一行text,先声明还是代码段。接着使用adr指令获取LC0的地址,并保存到r0,然后把LC0的内容加载到r1-r6,ip,sp等寄存器。通过减法指令subs来计算LC0的地址与LC0编译保存的地址是否一致,如果一致就跳到标号not_relocated处运行;如果不一致就继续运行下面的重定位代码。

你可能感兴趣的:(android)