LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1353|回复: 0

powerpc mpc8xx 中early_init, reloca_offset疑问

[复制链接]
发表于 2008-11-27 14:05:55 | 显示全部楼层 |阅读模式
在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,但明显不对,否则这个函数就没有意义了,请大侠指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表