android 最新bootloader LK加载kernel的问题

转自:http://t.chinaunix.net/viewthread.php?tid=1930032

  1. MMU

 执行boot命令的时候,会执行以下跳入kernel的函数,这和其他bootloader的做法是一样的,唯一的不同是LK使用了MMU和Cache来支持多线程,所以在跳到内核之前要先disable mmu和cache,代码如下

void boot_linux(void *kernel, unsigned *tags, 
                const char *cmdline, unsigned machtype,
                void *ramdisk, unsigned ramdisk_size)
{
        unsigned *ptr = tags;
        void (*entry)(unsigned,unsigned,unsigned*) = kernel;

................

for (i = 0; i < 500; i++)
        dprintf("%x ", (char *)kernel[i]);  //打印出kernel地址处的数据,的确是zImage的数据00 00 a0 e1 .... , kernel 地址为0x00208000

        enter_critical_section();  //关闭中断
        platform_uninit_timer();  //关闭watch dog
        arch_disable_cache(UCACHE); //关闭cache
        arch_disable_mmu(); //关闭mmu

        entry(0, machtype, tags);
}

但是,在arch_disable_mmu()之后并没有继续执行entry这个函数,而如果把arch_disable_mmu()去掉,则可以到entry(0, machtype, tags); 但是内核同样跑不起来,可能是进入内核前一定要关闭mmu导致?所以问题的关键还是在arch_disable_mmu();后为什么没有到entry(0, machtype, tags); ?
arch_disable_mmu();的是这样实现的:
void arch_disable_mmu(void)
{
        arm_write_cr1(arm_read_cr1() & ~(1<<0)); //  disable mmu
}

arm_write_cr1和arm_read_cr1的实现为:
/* uint32_t arm_read_cr1(void) */
FUNCTION(arm_read_cr1)
        mrc                p15, 0, r0, c1, c0, 0
        bx                lr

/* void arm_write_cr1(uint32_t val) */
FUNCTION(arm_write_cr1)
        mcr                p15, 0, r0, c1, c0, 0
        bx                lr

所以arch_disable_mmu();的最后一条指令时bx lr , 即返回指令,这条指令也执行了,但奇怪的是为什么entry(0, machtype, tags);这个就不执行了呢?
entry(0, machtype, tags);被反汇编为5条指令,3条push压栈指令,一条mov r0 , #0, 最后是blx r9 , 跳到内核,其中 r9是zImage 地址.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值