zoukankan      html  css  js  c++  java
  • WINCE Launch函数分析

    ********************************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

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/liang123/p/6325787.html
Copyright © 2011-2022 走看看