注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

WINCE6.0+S3C2443的启动过程---eboot1  

2010-09-20 08:50:56|  分类: wince的bootloade |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

WINCE6.0+S3C2443的启动过程---eboot

我们知道从nboot把eboot从nandflash中拷贝到内存指定的地址后,就接着在这个地址处开始运行eboot了,之后,nboot的工作就完成了,那么那么eboot开始执行的地址在哪里呢?我们看看\Src\Bootloader\Eboot\boot.bib下面的配置

MEMORY

;   Name     Start     Size      Type

;   -------  --------  --------  ----

    ARGS     80020800  00000800  RESERVED

    RAM      80021000  0000B000  RAM    

    STACK    8002c000  0000A000  RESERVED

    EBOOT    80038000  00040000  RAMIMAGE

BINFS    80080000  00021000  RESERVED

我们根据EBOOT的这一项可以知道,EBOOT对应的虚拟起始地址就是0x80038000,实际的物理地址是0x30038000,根据\Src\Bootloader\Eboot\sources下面的内容

TARGETNAME=eboot

TARGETTYPE=PROGRAM

RELEASETYPE=PLATFORM

EXEENTRY=StartUp

可知eboot的入口是StartUp,下面两个图是从eboot.map的截取出来的

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

通过上图可以知道eboot的入口地址是0x00009d68

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

根据上图可知StartUp函数的地址是0x00009d68,所以可以确定eboot的入口地址就是Startup函数,也就是eboot从这个Startup函数开始执行。

1.startup函数

系统上电后第一步就是运行Startup函数的代码,这是一个汇编语言函数,主要其最主要功能是执行芯片级初始化:禁止中断,配置系统时钟频率,复制BootLoader镜像到内存,设置存储器的读写周期,构造内存映射表,启用MMU,并启用虚拟内存等操作。

Startup函数有两条重要的地址定义,定义ram空间的物理基地址和页表的基地址,这是startup函数主要操作的物理地址空间,如下所示

定义RAM空间的物理基地址和页表的基地址

PHYBASE EQU 0x30000000 ; physical start

PTs EQU 0x30010000 ; 1st level page table address (PHYBASE + 0x10000)

; save room for interrupt vectors.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xxxluozhen/archive/2010/08/03/5783705.aspx

⑴startup函数的入口

入口函数首先通过对协处理器的操作来清空TLB、指令Cache和数据Cache

p15是系统控制协处理器,主要是对内存还有cashe进行管理。mcr指令,把ARM寄存器中的值传递到协处理寄存器中。C8 是TLB Control 寄存器,C7是Cache/Write Buf Control 寄存器,

ResetHandler

    ; Make sure that TLB & cache are consistent

    mov     r0, #0

    mcr     p15, 0, r0, c8, c7, 0           ; flush both TLB

    mcr     p15, 0, r0, c7, c5, 0           ; invalidate instruction cache

mcr     p15, 0, r0, c7, c6, 0           ; invalidate data cache

下面为了更好去理解上面这段代码,我们来学习相关知识:

①MCR和MRC

对CP15协处理器的操作使用mcr和mrc两条协处理器指令,这两条指令的记法是从后往前看:mcr是把r(CPU核寄存器)中的数据传送到c(协处理器寄存器)中,mrc则是把c(协处理器寄存器)中的数据传送到r(CPU核寄存器)中。对CP15协处理器的所有操作都是通过CPU核寄存器和CP15寄存器之间交换数据来完成的。

②TLB

TLB(translation lookaside buffer),旁路转换缓冲区,或称页表缓冲,里面存放的是一些页表文件(虚拟地址到物理地址的转换表),TLB是MMU中的一块高速缓存(也是一种cache),它缓存最近查找过的V对应的页表项,如果TLB里缓存了当前VA的页表项就不必做Translation Table Walk(也就是从发出VA到定位到PA的过程)了,否则去物理内存中读出页表项来保存在TLB中,TLB缓存可以减少访问物理内存的次数。

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

③instruction cache

instruction cache(ICache),cache是高速缓冲存储器,是介于CPU和主存之间的缓冲器,ICache是用于存在正在执行的指令地址附近的一部分指令,供CPU在一段时间内使用。

当系统上电或重起(Reset)的时候,ICaches功能是被关闭的,我们必须往lcr bit置1去开启它,lcr bit在CP15协处理器中控制寄存器1的第12位(关闭ICaches功能则是往该位置0)。ICaches功能一般是在MMU开启之后被使用的(为了降低MMU查表带来的开销),但有一点需要注意,并不是说MMU被开启了ICaches才会被开启,正如本段刚开始讲的,ICaches的开启与关闭是由lcr bit所决定的,无论MMU是否被开启,只要lcr bit被置1了,ICaches就会发挥它的作用,见下图

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

④data cache

data cache(DCache),cache是高速缓冲存储器,是介于CPU和主存之间的缓冲器,DCache是用于存在正在执行的指令地址附近的一部分数据,供CPU在一段时间内使用。

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

ARM920T有16KB的ICache,也有16KB的DCache,另外外加4KB的steppingstone,那么S3C2440自带的RAM有36KB.

与ICaches一样,系统上电或重起(Reset)的时候,DCaches功能是被关闭的,我们必须往Ccr bit置1去开启它,Ccr bit在CP15协处理器中控制寄存器1的第2位(关闭DCaches功能则是往该位置0)。与ICaches不同,DCaches功能是必须在MMU开启之后才能被使用的。

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客


Eboot是通过下面的操作来disable ICache和DCache的

mcr     p15, 0, r0, c7, c5, 0           ; invalidate instruction cache

mcr     p15, 0, r0, c7, c6, 0           ; invalidate data cache

c7是个只写寄存器,这个寄存器用来管理ICache和DCache,其中包括Invalidate cache

见下图我们就知道上面代码的意义了。

 

WINCE6.0+S3C2443的启动过程---eboot1 - 男儿当自强 - 男儿当自强的博客

 

--->后面待续

  评论这张
 
阅读(760)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017