|
在arch/powerpc/kernel/head_8xx.S 中:
start_here:
/* ptr to current */
lis r2,init_task@h
ori r2,r2,init_task@l
/* ptr to phys current thread */
tophys(r4,r2)
addi r4,r4,THREAD /* init task's THREAD */
mtspr SPRN_SPRG3,r4
li r3,0
mtspr SPRN_SPRG2,r3 /* 0 => r1 has kernel sp */
/* stack */
lis r1,init_thread_union@ha
addi r1,r1,init_thread_union@l
li r0,0
stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
bl early_init /* We have to do this with MMU on */
执行start_here的时候,MMU已经打开,但early_init中调用reloc_offset函数:
_GLOBAL(reloc_offset)
mflr r0
bl 1f
1: mflr r3
LOAD_REG_IMMEDIATE(r4,1b)
subf r3,r4,r3
mtlr r0
blr
函数本身比较简单,只是计算运行地址和链接地址的差值,但问题在于:
如果在MMU已经打开的情况,在start_here中的代码它们的运行地址和链接地址的差别已经在initial_mmu中设置好了:
即
逻辑地址-KERNELBASE=物理地址
我认为reloc_offset只能返回0,但明显不对,否则这个函数就没有意义了,请大侠指点 |
|