免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7581 | 回复: 0

[BootLoader] android 最新bootloader LK加载kernel的问题 [复制链接]

论坛徽章:
0
发表于 2010-05-30 11:54 |显示全部楼层
执行boot命令的时候,会执行以下跳入kernel的函数,这和其他bootloader的做法是一样的,唯一的不同是LK使用了MMU和Cache来支持多线程,所以在跳到内核之前要先disable mmu和cache,代码如下:
  1. void boot_linux(void *kernel, unsigned *tags,
  2.                 const char *cmdline, unsigned machtype,
  3.                 void *ramdisk, unsigned ramdisk_size)
  4. {
  5.         unsigned *ptr = tags;
  6.         void (*entry)(unsigned,unsigned,unsigned*) = kernel;

  7. ................

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

  10.         enter_critical_section();  //关闭中断
  11.         platform_uninit_timer();  //关闭watch dog
  12.         arch_disable_cache(UCACHE); //关闭cache
  13.         arch_disable_mmu(); //关闭mmu

  14.         entry(0, machtype, tags);
  15. }
复制代码
但是,在arch_disable_mmu()之后并没有继续执行entry这个函数,而如果把arch_disable_mmu()去掉,则可以到entry(0, machtype, tags); 但是内核同样跑不起来,可能是进入内核前一定要关闭mmu导致?所以问题的关键还是在arch_disable_mmu();后为什么没有到entry(0, machtype, tags); ?

arch_disable_mmu();的是这样实现的:
  1. void arch_disable_mmu(void)
  2. {
  3.         arm_write_cr1(arm_read_cr1() & ~(1<<0)); //  disable mmu
  4. }
复制代码
arm_write_cr1和arm_read_cr1的实现为:
  1. /* uint32_t arm_read_cr1(void) */
  2. FUNCTION(arm_read_cr1)
  3.         mrc                p15, 0, r0, c1, c0, 0
  4.         bx                lr

  5. /* void arm_write_cr1(uint32_t val) */
  6. FUNCTION(arm_write_cr1)
  7.         mcr                p15, 0, r0, c1, c0, 0
  8.         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 地址.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP