ARM Linux --- Bootloader
Bootloader 的概念就是一个用于引导的 loader ,在系统上电的时候最先被运行,然后对硬件平台做最基本的初始化,最后把操作系统加载起来。不同的嵌入式操作系统都有自己的 Bootloader ,但是本质功能都是一样的。
在 WinCE 中用的最多的就是 EBOOT ,是一个基于网络的 Bootloader ,而且可以根据需要带有命令行菜单功能,网络调试功能以及文件系统的相关功能。
在 Linux 中用的最多的就是 u-boot 和 vivi 。
NORFlash with bootloader :
一般 ARM 处理器的片选 0 都会接有 NORFlash ,这样在 ARM 上电以后,会从 0 地址开始执行程序,也就是从 NORFlash 的 0 地址开始执行。所以把 bootloader 烧到 NORFlash 的 0 地址开始的地方,这样在上电以后, bootloader 开始执行,可以在 NORFlash 里面执行,也可以自拷贝到 SDRAM 中执行。最后加载 image 并运行。
NANDFlash Boot with bootloader :
由于 NORFlash 容量小,价格贵,现在很多 ARM 处理器支持 NandFlash 引导。不同厂家的处理器对 Nandflash 的引导略有区别,具体要看 datasheet 。
( 摘自 S3C2410 用户手册 )
S3C2410/S3C2440 支持使用 NAND 来进行启动,但是启动代码并不是直接在 NAND 中执行的。在 S3C2410/S3C2440 中有一块名为 Steppingstone ,大小为 4KB 的 SRAM 。复位后,启动代码先从 NAND FLASH 的前 4KB 复制到 Steppingstone ,再从 Steppingstone 中执行以完成启动。具体过程:
1. 复位;
2. NAND FLASH 的前 4KB 被复制到 Steppingstone 中;
3. Steppingstone 被映射到 nGCS0 ;
4. CPU 从 Steppingstone 中执行启动代码。
在复制 NAND FLASH 的前 4KB 到 Steppingstone 的过程中, ECC 不会被检查,这就必须保证所用 NAND 的前 4KB 没有坏位。如果使用三星的 NAND FLASH ,这一点是完全可以保证的,三星 NAND FLASH 的 Block0 是没有坏位的,访问时不用进行错误校验。使用其他品牌的 NAND FLASH 要看数据手册,确认其 Block0 在出厂时保证无错,方可与 S3C2410/S3C2440 配合使用,进行 NAND 方式的启动。
具体可以参考下面一篇文章:
从 Nand Flash 启动 U-BOOT 的基本原理
http://hi.baidu.com/zengzhaonong/blog/item/4b901ee9b5ef343cb90e2d16.html
-------------------------------------------
前 4K 的问题
如果 S3C2410 被配置成从 Nand Flash 启动 , S3C2410 的 Nand Flash 控制器有一个特殊的功能 , 在 S3C2410 上电后 ,Nand Flash 控制器会自动的把 Nand Flash 上的前 4K 数据搬移到 4K 内部 RAM 中 , 并把 0x00000000 设置内部 RAM 的起始地址 ,CPU 从内部 RAM 的 0x00000000 位置开始启动。这个过程不需要程序干涉。
程序员需要完成的工作 , 是把最核心的启动程序放在 Nand Flash 的前 4K 中。
启动程序的安排
由于 Nand Flash 控制器从 Nand Flash 中搬移到内部 RAM 的代码是有限的 , 所以在启动代码的前 4K 里 , 我们必须完成 S3C2410 的核心配置以及把启动代码 (U-BOOT) 剩余部分搬到 RAM 中运行。
u-boot 源码不支持从 nand flash 启动,可是 s3c2410 支持从 nand flash 启动,开发板 (sbc-2410x) 加电后 s3c2410 将 nand flash 的前 4k( 保存有 u-boot 的部分功能 -- 拷贝功能 -- 把 nand flash 中的内容拷贝到 SDRAM) 拷贝到 sram(s3c2410 芯片内的 sram) 。这就需要修改 u-boot 源码,增加 u-boot 的功能 : 使 u-boot 在得到执行权后能够将其自身拷贝到开发板上 SDRAM 中,以便处理器能够执行 u-boot
-------------------------------------------
启动代码与( vivi 和 u-boot 的 bootloader )联系和区别
INIT.S ,就是一个程序的开始部分,用来初始化板子。
VIVI 和 U-BOOT 本身肯定也是包括板子的初始化代码的。 VIVI 和 U-BOOT 都是 bootloader 的一种。 VIVI 是专门针对 2410 设计的。而 U-BOOT 是比较通用的,可以通过修改配置用到不同的硬件平台上去。 BOOTLOADER 的作用一般是用来调试,烧写 FLASH ,装载操作系统镜像,或者用来装载用户程序。
开发方式 有 2 种:
一种是直接在板子上构建自己的程序,开发类似于单片机,对已板子初始化用 INIT.S 。
另外一种是移植操作系统, linux , vxworks , wince 等嵌入式操作系统。然后在操作系统平台上进一步的开发。为了装载操作系统金额用户程序,因此需要 bootloader 。
参考资料:
1) norflsh nandflash 之类的存储设备启动 bootloader 概述 - josh915 的专栏 - 优快云 博客
http://blog.youkuaiyun.com/josh915/archive/2009/03/27/4030529.aspx
2) Bootloader 介绍 - 嵌入式开发 – cqlouis
http://blog.chinaunix.net/u3/94968/showart_1928756.html
3) 基于 Nandflash 的 Bootloader 的设计与实现
http://www.chinaeda.cn/show.aspx?id=12937&cid=60
4) BootLoader 的基本概念 - 黄起群的专栏 - 优快云 博客
http://blog.youkuaiyun.com/huangqiqun/archive/2007/04/15/1565176.aspx
5) Nand-Flash/Nor-Flash 存储模块设计 -- 山野村夫