基于S3C44B0芯片的uClinux内核引导过程分析

发布者:淡雅时光最新更新时间:2012-04-06 来源: 武汉理工大学学报关键字:uClinux  嵌入式系统  内核引导 手机看文章 扫描二维码
随时随地手机看文章

前 言 

随着计算机硬件技术的不断发展,功能强大、资源丰富的嵌入式芯片,成为研究人员开发专业应用领域产品的首选。三星公司生产的S3C44B0芯片,采用ARM7TDM I内核,具有功耗小、成本低的特点,是一款专门针对移动终端及PDA手持设备市场的产品。近几年,源码开放的L inux系统迅速发展,很快成为跨平台操作系统中的佼佼者,并且出现了专门针对嵌入式系统的产品———uClinux。在S3C44B0芯片上移植 uClinux操作系统,能够充分发挥该芯片系统资源丰富(相对单片机而言)的特点,开发出功能强大的应用产品。 

嵌入式系统的启动引导程序与硬件严格相关,对编写人员的要求较高,而在移植uClinux后又大大增加了引导程序的复杂程度,因此这部分代码往往是各个嵌入式产品开发厂商严格保密的部分。下面将以一款市场上成熟的基于S3C44B0芯片的嵌入式开发板为蓝本,对引导uClinux内核的过程进行分析。 

系统引导过程分析 
    
嵌入式系统中uClinux内核的系统引导过程通常可以分为3个阶段,即boot阶段、系统初始化阶段和uClinux内核引导阶段。通常情况下boot阶段和系统初始化阶段的工作由一段被称为bootloader的代码完成,而内核引导则是由事先编译好了的uClinux可执行镜像来实现。 

系统内存组织 

由于嵌入式系统的硬件环境千差万别,即使选用同一种型号的嵌入式芯片,其外围设备也大不相同,特别是存储设备的组织,将直接关系到引导程序的实现。对于 S3C44B0芯片,其生产厂家规定在系统加电自举后,从0x00000000处开始执行(其他芯片如ARM9系列可以通过地址映射改变该地址) ,故此处通常安排的是Flash 地址空间,用于保存bootloader启动代码以及uClinux映象。对于S3C44B0 芯片, RAM 地址被固定在0x0c000000到0x0fffffff的64兆,开发人员可以根据自己的需要再组织RAM,如本开发板存储器地址安排如下: 



此外,考虑到Flash运行速度的问题,通常采取的做法是将系统初始化阶段的代码和uClinux内核镜像拷贝到RAM中执行。下面将分3个阶段分析系统引导过程。 

boot阶段 

boot阶段的主要工作是设置系统中断向量、完成对CPU内部寄存器的初始化、系统RAM初始化、为运行C程序组织堆栈、拷贝初始化阶段代码到RAM、跳转到C程序入口。该阶段代码直接在Flash中运行,为提高执行效率采用汇编语言编写。 

(1) 设置中断向量。设置S3C44B0芯片的8种系统中断的中断向量地址(包括复位中断、未定义指令中断、软件中断、指令预取异常中断、数据异常中断、地址异常中断、IRQ 中断和F IQ 中断) ,该地址空间从系统RAM的起始地址开始安排。通常情况下,在Flash的起始部分,存放的就是针对各中断向量地址的无条件跳转指令。

__entry :
B ResetHandler
/* for reset vector */
LDR PC, = 0x0c00000c
/* 0x0c00000: 未定义指令中断向量地址*/
.....
/* 中间省略类似跳转*/
LDR PC, = 0x0c000024
/* 0x0c000024: F IQ中断向量地址*/ [page]

(2) CPU内部寄存器初始化。通过配置CPU运行于SVC模式(采用改变CPSC寄存器中CPU运行模式位的方式来实现) ,并设置相关寄存器,以实现对基本硬件的初始化工作,包括关闭中断、初始化CPU通用端口和设置CPU频率等。进入SVC模式汇编代码如下:

MRS a1, CPSR /* 保存当前状态寄存器值*/
BICa1, a1, #MODE_MASK /* 清除运行模式位*/
ORR a1, a1, #SUP_MODE/* 设置为超级用户模式*/
ORR a1, a1, #LOCKOUT /* 关闭F IQ和IRQ */
MSR CPSR_cxsf, a1 /* 保存到当前状态寄存器*/ 

(3) 系统RAM初始化。初始化系统RAM的主要目的是为下面使用RAM空间的操作做好准备工作,如进行代码拷贝及堆栈初始化等。这部分工作可以分为两个步骤。首先,根据系统配置的存储器特性,初始化相关存储块控制寄存器的值, 在S3C44B0 中存储空间被分为BANK0到BANK7共8个块,分别由BANKCON0到BANKCON7控制各块存储器的读写时钟数和片选时钟数等信号参数,对于采取不同存储芯片的嵌入式系统,可以通过查阅芯片手册来获取该信息,并写入相关寄存器。

LDR r0, = rBANKCON0
LDR r1, = 0x700
STR r1, [ r0 ]
..
/* 中间省略BANK1到BANK6*/
LDR r0, = rBANKCON7
LDR r1, = 0x18000
STR r1, [ r0 ]
LDR r0, = rREFRESH
LDR r1, = 0xac03e1
STR r1, [ r0 ]
LDR r0, = rBANKSIZE
LDR r1, = 0x16
STR r1, [ r0 ] 

然后,对存储器空间中需要清零的区域进行清零操作,该区域的范围往往是由开发人员通知编译器的,主要是用来存放C语言中全局变量等。

LDR a1, = Image_ZI_Base /* 获取清零区域基地址*/
MOV a3, #0 /* 清零a3寄存器*/
LDR a2, = Image_ZI_L imit /* 获取清零区域尾地址*/
CMP a1, a2
BEQ move_data
clear_loop: : /* 清零Image_ZI_Base到Image_ZI_Limit区域*/
STR a3, [ a1 ] , #4/* 清零4个字节,即一个字*/
CMP a1, a2 /* 判断是否到达清零区域尾部*/
BNE clear_loop /* 否则,继续清零循环*/ 

(4) 为运行C程序组织堆栈。由于在系统引导的下一阶段,通常会使用C语言来完成大部分(如建立主机通信、驱动外部端口的工作) ,故必须调整SP指针到堆栈顶,为C程序配置合适的堆栈环境。在具体实现过程中为避免堆栈数据被程序运行代码破坏,往往会把堆栈设置在RAM的高端地址,并把堆栈的生长方向设为向下生长,这样可以最大限度地利用RAM空间,同时可以避免上述问题发生。 

(5)拷贝初始化阶段代码到RAM。由于在S3C44B0芯片中Flash和RAM是统一编址的,只需通过简单的循环来实现代码拷贝工作。

copy_code_to_ram :
LDR r3, = Flash_Sou/* Flash_Sou为Flash中代码首地址*/
LDR r2, =Ram_Dest /* Ram_Dest为Ram中代码首地址*/
LDR r1, = 0
next :
LDR r0, [ r1 ] , #4
STR r0, [ r2 ] , #4 /* 复制到ram*/
CMP r1, r3
BNE next
跳转到C程序入口:
LDR pc, =Main 

系统初始化阶段 

系统初始化阶段的主要工作是建立与主机间的通信、初始化定时器、检测内存映射、加载uClinux内核镜像和配置内核启动参数等。 [page]

与主机建立通讯 

面向最终用户的嵌入式产品,其启动过程应该是不需要人工干预的,但对于大多数嵌入式开发平台而言,必须通过某种方式与主机间建立通讯联系,输出启动提示信息,以实现人工干预的系统启动过程,提供更加丰富的附加功能。一般情况下,最为廉价和简单的方式是通过串口实现嵌入式系统与主机间通讯( S3C44B0提供2个Uart口,建立通信前必须初始化至少一个),这种情况下就必须事先对串口进行初始化工作。 

以本开发板为例,在系统初始化的初期,就进行了Uart口的初始化工作,并通过该端口与用户宿主机上的超级终端程序通信,从而提供了多种启动功能的选择,包括Demo程序下载、Flash重新编程等。Uart0口初始化过程可参看以下C代码,其中波特率因子的计算公式可以查阅S3C44B0芯片手册。
rULCON0 = 0x3;//设置Uart0 口线控寄存器,无奇偶效验, 8数据位, 0停止位
rUCON0 = 0x345;//设置Uart0控制寄存器
rUBRD IV0 = ( ( int) (mclk /16. /baud + 0.5) - 1 ) ;//设置波特率因子,其中mclk和baud为系统频率和波特率 

初始化定时器 

通过设置系统定时器相关的寄存器,实现为操作系统提供最基本的系统时钟支持。 

检测内存映射 

为防止发生内存映射错误,即系统映射到物理地址不存在的空间,必须对内存地址作读写一致性效验。通常做法是以内存页为单位,在每个页头进行读写操作,并比较读写结果。 

加载uClinux内核镜像 

加载uClinux内核工作实际上是完成将Flash中uClinux内核代码拷贝到RAM指定地址单元的工作,在拷贝前必须在第二阶段RAM启动代码和该部分代码之间预留一定的空间,用来存放uClinux的全局结构变量,如: 启动参数、内核页表、ARM的页目录等信息。全地址空间的分配情况可参看本开发板地址空间分配示意图1。



图1 地址空间分配示意图 

配置内核启动参数 

uClinux 内核启动过程中,支持参数传入。在嵌入式系统中,启动参数的传入主要靠bootloader程序向标记列表( tagged list)的相关域中填写对应的值来完成,常见的参数如有ATAG_CORE、ATAG_MEM、ATAG_CMDL INE、ATAG_RAMD ISK、ATAG_ IN ITRD等。 

uClinux内核引导 

在初始化阶段完成uClinux启动参数设置后,控制权交由uClinux内核接管,并调用解压内核函数( decomp ress_kernel) ,对拷贝到SDRAM的内核映像文件进行解压缩,然后跳转到内核调用函数( call_ kernel) ,该函数实际上是执行start_kernel ( ) ,其中包括了处理器结构的初始化、中断的初始化、进程相关的初始化以及内存初始化等重要工作。最后,将控制权交给解压后的uClinux系统,进而完成整个uClinux内核引导过程,参看以下伪码: If (启动参数配置正确)调用decomp ress_kernel ( )调用call_kernel ( )else提示启动失败decomp ress_kernel( ){解压内核镜像文件}call_kernel ( ){ ..start_kernel( ) ;..} 

小 结 

对于嵌入式系统开发人员来说,针对某一特定的嵌入式硬件平台,移植开发基于uClinux操作系统的应用产品时,往往需要自己动手编写或修改已有的启动代码,而为uClinux内核启动准备合适的工作环境,占据了大部分工作量。至于uClinux引导,在设置好启动参数后则是由编译好的内核镜像自动完成,对于系统开发人员来说基本上是透明的。 

关键字:uClinux  嵌入式系统  内核引导 引用地址:基于S3C44B0芯片的uClinux内核引导过程分析

上一篇:嵌入式系统中CMOS图像传感器接口技术
下一篇:基于ARM9与WinCE的车辆GPS定位信息采集系统

推荐阅读最新更新时间:2024-03-16 12:57

在ARM11嵌入式系统下实时网络通信和LCD显示的实现
引言 ARM11主频为533 M Hz ,最高可达667 MHz,较ARM7主频提高了10倍,且拥有更丰富的片上资源,处理速度更快,功能更强。基于上述特点,ARM11可完全适应实时性较强的网络终端的设计。 在以ARM11为核心的网络终端设计中,需要LCD在终端实时显示网络通信的各项参数和设备工作状态,LCD的显示内容依靠网络传输数据中的指令来控制,而网络终端的操作数据也要通过网络传输到计算机,因此网络通信和LCD显示需要很强的实时性才能合理使用计算机和ARM11的资源,从而提高系统的运行效率。 该文以ARM11处理器S3C6410为平台,基于Linux操作系统设计了一种在ARM11内核直接控制LCD显示的方法,并采
[单片机]
在ARM11<font color='red'>嵌入式系统</font>下实时网络通信和LCD显示的实现
嵌入式系统引导程序的实现
在嵌入式系统的开发过程中,技术难点主要在于系统引导程序的编写,为此本文将详细论述在ARM7基础上开发嵌入式系统时引导程序的实现。 引导加载程序是系统加电后运行的第一段软件代码。当一个微处理器最初启动时,他首先执行预定地址处的指令。通常这个位置是只读内存,其中存放着系统初始化或引导程序。在PC系统中,引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的操作系统BootLoader(比如,LILO和GRUB等)一起组成。BIOS进行CPU初始化、配置其他硬件,并完成硬件检测和资源分配。然后,BIOS判断出哪一个磁盘包含有操作系统,再把硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给操作系统Boo
[测试测量]
用GNU工具开发基于ARM的嵌入式系统
摘要:介绍如何利用GNU的工具开发基于ARM的嵌入式系统,以及使用编译器、连接器和调试工具的具体方法,为广大嵌入式系统开发人员提供一种低成本的开发手段。 关键词:ARM GNU MC928MX1 gcc gdb gdbserver 当前,ARM公司的32位RISC处理器,以其内核耗电少、成本低、功能强、特有16/32位双指令集,已成为移动通信、手持计算、多媒体数字消费等嵌入式解决方案的RISC标准,市场占有率超过了75 %。多家公司都推出了自己的基于ARM内核的处理器产品,越来越多的开发人员开始了针对ARM平台的开发。通常开发人员需要购买芯片厂商或第三方提供的开发板,还需要购买开发软件,如C编译器或者集成了实时操作系统的开
[嵌入式]
嵌入式系统联谊会嵌入式系统新技术论坛顺利召开
2010年7月28日下午,嵌入式系统联谊会在北京首享科技大厦举办了本年度的第2次活动——嵌入式系统新技术论坛。论坛邀请嵌入式领域的专家和学者三十多位,到场听众百余人,旨在探讨嵌入式技术对于创新型应用的帮助,进一步学习和了解嵌入式新技术。 联谊会发起人何立民教授为新技术论坛致辞,接下来7位演讲人作了精彩的主题报告,并与现场来宾进行问答互动。 Intel中国研究院刘东博士介绍了基于FPGA的光互联系统仿真平台,指出平衡、高效的系统是设计面临的挑战,I/O是光互联技术的下个重点,采用FPGA仿真并在其上实现核和I/O控制器。Xilinx公司谢凯年博士探讨了嵌入式系统软硬件协同设计面临的机遇与挑战,提出嵌入
[嵌入式]
<font color='red'>嵌入式系统</font>联谊会<font color='red'>嵌入式系统</font>新技术论坛顺利召开
机器人技术和机器学习正成为嵌入式系统的下一大趋势
机器人技术和正成为嵌入式系统硬件和供应商的下一个重大事件。 嵌入式系统可以通过网络连接和()来传递信息、共享资源。无论是智能,低能耗,边缘设备,中间网关还是计算节点,都需要基于可靠性和安全性的多核片上系统(SoC)架构。 因此,嵌入式系统行业似乎将进入两个关键领域:智能和自治。 一些感兴趣的领域是机器学习和所谓的“物联网机器人”。在机器学习领域,一种称为神经形态处理器或脑启发计算的新型计算架构将成为主流。 目前基于冯·诺依曼的结构缺乏处理的功能和性能,但新的处理技术,如SNNaker和BrnScaleS,将模仿大脑的生物结构和行为,能够实时模拟10亿个神经元。 但是,有效开发将需要新的语言和编译器等嵌入式
[机器人]
基于Intel Xscale和嵌入式Linux的视频模块设计
1 引言 随着计算机进入后PC时代、多媒体技术和无线通信技术的发展,融合通信、计算和多媒体功能的各类多媒体终端(如PDA)应用正在成为开发应用的新亮点,视频则是这类应用中不可缺少的重要组成部分。多媒体终端,作为嵌入式系统,大多数应用场合是对速度、功耗、体积有严格要求的车载、移动通信、手持式设备等,那么如何设计一个体积小、实时处理能力强、功耗低、可移植性强的视频模块以满足嵌入式系统设计对速度、功耗和空间的要求和应用开发的需求就成为一个很有意义的课题。 基于XScale 技术的新型处理器PXA255 是英特尔公司推出的为无线通信设备带来更高性能和更低能耗的微处理器产品,为多媒体手机、掌上电脑、车载信息通讯系统及其它无线互联网产品提供
[嵌入式]
TMS320C6000嵌入式系统优化编程的研究
    摘要: 分析了TMS320C6000的硬件设计和指令系统的特点,结合应用开发过程中遇到的问题,对这种高速并行DSP器件开发方法进行了总结。     关键词: DSP TMS320C6000 嵌入式系统 并行处理 1 TMS320C6000的硬件设计和指令系统 TMS320C6000系列DSP(数字信号处理器)是TI公司最新推出的一种并行处理的数字信号处理器。它是基于TI的VLIW技术的,其中,TMS320C62xx是定点处理器,TMS320C67xx是浮点处理器。本文主要讨论TMS320C6201。该处理器的工作频率最高可以采用50MHz,经内部4倍频后升至200MHz,每个时钟周期最多可以并行执
[应用]
UClinux2.4.x+S3C4510B平台的USB-HOST驱动设计
摘要:USB设备应用已经十分广泛。本文通过介绍S3C4510B、SL811HS芯片的部分特性,给出在uClinux2.4.x+S3C4510B平台上扩展USB-HOST的方法和详细步骤。 关键词:uClinux2.4.xS3C4510B USB-HOST SL811HS 引言 今天,USB设备已经进入我们工作、生活的方方面面,它给我们带来了许多便利。因此,带有USB功能已经成为现在许多系统的一个基本要求。三星公司针对ARM7开发的S3C4510B是目前业界使用非常频繁的一款芯片。它的强大功能使其成为基于诸多传统的51等系列单片机开发思想的终结者。通过对它移植uClinux操作系统,犹如为虎添翼。稳定的Linux系统和强大的
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
    502 Bad Gateway

    502 Bad Gateway


    openresty
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved