android 最新bootloader LK加载kernel的问题

2024-04-16 07:48

本文主要是介绍android 最新bootloader LK加载kernel的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. MMU

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


uboot使用了MMU吗??



体系结构有关,可以打开也可以不打开。一般uboot代码很少,为了简化设计,都是不使用mmu,如果不能绕开mmu的,通过最简单的逻辑地址==物理地址映射方式就可以了。
链接 的时候会指定代码段,数据段的逻辑地址, 这个要和实际运行时候的逻辑地址一致,每个体系结构都会指定cpu上电后的第一个指令的地址,这个很关键。



所以在bootloader中 执行C语言时是否打开MMU都没有关系,关键是跳转时必须close MMU.


[cpp]  view plain copy
  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. ................  
  9.   
  10. for (i = 0; i < 500; i++)  
  11.         dprintf("%x ", (char *)kernel[i]);  //打印出kernel地址处的数据,的确是zImage的数据00 00 a0 e1 .... , kernel 地址为0x00208000  
  12.   
  13.         enter_critical_section();  //关闭中断  
  14.         platform_uninit_timer();  //关闭watch dog  
  15.         arch_disable_cache(UCACHE); //关闭cache  
  16.         arch_disable_mmu(); //关闭mmu  
  17.   
  18.         entry(0, machtype, tags);  
  19. }  

但是,在arch_disable_mmu()之后并没有继续执行entry这个函数,而如果把arch_disable_mmu()去掉,则可以到entry(0, machtype, tags); 但是内核同样跑不起来,可能是进入内核前一定要关闭mmu导致?所以问题的关键还是在arch_disable_mmu();后为什么没有到entry(0, machtype, tags); ?
arch_disable_mmu();的是这样实现的:
[cpp]  view plain copy
  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的实现为:
[cpp]  view plain copy
  1. /* uint32_t arm_read_cr1(void) */  
  2. FUNCTION(arm_read_cr1)  
  3.         mrc                p15, 0, r0, c1, c0, 0  
  4.         bx                lr  
  5.   
  6. /* void arm_write_cr1(uint32_t val) */  
  7. FUNCTION(arm_write_cr1)  
  8.         mcr                p15, 0, r0, c1, c0, 0  
  9.         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的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908198

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决