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的截取出来的
通过上图可以知道eboot的入口地址是0x00009d68
根据上图可知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缓存可以减少访问物理内存的次数。
③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就会发挥它的作用,见下图
④data cache
data cache(DCache),cache是高速缓冲存储器,是介于CPU和主存之间的缓冲器,DCache是用于存在正在执行的指令地址附近的一部分数据,供CPU在一段时间内使用。
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开启之后才能被使用的。
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
见下图我们就知道上面代码的意义了。
--->后面待续