📄 嵌入式bootloader技术内幕arm9ads使用arm应用.htm
字号:
<LI><A title=应用实例
href="http://www.hzlitai.com.cn/article/yejin-article/example_1.html">应用实例</A>
</LI></UL><!--[if lte IE 6]></TD></TR></TBODY></TABLE></A><![endif]--></LI></UL><!--[if lte IE 6]></TD></TR></TBODY></TABLE></A><![endif]--></LI>
<LI><A class=hide href="http://www.hzlitai.com.cn/services.html">技术服务</A><!--[if lte IE 6]> <A
href="http://www.hzlitai.com.cn/services.html">技术服务
<TABLE>
<TBODY>
<TR>
<TD><![endif]-->
<UL>
<LI><A title=专业设计与生产服务
href="http://www.hzlitai.com.cn/odm.html">专业设计与生产服务</A> </LI>
<LI><A title=项目委托流程
href="http://www.hzlitai.com.cn/xmwtlc.html">项目委托流程</A> </LI>
<LI><A title=开发板技术支持
href="http://www.hzlitai.com.cn/services.html">开发板技术支持</A> </LI>
<LI><A title=项目委托协议
href="http://www.hzlitai.com.cn/xmwtxy.html">项目委托协议</A> </LI>
<LI><A title=技术开发合同
href="http://www.hzlitai.com.cn/jskfht.html">技术开发合同</A> </LI></UL><!--[if lte IE 6]></TD></TR></TBODY></TABLE></A><![endif]--></LI>
<LI><A class=hide href="http://www.hzlitai.com.cn/lxwm.html">联系我们</A><!--[if lte IE 6]> <A
href="http://www.hzlitai.com.cn/lxwm.html">联系我们</A><![endif]--> </LI>
<LI><A class=hide href="http://www.hzlitai.com.cn/bbs">ARM论坛</A><!--[if lte IE 6]> <A
href="http://www.hzlitai.com.cn/bbs">ARM论坛</A><![endif]--> </LI>
<LI><A class=hide href="http://www.hzlitai.com.cn/zhaopin.html">诚聘英才</A><!--[if lte IE 6]> <A
href="http://www.hzlitai.com.cn/zhaopin.html">诚聘英才</A><![endif]-->
</LI></UL></DIV></DIV></DIV><!--################coolpic Start#############################-->
<DIV id=center>
<DIV style="MARGIN: 0px auto; WIDTH: 800px; BACKGROUND-COLOR: #ffffff">
<SCRIPT language=JavaScript
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/jsad.js"></SCRIPT>
</DIV></DIV><!--################coolPic End#############################--></DIV>
<DIV id=center>
<DIV id=navbar
style="PADDING-LEFT: 10px; MARGIN-LEFT: auto; WIDTH: 790px; MARGIN-RIGHT: auto; PADDING-TOP: 8px; HEIGHT: 18px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left">您现在的位置
: <A href="http://www.hzlitai.com.cn/index.html"><SPAN
class=style1>首页</SPAN></A>>><A
href="http://www.hzlitai.com.cn/article.html"><SPAN
class=style1>文章频道</SPAN></A>>> <A
href="http://www.hzlitai.com.cn/article/ARM9-article/ARM9-article.html">ARM9开发平台相关</A>>><A
href="http://www.hzlitai.com.cn/article/ARM9-article/system_1.html"><SPAN
class=style1>操作系统</SPAN></A>>> <SPAN class=style2><FONT
color=#ff0000>嵌入式BootLoader技术内幕</FONT>【正文】</SPAN> </DIV></DIV>
<TABLE class=border style="BORDER-TOP: #000000 1px solid" cellSpacing=0
cellPadding=0 width=800 align=center bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD align=middle height=10>
<TABLE class=pageSeparator cellSpacing=6 cellPadding=0 width=800
border=0><TBODY>
<TR>
<TD align=middle height=16><FONT
style="FONT-SIZE: 9pt">来自:IBM 作者:詹荣开|zhanrk@sohu.com
时间:2006年6月6日 查看次数:
<SCRIPT language=JavaScript
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/Counter.htm"></SCRIPT>
</FONT>
关键字:【|ARM9|ADS使用|ARM应用|】</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DIV
style="FONT-SIZE: 12px; MARGIN: 0px auto; WIDTH: 800px; COLOR: #000000; BORDER-BOTTOM: #000000 1px solid; FONT-FAMILY: '宋体'; HEIGHT: 28px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: center"><!--上一篇--> <A
title=Linux串口上网的简单实现
href="http://www.hzlitai.com.cn/article/ARM9-article/system/2006101377.html">上一篇:Linux串口上网的简单实现</A> <A
title=Windows CE OAL层的结构与开发
href="http://www.hzlitai.com.cn/article/ARM9-article/system/2006101381.html">下一篇:Windows CE OAL层的结构与开发</A>
</DIV><!--下一篇-->
<TABLE class=border
style="PADDING-RIGHT: 20px; PADDING-LEFT: 20px; PADDING-BOTTOM: 20px; PADDING-TOP: 20px"
cellSpacing=6 cellPadding=0 width=800 align=center bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD align=middle><FONT
style="FONT-WEIGHT: bold; FONT-SIZE: 16px; COLOR: #666666">嵌入式BootLoader技术内幕</FONT>
</TD></TR>
<TR align=middle>
<TD class=listcontent id=fontzoom vAlign=top align=left
height=293>
<P>
<BLOCKQUOTE>本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader
的概念、软件设计的主要任务以及结构框架等内容。</BLOCKQUOTE><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
<P><A name=1><SPAN class=atitle><STRONG><FONT size=4>1.
引言</FONT></STRONG></SPAN></A></P>
<P>在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: </P>
<P>1. <B>引导加载程序。</B>包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
</P>
<P>2. <B>Linux 内核。</B>特定于嵌入式板子的定制内核以及内核的启动参数。 </P>
<P>3. <B>文件系统。</B>包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。
</P>
<P>4. <B>用户应用程序。</B>特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式 GUI
有:MicroWindows 和 MiniGUI 懂。 </P>
<P>引导加载程序是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由
BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。BIOS
在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot
Loader。Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
</P>
<P>而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU
也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于 ARM7TDMI core
的嵌入式系统中,系统在上电或复位时通常都从地址 0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
</P>
<P>本文将从 Boot Loader 的概念、Boot Loader 的主要任务、Boot Loader 的框架结构以及 Boot Loader
的安装等四个方面来讨论嵌入式系统的 Boot Loader。 </P>
<P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793129734.gif"
width="100%"><BR><IMG height=6 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793130580.gif"
width=8 border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793130580.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center></TD>
<TD vAlign=top align=right><B><FONT face=Verdana
color=#996699></FONT></B></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P>
<P><A name=2><SPAN class=atitle><STRONG><FONT size=4>2. Boot Loader
的概念</FONT></STRONG></SPAN></A></P>
<P>简单地说,Boot Loader
就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
</P>
<P>通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader
几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。
</P>
<P><A name=N1006D><SPAN class=smalltitle><STRONG><FONT size=3>1. Boot
Loader 所支持的 CPU 和嵌入式板</FONT></STRONG></SPAN></A></P>
<P>每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot
就同时支持 ARM 体系结构和MIPS 体系结构。除了依赖于 CPU 的体系结构外,Boot Loader
实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,要想让运行在一块板子上的
Boot Loader 程序也能运行在另一块板子上,通常也都需要修改 Boot Loader 的源程序。 </P>
<P><A name=N10076><SPAN class=smalltitle><STRONG><FONT size=3>2. Boot
Loader 的安装媒介(Installation Medium)</FONT></STRONG></SPAN></A></P>
<P>系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU
在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU
构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH
等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。 </P>
<P>下图1就是一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图。 </P>
<P><BR><A name=N10084><B>图1 固态存储设备的典型空间分配结构</B></A><BR><IMG src="">
<BR></P>
<P><A name=N1008F><SPAN class=smalltitle><STRONG><FONT size=3>3. 用来控制 Boot
Loader 的设备或机制</FONT></STRONG></SPAN></A></P>
<P>主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行
I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。 </P>
<P><A name=N10098><SPAN class=smalltitle><STRONG><FONT size=3>4. Boot
Loader 的启动过程是单阶段(Single
Stage)还是多阶段(Multi-Stage)</FONT></STRONG></SPAN></A></P>
<P>通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2
阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。而至于在 stage 1 和 stage 2
具体完成哪些任务将在下面讨论。 </P>
<P><A name=N100A1><SPAN class=smalltitle><STRONG><FONT size=3>5. Boot
Loader 的操作模式 (Operation Mode)</FONT></STRONG></SPAN></A></P>
<P>大多数 Boot Loader
都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader
的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 </P>
<P><B>启动加载(Boot loading)模式:</B>这种模式也称为"自主"(Autonomous)模式。也即 Boot Loader
从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader
的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。 </P>
<P><B>下载(Downloading)模式:</B>在这种模式下,目标机上的 Boot Loader
将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot
Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。Boot Loader
的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的
Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。 </P>
<P>像 Blob 或 U-Boot 等这样功能强大的 Boot Loader
通常同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,Blob 在启动时处于正常的启动加载模式,但是它会延时 10
秒等待终端用户按下任意键而将 blob 切换到下载模式。如果在 10 秒内没有用户按键,则 blob 继续启动 Linux 内核。 </P>
<P><A name=N100B9><SPAN class=smalltitle><STRONG><FONT size=3>6.
BootLoader 与主机之间进行文件传输所用的通信设备及协议</FONT></STRONG></SPAN></A></P>
<P>最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输协议通常是 xmodem/ymodem/zmodem
协议中的一种。但是,串口传输的速度是有限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。 </P>
<P>此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来的提供
TFTP 服务。 </P>
<P>在讨论了 BootLoader 的上述概念后,下面我们来具体看看 BootLoader 的应该完成哪些任务。 </P>
<P><BR>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD><IMG height=1 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793129734.gif"
width="100%"><BR><IMG height=6 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793130580.gif"
width=8 border=0></TD></TR></TBODY></TABLE>
<TABLE class=no-print cellSpacing=0 cellPadding=0 align=right>
<TBODY>
<TR align=right>
<TD><IMG height=4 alt=""
src="嵌入式BootLoader技术内幕ARM9ADS使用ARM应用.files/20066793130580.gif"
width="100%"><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD vAlign=center><BR></TD>
<TD vAlign=top align=right><B><FONT face=Verdana
color=#996699></FONT></B></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></P>
<P><A name=3><SPAN class=atitle><STRONG><FONT size=4>3. Boot Loader
的主要任务与典型结构框架</FONT></STRONG></SPAN></A></P>
<P>在继续本节的讨论之前,首先我们做一个假定,那就是:假定内核映像与根文件系统映像都被加载到 RAM
中运行。之所以提出这样一个假设前提是因为,在嵌入式系统中内核映像与根文件系统映像也可以直接在 ROM 或 Flash
这样的固态存储设备中直接运行。但这种做法无疑是以运行速度的牺牲为代价的。 </P>
<P>从操作系统的角度看,Boot Loader 的总目标就是正确地调用内核来执行。 </P>
<P>另外,由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和
stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1
中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2
则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。 </P>
<P>Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): </P>
<UL>
<LI>硬件设备初始化。 <BR><BR>
<LI>为加载 Boot Loader 的 stage2 准备 RAM 空间。 <BR><BR>
<LI>拷贝 Boot Loader 的 stage2 到 RAM 空间中。 <BR><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -