********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

时间:2010.12.12

类别:WINCE bootloader开发

********************************LoongEmbedded********************************

备注:基于WINCE6.0+2443的系统

我们知道Eboot中的BootloaderMainOEMLaunch函数来跳转到OS的入口地址转而开始OS的启动,而OEMLaunch函数会调用Launch函数跳转,见下图

1

Launch/Src/Bootloader/Eboot/util.s中定义,因为Launch用汇编语言来来实现的,那么图1中传递进来的物理地址会保存到寄存器r0中,下面是Launch的函数体:

2

下面就来分析这个函数

LEAF_ENTRY Launch

/***************************************************************/

因为此时MMU还没有关闭,eboot的程序在RAM中运行,所以PhysicalStart还是一个虚拟地址,注意了,这里的PhysicalStart不是跳转之前的跳转虚拟地址啊,而是编译器分配为后面PhysicalStart符号表示的地方的安排的地址,具体是多少我不知道,但知道是在0x80038000~ 0x80078000(0x80038000+0x0004000)范围内,这是由eboot/boot.bib下面的内容指定的

MEMORY

; Name Start Size Type

……………………………….

EBOOT 80038000 00040000 RAMIMAGE

所以ldr r2, = PhysicalStart就是把PhysicalStart的虚拟地址保存在让寄存器中。

/***************************************************************/

ldr r2, = PhysicalStart

/***************************************************************/

计算出虚拟地址和物理地址的差值=0x50000000

/***************************************************************/

ldr r3, = (VIR_RAM_START - PHY_RAM_START)

/***************************************************************/

计算出虚拟地址PhysicalStart对应的物理地址值,假如r2=0x80060000,那么进行sub运算之后r2=0x30060000

/***************************************************************/

sub r2, r2, r3

/***************************************************************/

关闭MMU,为什么在ebot中先打开MMU,现在却要关闭呢?因为eboot中药用到微软提供的oal_blcommon.lib,这就是eboot的主控制流实现的函数的库,而这个库的函数是要用到虚拟地址的,所以在eboot中需要打开MMU,但eboot中的MMU只建立了一级页表,而WINCE操作系统后面需要建立二级页表,所以从eboot跳转到oal.exe的入口之前先关闭MMU,然后oal.exe的入口函数Starup接着跳转到的内核函数KernelStart将建立二级页表。

/***************************************************************/

mrc p15, 0, r1, c1, c0, 0

bic r1, r1, #0x0001 ; Disable MMU

mcr p15, 0, r1, c1, c0, 0

/***************************************************************/

关闭MMU后,跳转到PhysicalStart对应的物理地址继续执行,也就是到PhysicalStart标号的地方处接着执行,所以r2的内容必须是要物理地址了。

/***************************************************************/

nop

mov pc, r2 ; Jump to PStart

nop

; MMU & caches now disabled.

PhysicalStart

/***************************************************************/

在跳转到oal.exe的入口地址前,还需要flush TLB操作 ,所以就先跳到PhysicalStart处,做完其他操作之后再跳转到oal.exe的入口函数Starup中。为什么要清除TLB呢?首先要知道TLB(Translation Lookaside Buffer)MMU中的一块高速缓存,也就是一种cache,是CPU内核和物理内存之间的cache,它缓存了最近查找过的VA对应的页表项,这是在eboot中使用的(eboot只建立了一级页表),现在关闭了MMU,所以在跳转到内核之前(操作系统的内核函数KernelStart来建立二级页表)就需要先flush TLB,因为操作系统后面将使用二级页表,保存着ebot的一级页表的VA对应的页表项的TLB中的内容以没有意义,所以要清除,见下图,这是ARM920T数据手册中的相关描述

3

/***************************************************************/

mov r2, #0

mcr p15, 0, r2, c8, c7, 0 ; Flush the TLB

mov pc, r0 ; Jump to program we are launching.

相关帖子:

http://topic.csdn.net/u/20081217/11/f15fa8e3-6215-4f92-b294-17af5b9b38cb.html

WINCE Launch函数分析相关推荐

  1. wince串口驱动分析(转)

    wince串口驱动分析 串行通讯接口主要是指UART(通用串行)和IRDA两种.通常的串行连接电气连接上有3wire和9wire两种.3wire的接线方式下定义了发送.接收和地三根连接.其用途就如名称 ...

  2. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  4. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )

    文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...

  5. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexPathList 构造函数分析 | makeDexElements 函数分析 )

    文章目录 前言 一.DexPathList 构造函数分析 二.DexPathList.makeDexElements 函数分析 三.Element 类分析 前言 上一篇博客 [Android 逆向]整 ...

  6. 【Android 逆向】Android 逆向通用工具开发 ( adb forward 网络端口重定向命令 | PC 端逆向程序主函数分析 )

    文章目录 前言 一.adb forward 网络端口重定向命令 二.PC 端逆向程序主函数分析 前言 本篇博客重点分析 PC 端 hacktool 模块 ; 一.adb forward 网络端口重定向 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具的 main 函数分析 )

    文章目录 一.注入流程 二.注入工具的 main 函数分析 一.注入流程 开始分析 [Android 逆向]Android 进程注入工具开发 ( 编译注入工具 | 编译结果文件说明 | 注入过程说明 ...

  8. 继承关系中的拷贝构造函数和赋值操作重载函数分析

    文章目录 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 1 继承关系中的拷贝构造函数和赋值操作重载函数分析 在继承关系中,如果子类未实现拷贝构造函数,那么在子类进行拷贝构造操作时,会直接调用父类 ...

  9. Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析

    Windows事件等待学习笔记(三)-- WaitForSingleObject函数分析 要点回顾 WaitForSingleObject NtWaitForSingleObject KeWaitFo ...

最新文章

  1. labview 随笔记录
  2. 低噪声放大器和高功放的区别
  3. ubuntu 符号连接的层数过多_Linux符号连接的层数过多解决
  4. configuration 命名空间_kubernetes30:monitoring命名空间处于Terminating状态的处理方法...
  5. Doing Homework HDU - 1074
  6. 福州java培训哪里好_南通java培训哪家好
  7. liferay search container的两种实现方式
  8. 在Wordpress的文章页面获取上一页及下一页的链接URL地址,实现通过键盘的前进后退键进行翻页
  9. js parsefloat 精度_javascript中的float运算精度
  10. RocketMQ系列实战
  11. 大一新生如何h看待大学生活?
  12. C++遇到错误蓝屏电脑代码底层分享!
  13. 营销圈带你从微博推广角度看《延禧攻略》如何完美KO《如懿传》
  14. 爬虫--雪球网爬取(requests 和 request 的两种方法)
  15. 专利代理人资格考试怎么准备
  16. mysql grant priv_mysql怎么将grant priv的权限
  17. 微软Azure组面试(部分)
  18. JDK11源码学习05 | HashMap类
  19. 中国农科院基因组所汪鸿儒课题组诚邀加入
  20. 【BZOJ2152】聪聪可可 树分治

热门文章

  1. @ImportResource
  2. 使用%的符号问题(只与被除数有关)
  3. 054_Unicode字符官方标准五
  4. python re库函数_python re库的正则表达式学习笔记
  5. 计算机程序无权限卸载,无法卸载win7电脑中的软件,提示权限不足怎么办?
  6. 国内一线互联网公司内部面试题库
  7. oralce 数据库监听日志状态及目录:查看监听(使用grid用户登陆):
  8. 第八章 Oralce的管理员密码的管理
  9. C++ 引用通过代码例子理解
  10. python运行不了、显示警告_Python中偶尔遇到的细节疑问(二):UnicodeDecodeError,警告与忽略警告warnings...