APPLIED 0120-92751
在操作系统启动前,要先运行一段程序.这段程序就是BootLoader,即启动装载程序,它相当于PC机上的BIOS。通过这段程序,可以实现硬件设备的初始化,建立内存卒问映射等一系列初始化工作,从而将系统的软硬件环境初始化为一个合适的状态.以便为装载操作系统作好准备。在系统加电或复位后,CPU通常都是从一个预先定义的地址上取指令,而在嵌入式系统中,通常将某种类型的固态存储设备(如ROM、FIash等)映射到此地址处。通过烧写工具把BootLoader的映像烧写到这种固态存储设备上,在系统加电或复位后CPU就可以从这种固态存储设备上取指令执行BootLoader以实现系统的启动。由于在ROM及Flash等存储设备中程序的执行速度与效率不及程序在RAM中的执行速度与效率,因此在嵌入式程序设计中,通常都会有程序拷贝的操作。所谓程序拷贝,就是在程序运行过程中,通过软件的方法将周化在ROM或Flash中的程序拷贝到RAM中,然后再跳转到RAM相应地址继续执行程序。
1系统硬件平台及VIVI简介
本实验平台的处理器采用的是SamSung公司的S3C2410.它是基于AR***20T内核的处理器,片外存储器采用了64MB的SDRAM、32MB的NandFlash、2MB的NorFlash及4KB的片上SRAM,其中SDRAM映射到基地址为Ox30000000的存储空间,本实验平台支持两种方式启动,即NandFIash启动和NorFlash启动,这两种启动方式以跳线方式进行选择。
VIVI是由韩国Mizi公司开发的一种针对AR***的BootLoader,支持S3C2410。与其它的Bootloader相比,它具有容易理解,易于移植等优点。它有两种工作模式:启动加载模式和***模式。它的启动分为两个阶段,Stage1阶段和Stage2阶段。Stage1主要用汇编语言编写,主要进行与CPU核有关的一些寄存器的配置以及进行一些必要的初始化工作,这部分代码与具体的CPU体系结构依赖性很大。Stage2用一般的C语言编写,用来实现一些初始化工作,如建立内存映射,初始化驱动等,这部分代码会被拷贝到RAM中执行。本文要研究和论述的主要在Stage1阶段。
2NandFlash启动过程分析
NandFlash使用I/O口串行地存取数据,它不映射到存储空间中任何一个BANK区域上.对NandFlash的渎写操作通过串行数据总线进行传输。NandFlash以页(page)为单位进行读写,以块(block)为单位进行擦除,本文用到的NandFlash页(page)大小为(512+16)Byte,块(block)大小等于32个页的大小。每页的***后16Byte不用于存储程序数据,它主要用于存储ECC校验、标志位等信息。对NandFlash的操作主要是通过向NandF1ash控制器发送命令来进行的,对不同型号的NandFlash,其命令有所不同。由于NandFlash以块(block)为单位进行擦除,以页为单位进行写入,所以擦除与写入的速度都很快。
由于NandFlash不能芯片内执行,S3C2410必须提供一种机制支持从NandFlash启动。S3C2410提供了这样一种机制,当设置为Nandflash启动时,系统加电或复位后,使能NandFlash控制器的自动启动模式,NandFlash中的前4KB代码自动地被拷贝到位于CPU内部的称为Steppingstone的SRAM中,这是启动代码的***次拷贝,这次拷贝由硬件自动完成.然后这块SRAM被映射到存储空间中的000000000处,CPU从这个地址处开始执行启动代码。
由于CPU内部的SRAM仅有4KB,不能保证整个VIVI都被从NandFlash中拷贝到CPU内部的SRAM中,所以这前4KB的代码要保证完成把整个VIVI从NandFlash拷贝到执行效率更高的RAM中运行以及程序的跳转任务,此时从NandFlash到SDARM的拷贝过程就是所谓的软件拷贝。
3程序拷贝过程分析
3.1VIVI的编译与链接
编泽器对程序的处理要经过预编译阶段、编译阶段、汇编阶段及链接阶段,每个目标文件都有一系列段(section),输入文件的段(section)称为输入段(inputsection).输出文件的段(section)则称为输出段(outputsection)。在VIVI的链接过程中,用到了一个链接脚本文件,它描述了各个输入文件的各个段(section)如何映射到输出文件的各个(section)中,并控制输出文件中secrion和符号的内存布局,此内存布局决定了VlVI的运行时域。在此阶段,链接器LD利用链接脚本把各种目标文件和库文件链接起来,并重定向它们的数据,完成符号解析,***后把所有的目标文件链接成为一个可执行的目标文件,即为可烧写到Flash中的VIVI映像。针对本系统开发板的VIVI链接脚本对原链脚本进行了改进,添加了第<6>行,下文的论述会用到此处的变量viviend。
<1>SECTI***{
<2>.=033f00000;
<3>.text:{*(.text)}
<4>.dataALlGN(4):{*(.data)}
<5>.bssALIGN(4):{*(.bss)*(COMMON)}
<6>vivi_end=.:
<7>}
其中:SECTI***表示段。第<2>行表示当前地址为033f00000,它是text段的起始地址,也是运行时域的起始地址。第<3>行用了通配符*表示所有字符,这里的意思就是说指定的每个目标文件的textsection的内容都放到同一个.text中。第<4>行表示指定的每个目标文件的datasection的内容都放到问一个.data中,而且要四字节对齐。每<5>行表示指定的每个目标文件的bsssection的内容都放到同一个.bss中,所有的普通符号都放到COMMON中,也要四字节对齐。第<6>行是把当前地址赋值给变量vivi_end,它也是运行时域的末地址。
CI615K01 3BSE000756R1
CI630 3BSE011000R1
CI630K02 3BSE011002R1
CI670 3BHT300017R1
CI810B 3BSE020520R1
CI820-2 3BSE013202A1
CS512 3BUR980009R1
CS513 3BSE000435R1
CS513K02 3BSE004773R1
CS513K04 3BSE055760R1
DI621 3BHT300012R1
DO610 3BHT00006R1
DO630 3BHT300007R1
DSAI133 57120001-PS
DSAI110 57120001-DP
DSAI145 5712001-HA
DSAI146 3BSE007949R1
DSAI155 57120001-HZ
DSAI155A 3BSE014162R1
DSAO110 57120001-AT
DSAO120A 3BSE018293R1
DSAX110 57120001-PC/5, 57120001-PC/6
DSAX110A 3BSE018291R1
DSAX452 ABB Advant OCS
DSBB120 4898 0002-A
DSBC173 57310001-KH
DSBC173A 3BSE005883R1
DSBC174 3BSE012211R1
DSCS140 57520001-EV
DSDI 110 57160001-A/13,57160001-A
DSDI 110A 57160001-AAA
DSDO 120 57160001-AK
DSDO 131 ABB Advant OCS
DSDO110 57160001-K
DSDP150 57160001-GF
DSDX180 3BSE003859R1
DSDX180A 3BSE018297R1
DSDX452 5716075-P
DSPC 452 57310303-A
DSPU131 3BSE000355R1
DSRF186 3BSE004383R1
DSRF187 3BSE004985R1
DSRF199 3BSE019299R1
DSSS171 3BSE005003R1
DSTA 001 57120001-PX
DSTA 001B 3BSE018316R1
DSTA 002B 3BSE018317R1
DSTA 131 57120001-CV
DSTA N013 3BNP000177R1
DSTA002A 3BSE015196R1
DSTA002P 3BSE018331R1
DSTC120 57520001-A/2 IN5752-1001-E/03
DSTC190 57520001-ER/1 IN5752-1001-BP/01
DST***06 57520001-DX/1
DST***52 5751017-A/2
DSTD108 57160001-ABD
DSTD120A 57160001-UD 2668 180-99/1
DSTD190 3BSE004723R1
DSTD197 3BSE004726R1
DSTX180 3BUR980025R1
GJR5250000R0353 07KR91B
GJR5250200R1 07SK90R1 GJR5250200R0001
GJR5250500R5101 23KT92, RTU510
GJR5250800R0202 07DO90-S
GJR5251063P1 ABB Advant OCS
GJR5251500R1101 07MK92
GJR5252100R0101 07KT94
GJR5252100***61 07KT94
GJR5252200R0101 07DC92,07DC92E,07DC***,07DC92B
GJR5252300R0101 07AC91
GJR5252800R0100 07KT95
GJR5252800R0200 07KT95
GJR5253000R0160 07KT97C
3BSC950019R1 TK520V030
3BSC950055R1 TK576V050
3BSC950056R1 TK576V115
3BSC950073R27
3BSC950098R1
3BSE016239R1 PM510V08
AI620 3BHT300005R1
AO610 3BHT300008R1 3BSE018184R1
AX670 3BSE000566R1
CI520V1 3BSE012869R1
CI522 3BSE012790R1
CI522AK06 3BSE018453R1
CI526 3BSE006085R1
CI532V01 3BSE003826R1
CI532V02 3BSE003827R1
CI532V03 3BSE003828R1
CI532V04 3BSE003829R1
CI534V02 3BSE010700R1
CI534V04 3BSE010702R1
CI541 3BSE014665R1
CI541V1 3BSE014666R1
CI560 3BUC98002R0001
CI572 3BSE017712R1
CI610 3BHT300003R1
91 GJR5251600R0202 07AI91C
07KP93 GJR5253200R1161
1KGT005200R0003 23WT90 RTU 510
1SAP111100R0170 TB511-ETH
1SAP212000R0001 TU516 TU516 A
1SAP240000R0001 DI524
1SAP250000R0001 AX522 A
1SAP250300R0001 AI523 AI523B4
1SBP260001R1001 86AR230
1SBP260010R1001 07KR51 07KR51-U3.6
1SBP260011R1001 07 KR 51-P30; 07 KR 51-F12
1SBP260012R1001 07KT51 07KT51-U3.6
1SBP260014R1001 07KR51-A3.6
1SBP260021R1001 07CR41-c12
1SBP260051R1001 ICMK14F1-H08
1SBP260100R1001 XI16E1-b10 XI16E1-E4.0, XI16E1-D02
1SBP260101R1001 XO08R1; XOO8R1-B04
1SBP260104R1001 XK08F1 XK08F1-A3.0 XK08F1-A30
1SBP260105R1001 XO16N1-b20 XO16N1-C3.0
1SBP260110R1001 XC32L1 XC32L1-B4.0
1SBP260150R1001 TC50 ABB Advant OCS
1SBP260512R1001 ICMK14F1 ICMK14F1-I09
1SVR440621R5200 LM012 LM012-CXE18RAC
200-BPN 492897301 ABB Advant OCS
200-CICN 492897801 ABB Advant OCS
200-CIE 492897701 ABB Advant OCS
200-IB16 ABB Advant OCS
200-P***G 492898801 ABB Advant OCS