ARM-Linux嵌入式系统的Boot Loader分析与设计

发布者:雅逸之风最新更新时间:2011-05-29 关键字:ARM-Linux  嵌入式系统  BootLoader 手机看文章 扫描二维码
随时随地手机看文章

0 引言
    由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。

1 Boot Loader分析
   
系统加电,然后复位后,基本上所有的CPU都是从复位地址上取得指令的。以微处理器为核心的嵌入式系统中,通常都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序,而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。对于嵌人式系统来说,比较复杂的或者为了方便后期开发大的应用程序,有的使用操作系统,也有很多的情况下,因功能简单,或仅包括应用程序的系统不使用操作系统,但是不论有无操作系统在启动时都必须执行Boot Loader,为的是准备好软硬件运行环境。
    以微处理器为核心的嵌入式系统中,一般都有某种类型的固态存储设备(FLASH,E2PROM等),这个固态存储设备被映射到一个预先设置好的地址上。在系统加电复位后,一开始处理器就会去执行存放在复位地址处的程序。而且通过开发环境可以将Boot Loader定位在复位地址一开始的存储空间上,因此Boot Loader是系统加电后,在操作系统内核或者一些应用程序被运行之前,首先会运行的程序。对于Linux系统,它的主要任务有以下7个方面。
    (1)初始化处理器及外设的硬件资源配置。一般嵌入式系统的处理器在上电复位后,外部的I/O引脚都处于输入状态,处理器的片内和片外设备资源都需要配置。
    (2)建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的环境,这样就能为最终启动操作系统的内核提供最好条件。
    (3)把操作装载到映射的内存中,这也是所有任务当中最重要的一个,只有完成这个任务,操作系统才能被装载到内存当中去,Boot Loader一般会提供串口和网络装载两种方式。
    (4)为了把操作系统的映像保存在FLASH中,以便以后启动,可以直接装载FLASH的数据,而不用重新下载程序,但需要对FLASH进行编程。
    (5)运行操作系统。设置相关的寄存器和资源,跳转到操作系统的所在空间,进行相关的引导,这就是Boot Loader。
    (6)在Linux系统启动时,传递系统的启动参数,可以给内核传递命令行等参数,通过命令行可以选择控制系统的启动模式。
    (7)命令行的解析和输入/输出控制。为了开发的方便,多数的Boot Loader都采用串口作为终端的控制方式。
    Boot Loader的启动过程可分为两个重要阶段。第一阶段:由于Boot Loader的实现依赖于CPU的体系结构,所以设备代码的初始化等功能都在该阶段完成。而且,为了达到缩短代码的目的,通常用汇编语言来编写。在这一阶段的执行过程中,又可分为几个方面。
    ①硬件设备的初始化。在该阶段的执行过程中,首先需要对硬件设备进行初始化,其目的主要是为第二阶段的执行以及随后Kernel的调用准备基本的硬件环境。
    ②为加载Boot Loader的第二阶段准备RAM空间。为了获得更快的执行速度,通常把第二阶段加载到RAM空间中来执行。因此,必须为加载Boot Loader准备好一段可用的RAM空间范围。
    ③设置堆栈指针。设置堆栈是为了执行C语言代码作好准备。
    ④跳转到第二阶段的C入口点。当程序执行到这个位置时,可以通过修改PC寄存器的值,使其跳转到第二阶段。
    第二阶段阶段的启动流程分析:为了便于实现复杂的功能和获得更好的代码可读性和可移植性,通常第二阶段的代码用C语言来实现。但是,与普通C语言的不同之处是,这里使用了“弹簧床”的概念,即先用汇编语言写一段小程序,并将这段小程序作为第二阶段可执行映像的执行入口点,然后在汇编程序中用CPU跳转指令跳入main()函数中去执行,当main()函数返回时,CPU执行路径再次返回到汇编程序中第二阶段,包括初始化本阶段要使用的硬件设备,检测系统内存映射,会将Kernel映像和根文件系统映像从FLASH中读到RAM空间中,为内核设置启动参数调用内核。

2 Boot Loader的设计
2.1 中断向量表(二级)的设计与建立

    如果有中断或者异常发生时,处理器便会强制性地把PC指针指向向量表中它所对应的中断类型地址值。为了提高中断响应速度,FLASH的0x0地址存放能跳转到0x33FFFF00地址处中断向量的跳转指令,也就是会在在RAM中建立一个二级中断向量表,起始地址为0x33FFFF00。除了复位外,所有的异常入口地址都由FLASH跳转得到,代码如下:
[page]

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程序,不然就会回到最后的语句,系统就会重新启动。[page]

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已经顺利通过了调试,可以正常加载操作系统。
关键字:ARM-Linux  嵌入式系统  BootLoader 引用地址:ARM-Linux嵌入式系统的Boot Loader分析与设计

上一篇:ARM7加速度数据采集系统设计
下一篇:基于ARM的远程无线视频监控终端设计

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

ARM-Linux:设备-mixer-linux系统声音效果调节
系统:arm板/Linux系统 内核:2.6.7 设备:/dev/mixer 功能:linux系统声音效果调节 文件名:xxx.c 编译:gcc xxx.c -o mixerSet 终端执行:./mixerSet 测试:无问题 #include unistd.h #include stdlib.h #include stdio.h #include sys/ioctl.h #include fcntl.h #include linux/soundcard.h /* 用来存储所有可用混音设备的名称 */ const char *sound_device_names = SOUND_DEVICE_NAMES; /
[单片机]
【飞思卡尔 MC9S12】BootLoader 下位机
上一篇:【飞思卡尔 MC9S12】内部D-Flash模拟EEPROM 本篇讲述BootLoader下位机的开发。 刚到新公司第三天就接了一个项目,搞到现在才局部完成,更新比较慢了。 先上传源码比较实际,再介绍基本功能。 源码地址:https://download.csdn.net/download/u010875635/11692136 实际上搞定CAN通信和Flash读写,Bootloader下位机就没什么问题了。 注意一下Bootloader与App的分区划分。 Bootloader与App分别占用2个非分页区。 Bootloader: 0xC000-0xFFFF(实际到0xF7FF,保留一个s
[单片机]
【飞思卡尔 MC9S12】<font color='red'>BootLoader</font> 下位机
嵌入式系统中电源电压的精确控制应用
   概要   该项目的目标是设计一个高效电源系统,其输出电压(VOUT)可以数字调节。为了保证输出电压的精确性,采用数字闭环控制,用于修正失调、漂移和负载变化(最大至600mA)的影响。电路包括输出可调的降压型控制器、ADC与DAC、电压基准以及一个微控制器(MCU)。   在大多数DC-DC转换器中,位于FB引脚上的电阻网络可以调整转换器的输出电压(见图1)。在本文电路中,利用DAC输出电压(VDAC)改变电阻网路的基准电压,达到调整转换器输出(VOUT)的目的。ADC检测输出电压,并将结果送入微处理器。微处理器调整DAC输出,以控制系统输出电压达到预定值。为使电路尽可能简单,预设输出电压通过PC的串行通信口(RS-232
[单片机]
<font color='red'>嵌入式系统</font>中电源电压的精确控制应用
在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显示的实现
基于PIC18F系列单片机的嵌入式系统设计
引言 嵌入式系统是指以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、体积、成本、可靠性、功耗严格要求的专用计算机系统。嵌入式系统是面向应用的,系统的硬件选型和软件开发模式都必须根据具体的应用确定。 永磁无刷直流电动机是电机控制研究领域的热点之一,这与其自身固有的技术优势密切相关:以电子换相取代了有刷直流电动机的机械换相。从根本上革除了普通有刷直流电动机由于电刷换相带来的火花、噪音、高故障率等一系列问题,同时又使系统的性能能够与普通有刷直流电动机相媲美,因此得到了广泛的应用。永磁无刷直流电动机的电子换相离不开电机的转子位置信号,传统的方法是采用霍尔器件或其他位置传感器检测位置信号,这使得系统的维护和制造都
[应用]
利用SPD实现嵌入式系统中内存的自动识别和配置
摘要:介绍了内存的SPD规范及其硬件接口类型和数据组织结构,实现了在嵌入式系统中对不同内存的识别与配置,提高了系统的稳定性,方便更换和检测。具体实例详细描述了嵌入式系统中内存的自动配置过程。 关键词:SPD I2C 嵌入式系统 MPC824X 在嵌入式系统设计中经常用大容量的SDRAM,存放RTOS和数据。这时用户可以有两种选择:一种是选用合适的内存芯片自己布线,把整个SDRAM做到嵌入式系统的PCB板上,这种方法在小系统中经常采用;另一种就是选用现成的内存条(如笔记本电脑上常用的DIMM内存),现成的内存条不仅容量大,而且由于用量大,价格也相对便宜。另外现成的内存条还节省了PCB布线空间,缩小嵌入式系统的内存体积,提高系统的
[应用]
以ARM和DSP嵌入式系统为核心的实时仿真平台的开发
简介:针对船舶推进系统研制的新颖ARM+DSP嵌入式仿真平台扬长了ARM与DSP两种嵌入式处理器的特点,集丰富的控制接口和高速运算处理能力于一体。 引言 一个大型的船舶轮机模拟器蕴含着30多个全物理过程的数学模型,涉及千余个实时参变量,通常采用功能分散的DCS网络来实现。即便如此,个别仿真工作站由于模型复杂、任务繁重,难以满足实时仿真的要求。例如,动力推进系统的仿真是一个半实物在环的仿真系统,其中既有虚拟的动力装置即仿真计算机上运行的数学模型,又有真实的控制盘台、物理显示设备,是一种集实时控制和高速运算功能于一体的典型系统。 早期开发成功的SMSC2000型轮机模拟器采用工控机作为仿真计算机,所有数据的处理和输入输出的控制
[单片机]
以ARM和DSP<font color='red'>嵌入式系统</font>为核心的实时仿真平台的开发
威盛推出Starter开发工具,扩张嵌入式势力范围
威盛(VIA)公司日前正大力推广面向汽车、工控、网络、医疗、消费、军事、人工智能、游戏机等领域的嵌入式系统应用。威盛制定了Mini-ITX,Nano-ITX等标准,在CPU的研发方向上以高效、省电、安静为重点,提出“无风扇工作”的概念。目前,公司提出了嵌入式平台市场战略规划,将加强车载PC、POS、IP-STB/广告机、瘦客户机等专有产品平台,利用紧凑的主板、省电的系统、无风扇的设计、可灵活变通的软件服务等优势开拓嵌入式领域。 公司的产品既包括嵌入式主板,又包括元器件产品系列。主板以通用型EPIA为主,包括Mini-ITX,Nano-ITX以及各种附件,还包括用户定制主板以及特殊宽温应用主板,据介绍,公司大约20%的销售额来自主
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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