《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > 基于S3C44B0X的Bootloader的设计与实现

基于S3C44B0X的Bootloader的设计与实现

2008-04-11
作者:成转鹏,张 跃,张和君

  摘 要: 介绍一种利用GNU工具链开发基于S3C44B0X硬件平台" title="硬件平台">硬件平台的Bootloader的方法,详细分析了Bootloader的构架、内存分布、异常/中断处理以及编译链接过程,说明了Bootloader需要完成的主要任务和实现方法。
  关键词: 引导装载程序 S3C44B0X 嵌入式系统 GNU工具


  Bootloader是系统上电" title="上电">上电/复位后,内核启动程序之前执行的一段程序,其功能是初始化硬件设备后,将操作系统内核从固态存储器中装载到RAM中并引导其运行,它是嵌入式系统开发的一个难点,在整个开发中占有相当大分量。由于高度依赖CPU体系结构和目标板的硬件配置,并没有一个通用的Bootloader程序可供开发者使用,因此需要自行开发或是移植。GNU组织倡导了一整套著名的自由软件,包括Linux操作系统、编译开发工具(gcc,g++,as,ld)、项目开发管理工具make以及基于不同硬件平台的开发库,是目前嵌入式开发者常用的软件开发平台。本文以三星公司的S3C44B0X为硬件平台,利用GUN开发工具,给出了Bootloader的一种设计和实现方案。
1 基于ARM7TDMI内核的S3C44B0X的特点
  S3C44B0X是Samsung公司生产的一款16/32位RISC处理器,为手持设备和一般应用提供了高性价比和高性能的微控制器解决方案,使用ARM7TDMI内核,最高工作频率可达66MHz,拥有71个多功能I/O,并提供了丰富的内置部件,包括8KB Cache和内部SRAM,LCD控制器,2通道UART,带PWM功能的5通道定时器,8通道10位ADC等。S3C44B0X微处理器不具有MMU,不支持虚拟内存管理和内存保护。
2 建立交叉编译环境
  交叉编译就是在一个平台上生成可以在另一个平台上执行的代码,由于嵌入式微处理器S3C44B0X上无法安装人们所需要的编译器,只好借助于宿主机,生成可以在目标机S3C44B0X上运行的代码格式。在本课题设计中,将使用嵌入式开发中最普遍的GNU编译工具。
  为了生成能在S3C44B0X上允许的代码,需要下载脚本文件arm-elf-tools-20030314.sh,然后在宿主机上安装该工具链。GNU软件包括C编译器、C++编译器G++、汇编器AS、链接器LD等,GNU开发工具都是使用命令行的方式,更贴近编译器和操作系统的底层,提供了更大的灵活性,有助于开发者了解系统设计的基础知识。
3 Bootloader的设计与实现
  嵌入式设备与环境中的Bootloader类似于PC系统的BIOS,是系统最底层的引导软件。Bootloader固化在CPU的上电/复位的启动地址处(ARM7TDMI的CPU上电后默认从地址0x0处开始执行)。每当硬件设备上电/复位时,CPU总是先执行Bootloader,初始化硬件设备,改变处理器运行模式和重组中断向量,建立内存空间的映射图,将系统的软硬件环境带到一个由用户定制的特定状态,然后从远程主机或者本地非易失存储设备中装载可执行文件或操作系统,为整个嵌入式系统准备运行环境。
3.1 硬件平台分析
  硬件平台是基于ARM7TDMI RISC内核的samsung公司的S3C44B0X微处理器,整个系统拥有2MB的Flash,其地址从0x00000000-0x001FFFFF,有8MB的SDRAM,其地址从0x0C000000-0x0C7FFFFF,有一个USB1.1接口,及以太网口,还有两个串口" title="串口">串口和一个调试接口。这里将JTAG接口转换为并口连接方式,可直接与计算机的并口相连,避免使用昂贵的JTAG仿真器,串口主要用来输出调试信息和输入用户控制字符。
3.2 Bootloader的具体设计
  每种不同的CPU体系结构都有不同的Bootloader,除了依赖于CPU的体系结构外,Bootloader还依赖具体的嵌入式设备的配置。本文将Boot Loader的设计分为 Stage1和Stage2两大部分,依赖于CPU体系结构的代码,例如设备初始化代码等,通常都放在Stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的,而Stage2则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。
3.2.1 Bootloader的总体构架
  针对硬件平台特点和嵌入式开发中的功能需求,设计了丰富的Bootloader管理功能:串口下载、USB下载、网卡的Tftp服务器、Flash烧写程序、Linux启动程序等。Bootloader工程的目录结构如图1所示,共设置为两级。第一级目录下的Makefile和Bootloader.ld是整个工程的编译文件和链接文件;Stage1.s是Stage1的汇编代码文件。第二级目录为Stage2,其中包括编译文件Makefile、链接文件Stage2.ld、主管理程序Stage2.c,以及各个功能模块Xmodem.c、Usb.c、Tftp.c、Flash.c、Linux.c等。


3.2.2 Bootloader的内存分布
  硬件平台的Flash空间为2MB(0x00000000-0x001FFFFF),SDRAM空间为8MB(0x0c000000-0x0C7FFFFF)。如图2对Bootloader进行内存布局,从零地址处开始存放Bootloader的整体执行映象" title="映象">映象,Stage1部分存放在最开始处,以便系统一上电/复位就能执行Stage1。0x0C700000以上的部分用于放置Stage2的RAM拷贝。0x0C7FFF00以上的255个字节存放中断服务程序的地址,以下部分用作S3C44B0X的5个运行模式(Undef模式、Abort模式、IRQ模式、FIQ模式、SVC模式)的堆栈。


3.2.3 异常/中断处理
  S3C44B0X总共有8种异常/中断,CPU发生异常/中断时,会自动跳转到从0x00000000地址开始的中断向量表" title="向量表">向量表中的某个表项处读取指令运行,由于Bootloader最终要引导μCLinux运行,而μCLinux要求中断向量表设置在可随机读写的RAM中,为了能够与μCLinux兼容,这里设置了两级中断向量表:第一级为零地址处的中断向量表,第二级向量表放在RAM的开始地址0x0C000000处,第一级仅是简单地向第二级跳转。从0x0C7FFF00地址处开始存放各个异常/中断服务程序的地址。
  在异常服务和中断服务处理中,将与中断相关的例行固定不变的任务形成一个“系统函数”,而相应的中断处理任务用C代码编写形成“用户函数”,这样可以提高编程和开发的灵活性,实现了Bootloader良好的接口和封装性能。在其他功能程序中只需要编写“用户函数”,并可以将“用户函数”的地址任意重构到0x0C7FFF00开始的RAM中。异常/中断的整个处理过程如图3所示。
3.2.4 Stage1与Stage2的设计分析
  Bootloader的Stage1部分是硬件上电/复位开始执行的操作,一般用汇编代码来编写,其目的是为Stage2的执行以及随后kernel的执行初始化硬件环境,主要包括以下步骤:屏蔽所有的中断->设置CPU的速度和时钟频率->关闭CPU的指令/数据Cache->设置CPU的8个bank配置->设置RAM控制器(包括刷新时序)->拷贝Stage2到地址0x0C700000->设置堆栈指针SP。在上述一切都就绪后,就可以跳转到Stage2去执行了,在ARM系统中,可以通过修改PC寄存器为相应的地址来实现。


  Stage2继续初始化本阶段用到的硬件设备,包括I/O、Cache、中断控制器和串口等,当所有硬件初始化完毕之后,开中断,打印出提示信息。在Stage2阶段,还有一个重要功能就是建立操作界面,提供各种调试功能,以方便用户的开发。可以利用Windows的超级终端建立与S3C44B0X串口的连接,完成Bootloader的管理和引导功能,包括串口下载、USB下载、网口下载、Flash烧写以及操作系统的引导等。在调试阶段,将整个管理过程设置成一个无限循环,不停地从串口接收和执行用户命令。若执行的是μClinux引导命令,则系统从此进入μClinux,而不再返回Bootloader。
3.3 Bootloader的编译和链接
  采用针对ARM的GNU工具链来对整个Bootloader工程文件进行编译和链接,具体流程如图4所示。先编译生成Stage2的二进制可执行映象Stage2.bin;然后用二进制文件转换工具bin2c将其转化为只包含一个一维数组的c文件Stage2_bin.c,GNU工具在对工程进行第二次链接的时候可以在其他程序定位到数组首地址,从而得到数组的内容,达到直接调用Stage2.bin的目的;最后将文件Stage2_bin.c和Stage1.s一起编译生成总的Bootloader映象,Stage2_bin.c中的Stage2映象数组最终被编译进Bootloader中的数据段。把Stage1的可执行映象作为代码段,把Stage2的可执行映象作为数据段。Bootloader在Stage1的执行过程中,就可以把自己的数据段(即Stage2)拷贝到RAM中,然后跳转执行。用arm-elf-ld链接各目标文件时需要编写链接脚本文件,指定正确的加载时域和运行时域,对于Stage1,加载时域和运行时域都为0x00000000开始的Flash地址空间,Stage2运行时域被安排到0x0C700000RAM空间。


4 μCLinux操作系统的引导
  μCLinux的引导共有两种形式:自举模式和加载模式,分别适应于嵌入式系统的开发阶段和产品发布阶段。Bootloader的引导工作主要是为μCLinux操作系统准备启动参数,包括RAM板块的组织、内核启动命令行、ramdisk在RAM中的位置、硬件的版本、图形卡参数等信息。在μCLinux操作系统中,通常需要由Bootloader来设置ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_
  RAMDISK、ATAG_INITRD等。Bootloader调用μCLinux内核的方法同调用一般应用程序一样,直接跳转到内核的第一条指令处。根据内核启动协议,在跳转时要满足下列几个条件:
  (1)CPU寄存器的设置:R0=0、R1=机器类型ID、R2=启动参数标记列表在RAM中起始基地址。
  (2)CPU模式:必须关闭所有中断、CPU必须为SVC工作模式。
  (3)Cache和MMU的设置:MMU必须关闭、数据Cache必须关闭。
  设计和实现一个性能良好的Bootloader,可以大大增强系统的稳定性,提高系统的实时性。目前开发的Bootloader已成功应用于一款心电监护设备中。本文给出的一种利用GNU工具链开发基于S3C44B0X的Bootloader方法,体现了Bootloader的结构和功能,可以举一反三,设计并定制出各种硬件平台的Bootloader,实现系统的有效、实时开发。
参考文献
1 冯进文,杨荣松.用GNU工具链开发嵌入式linux系统引导程序.中国测试技术,2006;32(1)
2 童大鹏,冉蜀阳.基于AT91RM9200微控器的BootLoader的分析与开发.微计算机应用,2005;26(3)
3 詹荣开.嵌入式BootLoader技术内幕.http://www.edw.com.cn/bbs
4 李驹光,聂雪媛.ARM应用系统开发详解-基于S3C4510B的系统设计.北京:清华大学出版社,2003
5 S3C44B0X User′s Manual.SUMSUNG Inc,1997

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。