ARM-Linux嵌入式系统的Boot Loader分析与设计
2 Boot Loader的设计
2.1 中断向量表(二级)的设计与建立
如果有中断或者异常发生时,处理器便会强制性地把PC指针指向向量表中它所对应的中断类型地址值。为了提高中断响应速度,FLASH的0x0地址存放能跳转到0x33FFFF00地址处中断向量的跳转指令,也就是会在在RAM中建立一个二级中断向量表,起始地址为0x33FFFF00。除了复位外,所有的异常入口地址都由FLASH跳转得到,代码如下:
2.2 第二阶段拷贝到RAM
把第二阶段Stage2拷贝到RAM地址的最顶大小为1 MB的开始空间,RAM的起始地址为0x30000000。代码如下所示:
2.3 堆栈指针的设置
用户使用哪些中断决定了系统堆栈的初始化,以及系统需要处理的哪些错误类型。一般情况下,堆栈设置是必须,而且是由管理者自己设置的。如果需要使用IRQ中断,那么IRQ堆栈的设置也是必须的,下面是IRQ堆栈的设置:
3 Stage2的设计
3.1 可执行映像Stage2的入口
由于Glibc库支持的函数不能用于编译和链接Boot Loader这样用C语言编写的程序,因此把main()函数的起始地址作为第二阶段的入口点是最直接的想法。可以用汇编编写一段Trampoline小程序,用CPU跳转指令跳到main()函数去执行,当函数返回时会再次回到Trampoline程序,代码如下:
程序顺利时就不会再回到开始的Trampoline程序,不然就会回到最后的语句,系统就会重新启动。
3.2 内存影射
一般S3C2410上配置的SDRSAM大小为64 MB,该SDRAM的物理地址范围是Ox30000000~Ox33FFFFFF(属于Bank 6)。由Section的大小可知,该物理空间可被分成64个物理段。因为ARM体系结构中数据缓冲必须通过MMU开启,因此Boot Loader效率不是很高,但是MMU可以通过平板映射(虚拟地址和物理地址相同)方式被开启,这样使用内存空间Dcache,从而使Boot Loader的运行速度得到有效的提高。映射关系代码如下:
3.3 装载内核映像和根文件系统映像
像ARM这样的嵌入式CPU通常都是在统一的内存地址空间中寻址FLASH等固态存储设备的,因此从Flash上读取数据与从RAM单元中读取数据一样,用一个简单的循环就可以完成从FLASH设备上拷贝映像的工作:其中count为根文件系统映像的大小或内核映像的大小。
3.4 内核的启动参数的设置
内核启动可以从NAND FLASH(NOR FLASH)中启动运行Linux,需要修改启动命令如下:
LCD启动参数一般都包括root,init和console。noinitrd不使用ramdisk。root根文件系统在MTD分区。Init内核运行入口命令文件。co-nsol内核信息控制台,ttys0表示串行口0;tty0表示虚拟终端。
4 结语
通过对Boot Loader的分析可以看出,设计一个性能优良的Boot Loader可以提高系统的稳定性及实时性,它是嵌入式开发中不可或缺的一部分。只有设计出一个稳定的Boot Loader,才能进行下一步的系统开发工作,直至完成整个嵌入式系统的开发。设计Boot Loader是一项很复杂的工作,需要对硬件资源和所用的操作系统有很深的理解。在实际开发中可以根据需要简化设计,去除不必要的系统功能,这样可以大大提高程序执行的效率和稳定性。这里给出的Boot Loader已经顺利通过了调试,可以正常加载操作系统。
- VxWorks中怎么从Flash BOOT(11-15)
- U-Boot的编译与移植到QT-S3C44B0X开发板上(03-08)
- WinCE系统下BootLoader的开发(04-10)
- 嵌入式linux启动信息完全注释(04-24)
- 基于S3C2410A的嵌入式系统的U-Boot移植(01-24)
- 嵌入式系统 Boot Loader 技术内幕(03-19)