历史上的今天
返回首页

历史上的今天

今天是:2025年02月21日(星期五)

正在发生

2018年02月21日 | ARM+Linux嵌入式系统的BootLoader设计

2018-02-21 来源:eefocus

      由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跳转得到,代码如下:

  

程序

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已经顺利通过了调试,可以正常加载操作系统。


推荐阅读

史海拾趣

Alorium Technology公司的发展小趣事

Alorium Technology是一家总部位于美国俄亥俄州的公司,致力于提供用于嵌入式系统的可编程硬件和软件解决方案。以下是Alorium Technology公司发展的相关故事:

  1. 创立和初期发展: Alorium Technology公司成立于2013年,由Jeff Waters博士和John Dey共同创立。公司最初的目标是开发基于FPGA(可编程门阵列)技术的解决方案,用于提高嵌入式系统的性能和灵活性。通过创始团队的技术专长和市场洞察力,公司迅速吸引了投资者的注意,并在成立后不久获得了初步资金支持。

  2. FPGA技术应用: Alorium Technology专注于开发基于FPGA的解决方案,以解决嵌入式系统中的性能和灵活性挑战。他们开发了一系列产品,包括FPGA模块、开发工具和软件库,为客户提供了简化的嵌入式系统设计和开发流程。这些产品广泛应用于工业控制、物联网、机器人技术和自动化系统等领域。

  3. 发展合作伙伴关系: 随着业务的不断发展,Alorium Technology开始与其他公司建立合作伙伴关系,以扩大其产品在市场上的影响力。他们与传感器制造商、嵌入式系统开发者和工业自动化公司等合作,共同推动技术创新,并开发定制化的解决方案,以满足不同行业的需求。

  4. 不断创新: Alorium Technology不断进行技术创新,推出新的产品和解决方案,以适应不断变化的市场需求。他们持续改进现有产品的性能和功能,并不断探索新的应用领域。公司在FPGA技术的基础上,积极探索人工智能、边缘计算和机器学习等新兴领域,为客户提供更多选择。

  5. 社区参与和知识分享: Alorium Technology积极参与嵌入式系统开发社区,并通过各种途径分享知识和经验。他们举办在线研讨会、技术培训课程和技术博客,与客户和合作伙伴分享最新的技术趋势和解决方案案例。同时,公司也积极参与行业展会和活动,与同行业交流经验,拓展业务网络。

以上是Alorium Technology公司发展的相关故事,展示了他们在嵌入式系统领域的创新和成就。

EICHHOFF公司的发展小趣事

随着全球化趋势的加强,EICHHOFF公司意识到必须加快国际化步伐以拓展更广阔的市场。XX年代初,公司开始在欧洲其他国家设立销售和服务机构,并逐步将业务拓展到亚洲和北美地区。为了更好地适应不同地区的市场需求和文化差异,EICHHOFF公司积极招聘本地人才,并加强与当地企业和机构的合作。

通过实施国际化战略,EICHHOFF公司的品牌影响力得到了显著提升,市场份额也不断扩大。同时,公司也积累了丰富的国际运营经验和管理经验,为未来的发展奠定了坚实基础。

敦泰(FOCALTECH)公司的发展小趣事
电冰箱不制冷可能由多种电路问题引起,如电源线路故障(如插头未插紧、插座无电等)、压缩机启动电路故障(如启动器损坏、压缩机线圈断路等)、温控电路故障(如温控器失灵、温度传感器损坏等)或制冷系统电路故障(如制冷剂泄漏、毛细管堵塞等)。建议首先检查电源是否正常,然后逐步排查压缩机、温控器和制冷系统电路。
康龙(CONCRAFT)公司的发展小趣事

面对电子行业的快速变化和发展趋势,康龙公司积极拥抱数字化转型。公司引入了先进的ERP系统和数字化工具,实现了从供应链、生产管理到财务管理的全面信息化。这不仅提高了公司的运营效率和管理水平,还为公司的产业升级和未来发展奠定了坚实基础。

FDI [Future Designs , Inc.]公司的发展小趣事

作为一家有社会责任感的企业,FDI公司始终关注社会公益事业。公司积极参与扶贫、教育、环保等领域的公益活动,为社会做出了积极贡献。同时,FDI还设立了奖学金和助学金,鼓励和支持年轻人投身电子科技事业。这些举措不仅提升了公司的社会形象,也为其赢得了广泛的赞誉。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于控制算法复杂或系统响应速度不足导致的。解决方案包括简化控制算法、提高系统响应速度或采用更高效的控制策略。

问答坊 | AI 解惑

物理地址到虚拟地址的转换问题?

2440中UART0寄存器对应的物理地址为 0x50000000,对应的虚拟地址在g_oalAddressTable表中为0x91000000 g_oalAddressTable         DCD     0x91000000, 0x50000000,  1     &nb ...…

查看全部问答>

二个程序谁的耗的资源少,效率高?

一个程序主函数中就是一个检测文件是否存在的循环. 另一个程序在主函数中另建一个线程,被建的线程中是一个检测文件是否存在的循环. …

查看全部问答>

求助: 安装EVC 电脑卡住

我的机子装不了eVC4,安装到配置wince platform manager 4.0 时,就死机了 重启后就出现未识别的硬件和硬件安装向导, 提示什么虚拟PC的 只要安装也就卡机了. 这是怎么回事? 我电脑是SP3的,台式机一样的系统都安装得好好的…

查看全部问答>

【原创】在VC/eVC中实现VB中的Split函数

VB中,sItem = Split(s, \",\")   CString s; CString sItem[13]; byte pItem; byte p1, p2; s += \",\"; p1 = 0; pItem = 0; for (p2 = 0; p2 < s.GetLength(); p2++) {         if (s.GetAt(p2) == \',\') &nb ...…

查看全部问答>

(转贴)像素和分辨率以及换算

经常会有朋友问到200万高清网络机是多少分辨率,或者1600*1200是多少万像素?今天刚好从网上找到一篇这样的文章,希望对大家有帮助。   1.什么是像素?简单的说,我们通常所说的像素,就是CCD上光电感应元件的数量,一个感光元件经过感光 ...…

查看全部问答>

2010成都物联网峰会展品图片分享

这组图片是三个星期以前拍的,回来之后就马不停蹄的赶项目进度,推迟到现在才发上来。本人拍照水平很菜,加上展品放在玻璃柜里面,拍出来相片实在一般般,大家将就一下。 对这次展会的总体印象是规格高,规模大,在一定程度上反映出了中国物联网 ...…

查看全部问答>

dsp2812 到货了?

请问斑竹,片子到货了吗,还要等多久呢?…

查看全部问答>

怎样驱动继电器

用单片机驱动继电器是接NPN 还是PNP,为什么??请教…

查看全部问答>

开关电源设计指南

开关电源设计指南有书签…

查看全部问答>