增加bootloader 命令从sd card启动




    		    增加bootloader 命令从sd card启动
收藏

引 言
BootLoader通常称为“系统的引导加载程序”,是系统加电或复位后执行的第一段程序代码。这段程序的主要任务是,实现硬件设备初始化并建立内存空 间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。通常,BootLoader包含两 种不同的加载和启动引导方式,即启动加载方式和下载方式。
①启动加载(boot loading)方式。这种引导方式也称为“自主(autonomous)引导方式”,也即BootLoader从目标机的某个固态存储设备上将操作系统 加载到RAM中并引导运行,整个过程并没有用户的介入。这种引导方式是BootLoader的正常工作模式下普遍采用的一种引导方式。因此在嵌入式产品发 布的时候,BootLoader一般以这种引导方式对内核代码进行启动引导。
②下载(down loading)方式。在这种引导方式下目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,如下载应用程序、数据文件、 内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的固态存储设备中,其后 完成内核的引导运行。BootLoader的这种引导方式通常在系统研发和更新时使用。在嵌入式系统研发阶段,现有的BootLoader下载引导方式又 可根据加载途径的不同细分为以下几种:
①通过Ethernet网口从宿主机下载内核到目标板,从而实现软件系统启动;
②通过串口从宿主机下载内核到目标板从而实现软件系统启动;
③直接从Flash中提取已存储的内核,从而实现软件系统的启动。
总结以上几种引导方式会发现,它们有些共同的弊端;在系统调试时需要进行宿主机与目标板间的硬件线路的实际连接,使用起来不够方便,且烧片的速度比较缓 慢,调试的效率不高;硬件方面需要大容量的Flash的支持,增加了研发成本;进行内核更新时显得不够灵活。为此,采用可移动的存储介质对系统内核进行存 储(如SD卡、CF卡等),从而实现对系统内核的灵活调试和引导。这种引导方式的好处是,在调试时无需把宿主机和目标板进行硬件连接,提高了调试的效率, 使用起来更便捷、更灵活;进行内核更新时显得更为灵活,只需把更新内核转存到指定目录,此外它的实现也比较简单。进行这方面的改进时只需做以下工作:在硬 件方面,增加针对特定移动存储介质的硬件电路,而在中大型系统中,有关移动存储介质的硬件电路(如SD卡、CF卡等相关的电路)是现成的,所以硬件部分也 可忽略;在BootLoader程序内部,只需添加对移动存储介质(如CF卡、SD卡等)基于文件系统进行存储访问的指令。按此思路,在已有硬件平台的基 础上针对移动设备SD卡对原有BootLoader进行了改进。下面介绍实现过程。

1 硬件平台
本次改进测试的硬件平台是由英蓓特公司开发的基于LPC2294 ARM控制器的LPC22EB06一I实验平台。其上的主要功能模块有:
①2 MB的Flash、1 MB的SRAM(可扩展到4 MB)、256B具有I2C接口的E2PROM等存储器;
②2个RS232(其中一路可接Modem)、RS485、CAN等通信总线接口;
③2个调试接口:LPT和JTAG调试接口;
④支持CF卡、SD/MMC等移动存储介质;
⑤支持128×128真彩显示。
图1是其硬件功能框图。




    		    增加bootloader 命令从sd card启动

2 BOOtLoader的改进设计
2.1 原有BootLoader功能

原来的:BootLoader具有如下功能:
①串口下载功能,通过串口下载内核到指定RAM区;
②Flash烧写功能,从RAM区烧写数据到Flash中;
③数据区内块搬移功能;
④其他功能。其指令封装结构如下:




    		    增加bootloader 命令从sd card启动
2.2 BootLoader改进实验
此次改进就是在原有BootLoader的基础上,增加对移动存储介质SD卡以FAT格式进行读取数据的指令来实现的。命令封装如下:




    		    增加bootloader 命令从sd card启动
其功能是,在SD卡中把指定目录下的内核文件提取到SDRAM区域中,从而完成内核的加载。
另增加3条辅助指令,一条完成SD卡的格式化,另一条完成对系统内核的保存,最后一条完成对系统内核的启动加载。命令封装如下:




    		    增加bootloader 命令从sd card启动
其中,CMD_TBL_SD_FORMAT的功能是完成对SD卡的格式化,CMD_TBL_SD_STORE的功能是把SDRAM区域中的内核代码备份到 SD卡的固定存储区,CMD_TBL_SD_LDAD的功能是把SD卡的固定存储区中的内核代码加载到指定的SDRAM区域中。
下面分析一下其基于FAT文件系统的具体读取和备份方法。首先看一下FAT文件系统的基本结构。FAT文件系统的整体结构大体由4大部分组成:MBR区 (主引导记录区)、DBR区(DOS引导记录区)、FAT区(文件分配表区,FATl为主文件分配表区,FAT2为备份文件分配表区)和DATA区(数据 区,包含FDT区——文件目录表区)。FAT文件系统结构如下:




    		    增加bootloader 命令从sd card启动

其各个区域基扇区地址(把MBR区的基扇区地址作为O)计算如下:
DBR区的基扇区地址=MBR基扇区地址+63
FAT表的基扇区地址=DBR的基扇区地址+保留扇区数
FDT区基扇区地址=每FAT表扇区数×FAT表个数+(FDT区的开始簇号一2)×每簇扇区数+FAT表基扇区地址。(簇是系统进行文件管理的单位,FAT表中的每一项对应一个簇,文件的存取按簇进行,一簇包含若干个扇区。)
从FAT文件系统的组织结构可以看出,从SD卡中读取系统内核代码数据到指定的RAM区比较容易,就是根据系统内核文件名在文件系统中进行查找定位,随后 完成读取。对于内核代码的备份和加载,需要在深入分析FAT文件系统的组织结构的基础上对SD卡格式化作一些处理。在格式化时,通过设置MBR区和DBR 区的数据实现不对SD卡存储区的最末8MB区域(根据实际需要可增减)作格式化处理的目的,即把它置为RAW区。所以系统内核备份的实现,就是把系统内核 代码通过SD卡的写入指令填充到RAW区。系统内核的加载是从RAW区直接读取备份的内核代码。

3 总 结
本文所述的内核加载启动引导方式已经过实践验证。它实现了目标板与宿主机间硬件线路连接的完全脱离.为系统调试者提供了便利,有效地提高了系统调试的效 率;与此同时,它还能方便地实现系统的在线更新。可以说要进行系统启动引导设计,此方法是一个不错的选择。最后说明一点,本文介绍的BootLoader 改进方法是在LCP2294芯片开发的LPC22EB06一I实验平台上完成的。由于BootLoader与处理器的体系结构和具体嵌入式板级设备的配置 密切相关,若要在其他的处理器芯片或平台上采用上述方法,还需对BootLoader中与处理器体系结构相关的代码作适当的修改。这部分不是本文探讨的主 要内容,所以在此不再详述,若有读者还想详细了解相关内容,请查阅相关论文或书籍

更多相关文章
  • OpenRisc35基于orpsoc,eCos的sd card controller的测试实验
    引言 之前,曾经在orpsoc的平台上,测试验证过其sd card controller的linux的驱动,但是并不是很完美,经过努力,终于在eCos下完成了其全部功能的验证,包括驱动层验证,文件系统的挂载,应用层的创建文件,打开文件,文件,源文件与文件的比较等,此外,还有创建目录,切换目录等操作. ...
  • 


    		    linux2.6内核SD Card Driver详细解析之一
    linux2.6内核SD Card Driver详细解析之一 来自:CSDN博客 | 时间:2012-03-18 20:27:48 | 相似文章(0) 原文链接: http://blog.csdn.net/wavemcu/article/details/7366852 一:MMC/SD/SDIO的概 ...
  • 不从SD卡启动树莓派2
    本文你可以学到: berryboot使用,kali安装,开挂的MobaXterm,以及关于通过LABEL和UUID挂载的小技巧. 本文默认你有一定Linux基础,同时针对刚入门的水平,因为这是我的折腾记录.不懂可以留言或者email. 首先要明确的是现在暂时没有完全脱离sd卡的方法,因为Pi是默认从 ...
  • 原文网址:http://www.sandyscott.net/2013/08/14/virtualbox-direct-drive-access/ I’ve trying to get my Raspberry Pi working with a touchscreen (eGalax Touch) ...
  • 置顶 vs2008 编译adb 支持4.2 android 系统(增加push 命令的进度)
    QQ: 2506314894 本想晚些时候放出来的,但是按捺不住啊,所以修改了之后就立即放出来了.先说明一下,这次用的adb 的源码比较新的,用的vs2008 编译出来,只有一个exe 文件,直接就可以运行.修复 1)支持4.2 android 系统连接 2)修复了一些山寨手机识别不了的问题. 3) ...
  • 原文:使用批处理文件命令行方式快速启动和停止IIS.SqlServer        虽然现在内存便宜了,但是自己还是嫌自己的512M内存太小,没辦法,后台运行的东西太多了,有很多都是有用的没法关闭的.IIS和SQLServer都是吃内存大户,所以现在只在使用到它们的时候才打开,不用的时候都随时关闭 ...
  • 工作流程: mmc驱动主要文件包括 drivers/mmc/card/block.c drivers/mmc/card/queue.c drivers/mmc/core/core.c drivers/mmc/core/host.c drivers/mmc/core/ 内核启动时,首先执行core/c ...
  • C#根据域名查询IP(CMD命令参数输入或者启动程序后再输入查询)
    有时因为需要,希望知道域名的IP,那用C#怎么实现呢?以下是实现代码   using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; namespace ...
一周排行
  • 变量OMP_NESTED设置使其可以在函数中并行. #include "omp.h" #include <cstdio> #include <iostream> using ...
  • 看源文件的时候发现有个user.api.php文件,里面定义了一个新的钩子,$hook_user_categories,但是,drupal核心里面没有,我推测是自定义 的钩子函数,然后在*.module文件中被调用:
  • ACboy needs your help Time Limit: 1/1 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
  • 第一步:寻找本地包含漏洞 首先找到一个可能存在本地包含的文件,去check它 比如: www.website.com/view.php?page=contact.php 替换成 www.website.com/vie
  • WPF控件開發(2) 自動完成(AutoComplete)1
    自动完成功能使用范围很广,多以TextBox或ComboBox的形式出现,在输入的同时给予 ...
  • 首先说下,这个插件是一个实现虚拟摇杆的插件, 首先有一个Easy Button,这里我们就说下关于他的2个事件,其他像怎么获取组件是和NGUI和UGUI的方式差不多,Easy Button有2个事件,分别是1:Mas
  • 1. 外边距合并  不是bug  而是一个特性  (以最大的那个边距为准)     两个盒子是并列关系      两个盒子 父子级关系         1. border          2.overflow:hi
  • 描述:如何在虚拟外面访问虚机内的网站 解决:http://虚机ip.网站地址(http://192.168.124.41/wx/sites/tf/)
  • 


    		    英特爾緊急召回SB主板,Intel 6系列芯片組設計缺陷
    美国当地时间周一,Intel公司官方宣布,今年1月初刚刚伴随Sandy Bridge系列& ...
  • http://blog.csdn.net/lwei_998/article/details/7394638 SYSTEM表空间使用率达到了85%,查出是用来记录审计记录的aud$表占用了很大的空间. 备份后trunc