分类: 嵌入式
2013-02-27 19:41:42
BootLoader
bootloader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,bootloader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的bootloader几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 bootloader设计与实现。S3C2440的启动时读取的第一条指令是在0x00上,分为成nand flash和nor flash上启动。
SDRAM, Nor Flash ,Nand Flash介绍
SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器,同步是指 Memory工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。
Nor Flash有自己的地址线和数据线,可以采用类似于memory的随机访问方式,在nor flash上可以直接运行程序,所以nor flash可以直接用来做boot,采用nor flash启动的时候会把地址映射到0x0000 0000上。mini2440就是直接把vivi直接烧录在nor flash上。
Nand Flash是IO设备,数据、地址、控制线都是共用的,需要软件区控制读取时序,所以不能像nor flash、内存一样随机访问,不能EIP(片上运行),因此不能直接作为boot。
启动方法与区别
Nor Flash 启动:由于类似于memory的随机访问方式,支持XIP即代码直接在Nor Flash上执行,无需复制到内存中。这是由于Nor Flash的接口与RAM完全相同,可随机访问任意地址数据。Nor Flash速度快,数据不易失,可作为存储并执行起到代码和应用程序的存储器,Nor Flash可像内存一样读操作,但擦除和写操作效率很低,远不及内存,一般先在代码的开始部分使用汇编指令初始化外接的的内存部件(外存SDRAM),最后跳到外存中继续执行。对于小程序一般把它烧到Nand Flash中,借助CPU内部RAM(SRAM)直接运行。
Nand Flash 启动:S3C2440把boot loader烧到nand flash上启动,因为在S3C2440里有一个内置的SRAM(stepping stone垫脚石,很形象…),系统启动加电后,Nand Flash控制器会把nand flash上的起始4KB的内容拷贝到SRAM里执行,并把0x0000_0000设置为内部SRAM的起始地址,CPU从内部SRAM的0x0000_0000开始启动,这个过程不需要程序干涉。(CPU会自动从Nand Flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x0000_0000)。CPU是从0x0000_0000开始执行,也就是Nand Flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x0000_0000,只好使用片内SRAM做一个载体。通过这个载体把Nand Flash中大代码复制到RAM(一般是SDRAM)中去执行)。
bootloader 大小对Nand Flash 启动的影响
小于4KB的话(像vboot),在SDRAM里就能boot
大于4KB的话(u-boot,vivi),在SRAM里做一些基本初始化后,再把bootloader的剩余部分拷贝到SDRAM里(>0x30000000)。
\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\
程序员要完成的工作是把最核心的代码放在Nand Flash的前4K中。4K代码要完成S3C2440的核心配置以及启动代码(U-boot)的剩余部分拷贝到SDRAM中。这4K的启动代码需要将Nand Flash中的内容复制到SDRAM中执行。Nand Flash的前4K空间放启动代码,SDRAM速度较快,用来执行主程序的代码。ARM一般从ROM或Flash启动完成初始化,然后将应用程序拷贝到RAM,然后跳到RAM执行。
\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\\\\\\\注意\\\\\\
总结
为什么会有这两种启动方式?
关键还是两种Flash的不同特点造成,NOR FLASH容量小,速度快,稳定性好,输入地址,然后给出读写信号即可从数据口得到数据,适合做程序存储器。Nand Flash总容量大,但是读写都需要复杂的时序,更适合做数据存储器。这种不同就造成了Nor Flash可以直接连接到ARM的总线并且可以运行程序,而Nand Flash必须搬移到内存(SDRAM)中运行。
在实际的开发中,一般可以把bootloader烧入到Nor Flash,进入vivi的菜单(S3C2440的nor flash已经烧录好了vivi),程序运行可以通过串**互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。Nor Flash中的Bootloader还可以烧录内核到Nor Flash等等功能。
经常通过nor flash启动,,之后通过vivi的USB下载功能,把其他的bootloader下载到nand flash里,下载完成后,再通过nand flash启动,测试我们的boot loader。
nor flash适合做代码存储并EIP的,nand flash适合用来作大量数据存储的。