admin管理员组

文章数量:1531718


2024年6月14日发(作者:)

维普资讯

第24卷第6期 

2006年l2月 

石河子大学学报(自然科学版) 

Journal of Shihezi University[Natural Science) 

V01.24 No.6 

D .20o6 

文章编号:1007.7383(2006)06-0768-05 

基于三星S3C44BOx目标板在#Clinux系统上 

的Bootloader 

何剑锋,李宏穆,庄阿龙 

(成都理工大学,四川成都610059) 

摘要:介绍了嵌入式ttClinux 2.4.24操作系统引导加载程序Boofloader的编写方法及其要点。根据ARM芯片的结 

构分析映像文件的组成及其地址映射方法,并结合杭州立字泰公司的S3C44BOX开发板,具体实践和验证了利用 

Bootloader引导ttClinux内核的过程。 

关键词:Bootloader;S3C44BOX;ttClinux;嵌入式系统 

中图分类号:TN911.72;TP311.13 文献标识码:A 

在嵌入式系统开发板上运行GNU/Linux系统已 

经变得越来越流行了,而ttClinux是专门针对没有内 

序,通过这段程序,我们可以初始化硬件设备,建立 

内存空间的映射图,从而将系统的软硬件环境带到 

个合适的状态,以便为最终调用操作系统内核准 

备正确的环境…。 

存管理单元(MMu)处理器而在微控制领域设计的 

嵌入式Linux操作系统ll』。ttClinux代码完全开放, 

具有支持多任务、内核精简、高效、稳定的优点,因而 

受到嵌入式开发人员的普遍欢迎。而Bootloader作 

为嵌入式系统加电或复位后运行的第一段软件代 

个基于ARMTTDMI CPU核的嵌入式系统中, 

系统在上电或复位时总是从地址0×0初开始执行, 

对于S3C44BOX也不例外。为了保证系统上电或复 

码,其主要任务是为嵌入式操作系统提供板上硬件 

资源信息,并将内核映像从Ftash复制到SDRAM中, 

位时Boofloader程序首先被加载运行,必须将它存放 

在FLYSH中的0×0处,并在硬件设计中把FLASH 

接在CPU的GCS0处,这样一来,上电后Bootloader 

首先完成开发板上的主要部件如:CPU、SDRAM、 

FLASH和串行口等、以及堆栈、中断向量的初始化, 

然后进行地址重映射并将操作系统内核调入到 

SDRAM中,最后将Pc指针指向操作系统内核的人 

口处,为操作系统的运行作好准备。 

然后跳转到内核代码的人口点进一步加载、引导嵌 

入式操作系统。 

本文针对基于三星¥3C4480X微处理器的嵌入 

式ttClinux系统开发板(即目标板),具体阐述了其 

Boolfoader的结构框架、地址映射方法和内核装载流 

程,并实践了在该目标板上利用Boofloader引导 

/LClinux内核的过程,为基于ARM7系列处理器的嵌 

1_2目标板简介 

CPU:¥3C44BOX,8MHz外部钟振,内部倍频至 

64MHz;RAM:64Mbit(4*IM*16bit)PCtOO/PCI33兼 

入式系统软件开发奠定了基础。 

1 Bootloader概述及目标板简介 

1.1 Bootloader概述 

Bootloader是根据软硬件定制的一段单独程序 

容SDRAM;NAND Flash:KgF2808 128Mbit(16MB) 

NAND- 曲(非线性flash);Flash ROM:SST39VF160 

16Mbit(1M*16bit)程序flas|,;UARI’接口:2通道 

UART接口,波特率高达l15200h0s,具有RS232转换 

电路;USB接口模块:采用全速USB设备接口芯片 

代码,存放于目标平台的非易失的存储介质中,简单 

地说,就是在操作系统内核运行之前运行的一段程 

收稿日期:200f加4一l7 

作者简介:何剑锋(1977一),男,硕士生,从事信号处理与数据采集、嵌入式系统应用开发研究。e-mail:hjf

10@yeah.net。 

通讯作者:李宏穆(1956-),男,教授.硕士生导师,从事智能机器人研究: 

维普资讯

第6期 何剑锋,等:基于三星S3CA4BOx目标板在ttClinm系统上的Boofloader 769 

USBN9603,符合USB1.1规范,2MB/s的速率。 

 lNANDFLASH}㈢ # USB主,从 

NORFLASH S3C44B0X ㈤l JTAG接口 

串行口UART LcD黑,错屏 

图1开发板功能框 

2 Bootlomtor引导uclin 内核的过程 

2.1存储空间的分布 

Boofloader采用默认的存储空间分布地址来加载 

ttClinux内核、文件系统。当然也可修改Bootloade相 

关代码来改变存储空间的分配。默认的存储空间分 

配表[2]见表1。 

表1存储空间分配表 

2.2启动程序和地址空间的分配 

S3C44BOx上的存储系统地址空间分为8个存 

储体,每个存储体可达到32MB,共256M。为了使处 

理器对各个设备的访问互不干扰,我们将不同类的设 

备映射到不同的Bank内。所有存储体的数据总线位 

数均可设置(8/16/32位),这可以通过OM[1:0]两个 

GCS7 

E00000OH 

— 

GCS6 未甩 

I64M SDRAMI 堆栈和中断矢量构 

{'00000{}H C7FFOO

C7FFFI下H 

(;CS5 

A000000tt\ 

\ 

下载程序使用 

GCS4 

80 ̄00OOH 

\ 

、- CO00000一C7FEB00H 

f :S3 6000000H I/O设备空间 

, 

Gt S2 未用 

4(KIOOOOH / 

GCSl { Boot[oader 

特殊寄存器 

2000000H/ 

lco0000

H/ 

} 

一……

OH—XXXXXXXH 

代码空闻 

…一一 

GCSOI ROM J 中断异常处理矢量表 

I)(J0O000H 

图2程序和数据空间分配 

引脚来配置。板上的SDRAM存储空间映射在GCS6 

(0C000000H)地址处,SDRAM是易失性的可快速写 

的存储器,因此它通常作为系统的数据空间。 

FLASH存储空间映射在了系统的GCS0上,系统上 

电时处理器即从0x0H地址处取得指令开始运行。 

由于FLASH是非易失性的存储器,因此程序就算掉 

电也不会丢失,通常作为系统的程序空间。 

S3C44B0x的Bank空间的分配如图2所示。 

2.3 Bootloader程序的结构框架 

由于Boofloader的功能直接与操作系统和CPU 

的体系结构相关,所以不同的CPU体系将需要不同 

的Bootloader。大多数Bootloader都分为第一阶段和 

第二阶段两大部分。依赖于CPU的体系结构的代 

码用汇编语言来实现,如设备初始化代码,通常放在 

第一阶段中;而第二阶段常用℃语言来实现更复杂 

的功能,代码具有更好的可读性和可移植性。 

Boodoader实际上也依赖于具体的嵌人式板级设备 

的配置。也就是说,对于不同的嵌人式板,即使它们 

使用同一种CPU构建,要想让运行在其中一块上的 

Boofloader程序也能运行在另一板子上,通常也都需 

要修改Boofloader的源程序…1。具体的Boofloader实 

现步骤如下: 

2.3.1 第一阶段的硬件设备初始化 

这是板子上电或复位时Boorloader首先要执行 

的操作,程序从位于地址0×0的异常向量表处开始 

执行【引。该阶段完成的主要内容有:关Watchdog 

Timer;屏蔽所有的中断;设置锁相环PIJL和时钟频 

率;RAM初始化等。其目的是为第二阶段以及随后 

的内核加载准备好基本的硬件环境。其程序如下: 

ResetHandler 

ldr r0,=WTCON;关watchdog Timer 

ldr rl,=OxO 

s【r rl,[1o] 

ldr r0,=INTMSK 

ldr rl,=OxO7ffm ̄;关闭所有的中断 

str rl,[r0] 

ldr r0,=LDCKTIME;设置IDCK计数寄 

存器 

ldr rl,=0xfff 

str rl,[r0] 

ldr r0,=PLLCON ;设置锁相环PLL 

ldr rl,:((M DIV<<12)+(P DIV<<4) 

+S

DⅣ) ;Fin=10MHz,Fout=40MHz 

str rl,[1o] 

维普资讯

石河子大学学报(自然科学版) 第24卷 

l0.=CLKCON;设置时钟控制寄存器 

ldr r1.=0x7珏8 

str rl,【l0J 

ldr l0.=BDIDES0;设置DMA初始化寄 

存器 

r1.:0x40000000;BDIDESn的复位值 

为0x40000000 

str rl,ll0] 

ldr l0.=SMRDATA;设置存储器控制寄 

存器 

ldmia l0,{rl—r13} 

ldr l0.=OxO1c8OOOO;总线宽度和等待控 

制寄存器(BWSCON)首地址 

smaia l0.{rl—r13} 

ldr sp,=SVCStack;堆栈初始化 

bl lnitStacks 

2.3.2异常中断向量表的建立 

对于uClinux内核来说,异常中断向量表通常分 

两级,也是BootI.Dader与 Clinux内核发生紧密联系 

的地方之一。即使 Clinux内核已经得到处理器的 

控制权运行,由于S3CA4BOX芯片是不支持地址空 

间的重映射(remap),一旦发生中断,处理器还是会 

自动跳转到从0xO地址开始的第一级异常中断向量 

表中的某个表项(依据中断类型)处读取指令运 

行l2。Boot2jloader的第一级异常中断向量表如下所 

示: 

b ResetHandler ;系统上电后进入复 

位操作 

ldr pc,=(一mQ—BASEADDRESS+0x04);处理 

未定义中断模式 

ldr pc,=(一mQ—BASEADDRESS+0x08);处理 

软件中断 

ldr pc,=(一mQ—BASEADDRESS+0xOC);处理 

预取中止异常 

ldr pc,=(一mQ—BASEADDRESS+0xl0);处理 

数据中止异常 

ldr pc,=(一mQ—BASEADD ̄+0x14);保留 

位 

ldr pc,=(一mQ—BASEADDRESS+0x18);处理 

mQ中断 

ldr pc,=(一mQ—BASEADDRESS+OxlC);处理 

FIQ中断 

如果在Bootloader执行的全过程中都不必响应 

中断,那么以上的设置已能满足要求,在编写 

Bootloader时,地址0xO处的一级异常中断向量表只 

需要简单地包含向二级异常中断向量表的跳转指令 

就可以。但需要用到中断,Bootloader必须在同样的 

地址(0 c000000)处配置自己的二级异常中断向量 

表,以便和 ̄Clinux兼容。这样,就能够正确地将发 

生的事件交给ttClinux的中断处理程序来处理,这张 

表事先存放在FLASH中,引导过程由Bootloader将 

其复制到RAM地址OxO ̄OOOOOO(存放向量表处): 

ExceptionHanlderBegin 

b . 

1dr pc,MyHandleUndef;HandlerUndef 

ldr pc,MyHandleSWI ;HandlerSWI 

ldr pc,MyHandlePabort;HandlerPabort 

ldr pc,MyHandleDabort;HandlerDAbort 

b . ;HandlerReserved 

ldr pc,MyHandlelRQ ;HandlerIRQ 

ldr pc,MyHandleFIQ ;HandlerFIQ 

MyHandleUndef DCD HandleUndef ;保留字 

(32位) 

MyHandleSWI DCD Handl ;W1 

MyHandlePabort DCD HandlePabort 

MyHandleDabort DCD HandleDabort 

MyHandlelRQ DCD HandleIRQ 

MyHandleFIQ DCD HandleFIQ 

ExceptionHanlderEnd 

设置mQ中断处理,S3CA4BOX有两种中断模 

式:一种是没有中断向量表;一种是使用了中断向量 

表,使用中断向量表只能是mQ方式: 

ldr l0,=(.mQ.BASEADDRESS+0xl00); 

建立二级异常中断向量表 

ldr r2.=一mQ—BASEADDRESS 

add r3,l0,#0x100 

0 

CMP l0,r3 ;在一mQ—BASEADDRESS 

(OxeO00000)处放置中断向量表 

STRCC r2,[10],#4;清除位标志位;保存r2 

到l0所指向的地址处,同时l0+4=l0 

BCC%BO 

ldr r1.=一mQ—BASEADDRESS 

l0,=ExceptionHanlderBegin;如果在0x18 

和o)【1c地址处无”subs pc,lr,#4 

ldr r3,=ExceptionHanlderEnd 

0 

维普资讯

第6期 何剑锋,等:基于三星S3C44BOx目标板在tuClinux系统上的Bootloader 771 

CMP r0,r3 ;在一mQ—BASEADDRESS 

ldr sp.=IRQS ̄k 

(0xe000000)处放置中断向量表 

LDRCC r2,【r0J,#4 

限℃C r2,【r1j,#4 

BCC %B0 

ldr rl,=DlsrIRQ ;在一IRQ—BASEADDRF_¥S+ 

Ox80(OxeO00080)处放置IRQ的判断程序 

ldr r0,=IsrIRQ;如果在Ox18和0xlc地址处 

无“subs pc,lr,#4” 

ldr r3,=IsrlRQEnd 

0 

CMP r0,r3 ;在一IRQ BASEADDRKSS 

(0xe000000)处放置中断向量表 

LDRCC r2,【r0J,#4 

C r2,【r1 J,#4 

BCC%踟 

ldr rl,=MyHandleIRQ;处理mQ中断,实现 

中断跳转 

ldr r0.=ExceptionHanlderBegin 

ldr r4,=

IRQ—BASEADDRES 

sub r0,rl,Io 

add r0,r0,r4 

ldr r1.=DlsrlRQ 

str rl,[10] 

2.3.3各处理器模式的初始化 

ARM7DM1支持7种操作模式,分别为:用户模 

式(usr)、系统模式(sys)、快速中断模式(fiq)、普通中 

断模式(irq)、管理模式(SVC)、数据访问中止模式 

(abt)、未定义指令中止(und)。Bootloader需要依次 

切换到每种模式,初始化其程序状态寄存器(CPsR) 

和堆栈指针(SP)。改变状态寄存器(CPSR)中的状 

态位,使处理器切换到相应的模式,然后再给sP赋 

值。 

InitStacks ;初始化各种处理器模式 

nlrs r0.cpsr 

bic r0,r0,#MODEMASK 

OIT rl,r0,#UNDEFMODEINOINT 

lnsr cpsr-cxsf,rl ;未定义模式 

ldr sp.=UndefStaek 

011""rl,rO,#ABORTMODEINOINT 

lnsr c ̄r-cmf,rl ;中止模式 

ldr sp.=AbortStack 

orr rl,r0,#IRQMODEINOINT 

ITlSr c ̄r-cxsf,rl ;IRQ模式 

O1T rl,r0,#FIQMODEI NOlNT 

nlsr c ̄r-cmf,rl ;FIQ模式 

ldr sp,=FIQSt ̄k 

bic r0,r0,#MODEMASKI NOINT 

O1T rl,r0,#SVCMODE 

nlsr cpsr_cxsf,rl ;管理模式 

ldr sp,=SVCStack 

mov pc,lr;把LR保存到Pc中,因处理器模式 

切换,故将程序返回地址保存到pc,同时在初始化 

堆栈完成后使用pc返回。 

2.3.4复制RO、F1W及清零Zl 

通常ARM的可执行文件包括R0(Read-Only), 

RW(Read—Write)和ZI(Zero.Initialize)3个段构成(对 

于GNU工具来说,对应的是TEXT,DATA和BSS)。 

其中RO段是只读的代码段,可直接在Flash或 

SRAM中运行;而RW段是可读写的,存放已初始化 

的全局变量,只能加载到SDRAM中运行;ZI段是清 

零初始化段,是存放未初始化的全局变量。经过 

ADS编译器编译后生成的六个变量,分别标明了其 

起始地址和结束地址:即RO段的大小为l linage 

j5 j5 RO j5 j5 LimitI 戎去I Image j5 j5 RO j5 j5 BaseI;RW 

段的大小为I Image j5 j5 RW j5 j5 Limit I减去I Image 

¥j;RW¥¥Base l;ZI段的大,J、为l hnage S¥ZI 

j5 j5 LimitI减去I hnage j5 j5 ZI j5 j5 BaseI。 

程序运行之前,RO段放在FLASH的0x0地址 

处,RW段紧接在RO段的后面。当程序运行的时, 

RO段没有变化,可直接在FLASH中运行,但是使用 

RW段运行之前必须把RW段复制到SDRAM中,并 

放在Image¥¥RW¥¥Base变量指向处,然后从 

Imagej5 j5 ZIj5 j5 Base开始处将zI段进行清零初始 

化[引。程序运行之前和运行时存储器空间的使用情 

况如图3所示。 

一一 

IIlldge¥善ZISSBase—+ 

SD i 

Image¥¥1{W¥¥Limit—+ 

Rw段 l 

Image¥¥I W¥¥Base一 

' r 

. 

hu ;cS}ItI.1¥{I.imit—-+ 

I二 : R 段 I 

I lIlag lsRO¥gBa e— .● 

量的R

OI

 

ox.00: 

含有中断向 FL S】

量的OR段 

 

运行时地址映射关系 加戴时地址映射关系 

图3映像文件的地址映射关系 

这样第一阶段的硬件设备初始化就完成了,开 

维普资讯

772 石河子大学学报(自然科学版) 第24卷 

始第二阶段要使用的硬件设备初始化和系统引导。 lFash上,系统启动时读取压缩的映像文件到内存中 

般通过一条BL Main语句跳转到第二阶段的入口 进行解压,然后开始启动内核.这种方式速度较快; 

处。 

而Flsah中直接运行是将映像文件烧录到Flsah上. 

2.3.5第二阶段要使用的硬件设备初始化 系统启动时从Flash的特定地址处开始逐句执行启 

第二阶段的初始化和系统引导(一般用C语言 动内核,这也是嵌入式系统开发常采用的加载方法。 

编写),主要继续对硬件资源设备初始化,包括通用 

I/O,系统内存映射,缓存设置,中断控制寄存器,定 

3小结 

时器Watchdog Timer,串121(UARTs)等。由于 设计与实现一个好的Bootl4 ̄er,可以增强系统 

S3C44BOX处理器内置数据/指令合一的8KB 

的稳定性,提高系统的实时性,因此掌握Bootloader 

cac ,并且可按地址范围设置两个Non.Cacheable 

是嵌入式开发的一个必要环节。本文结合目标板上 

区间,配置时应打开对RAM区间的Cache,关闭对其 的Bootloader分析了其工作及运行机理,并在此基础 

它地址区间(非存储器设备,I/O设备)的Cache。当 

上能够轻松的引导加载ttClinux内核,以便后续进行 

所有硬件初始化完毕后,开中断。 

嵌入式应用程序的开发铺平了道路,同时希望本文 

2.3.6建立操作界面 

可为嵌入式同行提供一些有用的参考。 

引导过程的最后一步是在串行终端上建立人机 

界面,若接收到用户输入的命令,则显示菜单模式或 

参考文献: 

命令行模式的交互界面。可以根据用户需要进行选 

[1]陈渝,李明,杨哗,等.源码开放的嵌入式系统软 

件分析与实践[M].北京:北京航空航天大学出版社。 

择建立相应的界面。例如设置波特率、IP地址、时 

2O04. 

钟,通过串口或网口下载,读写FLASH,运行可执行 

[2]杭州立宇泰电子公司.基于ARMSYS(S3C44BOX开发板) 

映象等命令,Windows的超级终端或linux的minicom 

的uChnux内核移植[EB/OL].http://www.hzlitai.eOlf1. 

里显示的命令行界面。 

cn/.2OO4-I1. 

2.4加载 ̄Clinux内核 

[3]詹荣开.嵌入式系统Boot loader技术的内幕[Ea/OL].hat・:// 

在宿主机上编译ttClinux内核之前,首先要用 

WWW.128.ibrn.cem/develo ̄cn/lirar ̄1-btloader/.2008-12- 

make menuconfig进行内核配置,编译后生成的内核 

O1. 

映像文件(如:image.rom、image.1ain),根据需要 

[4]严国清,熊建设,徐红梅.S3C44BOX中Bootloader的实现 

Bootloader可加载到内存SDRAM中运行或者直接在 

[J].信息技术与信息化.2O04,8[6]:40-43. 

[5]李岩,荣盘祥.基于 ̄C44BOX嵌入式ttClinux系统原 

Flash中运行,ttClinux内核可支持上述的两种运行方 

理及应用[M].北京:清华大学出版社2005. 

式。加载到内存中运行是将压缩的映像文件存放在 

The Bootloader for lzClinux Based on SAMSUNG S3C44B0x Board 

l iE Jian-feng,LI Hong-mu,ZHUANG A-long 

(Chengdu University of Technology,Chengdu,Sichtmn 610059,China) 

Abstract:This article introduces the programming methods and essentials of Bootloader in ttClinux 2

4.24 embedded 

operation system.Based on the structure ofARM,it analyzes the constitution ofimage file and the method ofaddress map 

on the S3CA4BOX development board of LIYUTAI,practiced and validatde the booting process of ttClinux kernel by 

BootLoader. 

Key words:Bootloader;S3C44BOX;ttClinux;embedded system 


本文标签: 内核系统地址程序