当前位置:文档之家› 不同处理器Bootloader的对比

不同处理器Bootloader的对比

计划写这篇文档的时候大概是过年的时候,但由于自己的惰性,中间又有一些事情拖住,现在正好有点时间,把以前的欠账都补回来吧。
真正开始学习Bootloader,是在网上看到杜云海大侠的arm学习报告开始的。感到以前自己在大学里学的太肤浅了,简直什么都不懂,所以趁热打铁,难得自己有这份雅兴,对Bootloader深入的学习一下吧,哈!
所谓Bootloader,就相当于我们平时说的BIOS,就是在我们的主code运行之前的一段程序。系统在上电的时候,并不是马上就能跳到我们的main()函数来执行,道理是显而易见的,我们用的CPU和我们人脑比起来太傻了,他需要我们告诉他如何初始化,比如设置运行模式啊,设置他的心跳频率啊等等。况且CPU一开始也找不到我们的main函数在哪。所有的这些,都是由我们的这段神秘的Bootloader完成的。
Bootloader到底是什么,根据我的理解,Bootloader就是完成一大堆的芯片初始化,然后把编译器给我们分好的section各回各家,各找各妈。最后,Bootloader的使命完成了,就把CPU的使用权,乖乖地交给我们的main函数,(经常看到类似的ldr pc,GotoMain)来完成更加神圣的使命。我们一般会有多少sections呢?RO段,RW段和ZI段。其实,Bootloader还有一个很艰巨的任务就是remap。关于remap,网上有人给出了精妙的分析:
1)如果处理器有专门的寄存器可以完成Remap。那么Remap是通过Remap寄存器的相应bit置1完成的。
如Atmel AT91xx
2)如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。如samsung s3c4510 .
3)如果上面两种机制都没有,那么Remap就不要做了。因为处理器实现决定了SDRAM对应的bank地址是不能改变的。如Samsung S3c2410.
网上有位大侠对第三条提出了质疑:
如果上面两种机制都没有,那么Remap就不要做了,它给的典型例子是Samsung S3c2410 ,2410虽然sdram对应的bank地址不能改变,但它有MMU功能, MMU可以起到remap的作用,常用的最典型的应该是例子Samsung S3c44b0,它既没有mmu,又SDRAM对应地址有没办法改变.
我比较赞成上面这位大侠的观点。
我一开始学习ARM的时候,是从LPC2210开始的,想想那时学的真是一塌糊涂,ZLG的教材看了好多遍,就是不理解存储器的重映射。现在终于明白一些了。LPC2210又不同于以上三种情况,它虽然也有硬件remap功能,但LPC2210重映射的只是中断向量这一部分。LPC2210有一个很主要的寄存器MEMMAP,MEMMAP[1:0]的定义如下
---------------------------------------------------------
| 00 |中断向量从Boot Block重新映射 |
-----------------------------------------------

----------
| 01 |用户Flash模式,中断向量不映射,片内有flash的才用|
---------------------------------------------------------
| 10 |中断向量从RAM重新映射,调试状态用 |
---------------------------------------------------------
| 11 |中断向量从外部Flash重新映射,这是我们正常使用的 |
---------------------------------------------------------
在系统上电时,BOOT1和BOOT0引脚和MEMMAP寄存器控制着系统如何启动。当我们拿到EasyARM2200时,是不是感到过疑问的,当我们的程序在片外Flash运行时,设置的FLASH为Bank0(0x8000 0000 到0x801f ffff),RAM为Bank1(0x8100 0000到0x8107 ffff)。而无论什么系统,PC指针总是从0x0000 0000开始运行的。那么,LPC2210是如何运行的呢?
答案也是在ZLG的那本教程里面,存储器重新映射有段代码,是关于片外Flash启动程序的分散加载文件的:
*************************************************
ROM_LOAD 0x80000000
{
ROM_EXEC 0x80000000
{
Startup.o (vectors, +First)
* (+RO)
}

IRAM 0x40000000
{
Startup.o (MyStacks)
}

STACKS_BOTTOM +0 UNINIT
{
Startup.o (StackBottom)
}

STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}

ERAM 0x81000000
{
* (+RW,+ZI)
}

HEAP +0 UNINIT
{
Startup.o (Heap)
}

HEAP_BOTTOM 0x81080000 UNINIT
{
Startup.o (HeapTop)
}
}
****************************************************************
ROM_EXEC 0x80000000
{
Startup.o (vectors, +First)
* (+RO)
}
这段代码的意思就是说,0x8000 0000开始的一段放置Startup.o中的vectors, 也就是first放置中断向量表,接下来放置其他的
RO段。这样既可以把中断向量表定义到0x8000 0000 处。当LPC2210复位时,当BOOT1 and BOOT0不是11,且MEMMAP[1:0]是10时,则芯片自动将0x8000 0000--0x8000 003f映射到0x0000 0000--0x0000 003f,实现程序的启动。
下面索性就谈谈几款处理器在remap的对比。
上面说的是LPC2000系列的,接着谈谈高丽棒子Samsung的几款。
首先说说44b0。44b0还是比较中规中矩的,这款处理器就是我们一开始说的那种没有remap能力的。既然没啥特殊的本事,那就老老实实的干活吧。打开44b0的datasheet,它有Total 8 memory banks:
6 memory banks for ROM, SRAM etc.
2 memory banks for ROM, SRAM, FP/EDO/SDRAM etc .
---------------------------------
|SROM/DRAM/SDRAM(nGCS7) |
|0x0e00 0000-0x1000 0000 |
---------------------------------
|SROM/DRAM/SDRAM(nGCS6) |
|0xc00 0000-0x0e00 0000 |
---------------------------------
|SROM(nGCS5) |
| |
---------------------------------
|SROM(nGCS4) |
| |
---------------------------------
|SROM(nGCS3)0x0600 0000 - |
| 0x0800 0000 |
--------------------------------

-
|SROM(nGCS2)0x0400 0000- |
| 0x0600 0000 |
---------------------------------
|SROM(nGCS1)0x0200 0000- |
| 0x0400 0000 |
---------------------------------
|Special function |
|Registers (4M bytes) |
---------------------------------
|SROM(nGCS0)0x0000 0000- |
| 0x01c0 0000 |
---------------------------------
我们看看优龙的44b0开发板资源是如何分配的:
(nGCS0):FLASH(SST39VF1601)2MB NOR FLASH
(nGCS1):NAND FLASH(K9F2808)16MB
(nGCS2):IDE/ATA
(nGCS3):RTL8019
(nGCS4):D12
(nGCS6):SDRAM(K4S641632)8MB
看到了吧,0地址处必须安排FLASH,而且必须是NOR的才行。

接下来看看棒子的另一款比较常用的处理器4510.S3C4510就是上面说的第二种情况:
如果处理器没有专门的寄存器,但是memory的bank控制寄存器可以用来配置bank的起始地址,那么只要把RAM的起始地址编程为0x0,也可以完成remap。
杜云海大侠的文章就是写的这款CPU。
同样是打开4510的datasheet,有这样一段话:
The reset values for the next pointer and base pointer of ROM bank 0 are 0x200 and 0x000, respectively. This
means that a system reset automatically defines ROM bank 0 as a 32-Mbyte space with a start address of zero.
This initial definition of ROM bank 0 lets the system power-on or reset operation pass control to the user-supplied boot code that is stored in external ROM. (This code is located at address 0 in the system memory map.) When the boot code (i.e. ROM program) executes, it performs various system initialization tasks and reconfigures the system memory map according to the application's actual external memory and device configuration.

另外,4510还有一组寄存器ROM/SRAM/FLASH CONTROL REGISTERS (ROMCON)(ROMCON0-ROMCON5)就是用来改变当前的bank 用途的。这组寄存器可以改变当前的bank的起始地址和终止地址。知道这组寄存器的妙用了吧,举个例子,比如ROM/SRAM/Flash bank 0在系统启动时,地址设置为0x0000 0000- 0x001f ffff,2MB。DRAM bank 0地址设置为0x0020 0000-0x0120 0000,16MB.
等Bootloader完成RO,RW,ZI段的复制,比如将原来从0x0000 0000以后的RO段复制到0x0020 0000后,改变这组寄存器,也即改变ROMCON0的起始地址为0x0020 0000-0x003f ffff。改变DRAMCON0的地址为0x0000 0000-0x0100 0000,于是,代码顺理成章地变成在RAM运行了,这就是所谓的remap.

接下来看棒子的另一款处理器S3C2410.2410也是属于那种没有remap能力的处理器。而且最让人纳闷的2410居然可以只用NAND FLASH就可以运行起来。我以前有篇日志已经对2410做过分析,关键的关键是2410有一个Steppingstone功能,很巧妙的解决了NAND FLASH不能启动的问题,现在我直接把这篇日志贴过来。
***********************************
《硬件的差异--读vivi代码所想》
***********************************
我在读vivi 的代码分析

时,看到代码中有一条语句是将vivi的所有代码从NAND flash copy 到SDRAM,忽然想到,系统

所有的代码都是放在nand 里面的话,系统是如何运行的,众所周知,NAND 是不支持程序直接运行的,就算要把代码

copy到NAND里面去可以使程序跑起来,但在这之前呢,就是前面所说的寄存器等初始化是如何运行起来的呢,还有,这

个copy nand to sdram的程序是如何运行的呢。带着这个疑问,我寻找了一些资料,原来,高丽棒子的S3c2440 有一个

Steppingstone这个小石头在作怪,哈!

S3c2440内置了一块名为Steppingstone 的SRAM缓存来支持Bootloader从NADN里面启动,而不需要Bootloader存放

在NOR里面(注:NOR flash是支持程序在其内部直接运行的)。

S3C2440A boot code can be executed on an external NAND flash memory. In order to support NAND flash boot
loader, the S3C2440A is equipped with an internal SRAM buffer called ‘Steppingstone’. When booting, the first 4
KBytes of the NAND flash memory will be loaded into Steppingstone and the boot code loaded into Steppingstone
will be executed.
Generally, the boot code will copy NAND flash content to SDRAM. Using hardware ECC, the NAND flash data
validity will be checked. Upon the completion of the copy, the main program will be executed on the SDRAM.

这是2440 datasheet的原文,大致意思是为了支持Bootloader从NAND flash启动,硬件支持上点时,将NAND里面的

前4KB的code load到这个叫Steppingstone小石头的SRAM里面,并且这4KB的开始就是PC指针的0x00000000处,也就是从

这里开始执行(will be executed)。并且这段代码将被ECC校验其正确性,以保证程序这段程序可以正确启动。

现在的问题是Bootloader肯定不止4KB大小的,考虑到Bootloader一般分为step1和step2,正好把step1放在

这个小石头好了,余下的工作就让这个小石头里面的代码完成吧。这样是做是最完美的了,现在就剩下最后一个

question了,就是如何跳到step2啦!这个语句就是
*********************************************
bl main @ call main
*********************************************


上面比较了不同的处理器remap的不同,下面我想谈谈一开始我说的那个各个段各回各家的事情,这个的学名应该叫做relocate (地址重定位)。这应该是Bootloader最核心最麻烦的一块了。太多了,还是下回分析吧,今天就写到这里吧,哈。

相关主题
文本预览
相关文档 最新文档