android 最新bootloader LK加载kernel的问题
来源:互联网 发布:java ee api 中文下载 编辑:程序博客网 时间:2024/05/16 14:20
- MMU
执行boot命令的时候,会执行以下跳入kernel的函数,这和其他bootloader的做法是一样的,唯一的不同是LK使用了MMU和Cache来支持多线程,所以在跳到内核之前要先disable mmu和cache,代码如下
uboot使用了MMU吗??
体系结构有关,可以打开也可以不打开。一般uboot代码很少,为了简化设计,都是不使用mmu,如果不能绕开mmu的,通过最简单的逻辑地址==物理地址映射方式就可以了。
链接 的时候会指定代码段,数据段的逻辑地址, 这个要和实际运行时候的逻辑地址一致,每个体系结构都会指定cpu上电后的第一个指令的地址,这个很关键。
所以在bootloader中 执行C语言时是否打开MMU都没有关系,关键是跳转时必须close MMU.
- 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 地址.
- android 最新bootloader LK加载kernel的问题
- android 最新bootloader LK加载kernel的问题
- bootloader(lk---->kernel)
- Android源码bootable解析之bootloader LK(little kernel)
- LK bootloader for android
- android bootloader (lk)
- android bootloader (lk)
- android bootloader (lk)
- bootloader (LK)&&android lk bootloader中相关修改指南
- LK bootloader
- 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记
- 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记
- 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记
- 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记
- 深入MTK平台bootloader启动之【 Pre-loader -> Lk -> kernel】
- Android lk bootloader中相关修改指南
- Android 开发之 ---- bootloader (LK)
- Android 开发之 ---- bootloader (LK)
- 深入理解内存分区
- 黑马程序员第二节:String类和Stringbuffer
- Arduino学习 - 1 选择开发板型号 与 入门资料
- 判断是不是回文:使用string类型的迭代器和反向迭代器遍历
- Session工具类:实例1
- android 最新bootloader LK加载kernel的问题
- c#实现16进制和字符串之间转换
- 安朗客户端的无线路由器之路
- #pragma vector
- Fedora 10網卡消失的問題
- 烟台大学ACM OJ之手机后四位尾号问题
- 黑马程序员_常见java问题小计
- hdu1176-免费馅饼
- Hibernate工具类:实例2 HQL查询