﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C/C++/Linux/Embedded-文章分类-Linux</title><link>http://www.cppblog.com/fenixchen/category/3744.html</link><description>学习也是一种乐趣</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 09:02:06 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 09:02:06 GMT</pubDate><ttl>60</ttl><item><title>SkyEye硬件模拟平台，第三部分: 硬件仿真实现之一SkyEye的设计实现</title><link>http://www.cppblog.com/fenixchen/articles/19642.html</link><dc:creator>陈长虹</dc:creator><author>陈长虹</author><pubDate>Mon, 12 Mar 2007 08:36:00 GMT</pubDate><guid>http://www.cppblog.com/fenixchen/articles/19642.html</guid><wfw:comment>http://www.cppblog.com/fenixchen/comments/19642.html</wfw:comment><comments>http://www.cppblog.com/fenixchen/articles/19642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenixchen/comments/commentRss/19642.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenixchen/services/trackbacks/19642.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1> </h1>
								</td>
								<td class="no-print" width="192">
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<table cellspacing="0" cellpadding="0" width="143" border="0">
																												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																												<form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp">
																														<input type="hidden" value="本系列文章的第三部分主要介绍了SkyEye硬件模拟平台的实现细节。主要内容包括SkyEye的总体设计、SkyEye的可扩展框架、SkyEye的关键数据结构、SkyEye对各种CPU的模拟实现、SkyEye对各种外设的模拟实现、如何安装使用SkyEye以及如何扩展SkyEye的仿真模块等。对SkyEye的深入了解，有助于对嵌入式硬件系统有更深入的认识，特别是对操作系统、驱动程序如何与嵌入式硬件系统进行交互有更深刻的了解。" name="body" />
																														<input type="hidden" value="SkyEye硬件模拟平台，第三部分: 硬件仿真实现之一" name="subject" />
																														<input type="hidden" value="cn" name="lang" />
																														<script language="JavaScript" type="text/javascript">
																																<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																														</script>
																														<tbody>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td width="16">
																																						<img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</tbody>
																												</form>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- 03/20/06 updated by gretchen -->
										<br />
										<table cellspacing="0" cellpadding="0" width="150" border="0">
												<tbody>
														<tr>
																<td class="v14-header-2-small">拓展 Tomcat 应用</td>
														</tr>
												</tbody>
										</table>
										<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td class="no-padding" width="150">
																		<table cellspacing="0" cellpadding="0" width="143" border="0">
																				<tbody>
																						<tr valign="top">
																								<td width="8">
																										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																								</td>
																								<td>
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/fw_bold.gif" width="16" vspace="3" border="0" />
																								</td>
																								<td width="125">
																										<p>
																												<a class="smallplainlink" href="http://www.ibm.com/developerworks/cn/kickstart/webserver.html?S_TACT=105AGX52&amp;S_CMP=simpleart">
																														<font color="#5c81a7" size="2">下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1</font>
																												</a>
																										</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>级别: 初级</p>
		<p>
				<a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/index.html#author">
						<font color="#996699">陈渝</font>
				</a> (<a href="mailto:yuchen@tsinghua.edu.cn?subject=硬件仿真实现之一&amp;cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a>)清华大学<br /></p>
		<p>2004 年 10 月 01 日</p>
		<blockquote> </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>前两篇文章分别介绍了 SkyEye 项目及其安装，下面的几篇文章将对其设计实现展开讨论。</p>
		<p>
				<a name="N10049">
						<span class="atitle">一． SkyEye的总体结构</span>
				</a>
		</p>
		<p>SkyEye基于GDB/ARMulator(目前由David McCullough 维护)，并进行了全面的改变和扩展。SkyEye建立在GNU GDB的底层，可以模仿多种完整的嵌入式计算机系统，目前模拟的硬件包括CPU、内存、I/O寄存器、时钟、UART、网络芯片、MMU、CACHE，将来还会模拟 LCD、USB等各种硬件。在SkyEye上运行的操作系统和各种系统软件"意识"不到它们是在一个虚拟的计算机系统上运行。 </p>
		<p>SkyEye从总体上分为四个层次：</p>
		<ul>
				<li>用户接口模块：包括命令行用户界面和图形用户界面，完成处理用户的输入命令，并把相关调试数据输出给用户的任务。这一部分基本上直接利用了GDB的用户接口模块，并在此基础上有一定的扩充。 
</li>
				<li>符号处理模块：主要处理执行文件的头信息，解释执行文件中内嵌的debuger调试信息，对符号表的管理，对源代码表达式的解析，定位源代码中的语句位置和机器码的位置关系等。这一部分也是直接利用了GDB的符号处理模块，也正是有了这个模块的支持，SkyEye可以支持源码级调试。 
</li>
				<li>目标控制模块：主要完成执行控制（如中断程序的执行，设置中断条件等），程序栈结构分析，对具体目标硬件的控制（如本地调试、远程调试和模拟调试的控制）。这一部分完成对SkyEye上运行的软件的控制，提供了多种调试手段。 
</li>
				<li>目标模拟模块：这一部分是SkyEye的核心。它的功能是模仿计算机系统中的主要硬件（包括CPU、内存和各种硬件外设等）的执行，对执行文件的机器指令进行解释，并模拟执行每一条机器指令，产生相应的硬件响应等。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10064">
						<span class="atitle">二． SkyEye目标模拟模块功能划分</span>
				</a>
		</p>
		<br />
		<br />
		<img height="422" alt="" src="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/images/image001.gif" width="440" border="0" />
		<br />
		<p>SkyEye目标模拟模块模拟的硬件逻辑结构图如图 0 1所示。SkyEye目标模拟模块从功能上可分为如下几大模块：</p>
		<ul>
				<li>配置选项解析和初始化模块：在模拟硬件开始运行前，根据配置文件的选项，控制对模拟硬件的配置和初始化。相关文件包括： 
<ul><li>arminit.c：控制各种模拟硬件的初始化 
</li><li>skyeye_config.[ch]：解析配置文件的选项行 
</li><li>skyeye_options.c：根据各种硬件的选项，完成各种配置 
</li><li></li></ul></li>
				<li>处理器模拟宏模块：主要完成与处理器体系结构相关的模拟，它可细分为：CPU指令模拟执行模块、MMU/CACHE模拟模块、CoProcessor(又称协处理器)模拟模块。 
</li>
				<li>CPU指令模拟执行模块：其主要任务是：当模拟硬件开始运行，完成指令读取，指令译码，指令执行的工作；如果CPU状态发生了改变，调整指令和各种寄存器值；在指令执行前，调用开发板IO模拟模块的io_do_cycle驱动模拟各种外设的行为。主要的文件包括： 
<ul><li>armemu.[ch]：模拟CPU的3级流水线，并具体执行各种指令 </li></ul></li>
				<li>MMU/CACHE模拟模块：本模块分为两部分：与具体CPU类型无关的MMU/CACHE模拟子模块和与具体CPU类型相关的模拟子模块。主要的任务是：根据配置文件进行初始化；进行MMU/CACHE模拟；执行与MMU/CACHE相关的指令。如果CPU指令模拟模块执行读写存储器的操作指令，则转到MMU/CACHE模拟模块。如果模拟的CPU类型不支持MMU(如ARM7TDMI)，则SkyEye会根据将访问的地址，直接转到MEMORY模拟模块或开发板IO模拟模块；否则转到具体CPU类型相关的模拟子模块进行MMU/CACHE模拟。主要的文件包括两部分： 
<ul><li>与具体CPU类型无关的MMU/CACHE模拟子模块： 
<ul><li>armvirt.c、armmmu.c、mmu/*.[ch] </li></ul></li><li>与具体CPU类型相关的MMU/CACHE模拟子模块： 
<ul><li>sa_mmu.[ch]：模拟strongarm的MMU/CACHE 
</li><li>arm7100_mmu.[ch]：模拟arm7[12]0T的MMU/CACHE 
</li><li>xscale_copro.c：模拟xscale的MMU/CACHE 
</li><li>arm920t_mmu.[ch]：模拟arm920t的MMU/CACHE </li></ul></li></ul></li>
				<li>CoProcessor(又称协处理器)模拟模块：其主要任务是：完成各种协处理器的初始化；执行各种协处理器的指令。实际上MMU/CACHE模拟模块的一部分工作是模拟ARM的第15号协处理器，它的主要功能是配置MMU/CACHE等。主要的文件包括： 
<ul><li>armcopro.c：根据配置信息，完成对ARM协处理器的初始化配置 
</li><li>xscale_copro.c：模拟xscale的协处理器cp13、cp14、cp15 
</li><li>sa_mmu.[ch]、arm7100_mmu.[ch]：模拟strongarm、ep7312的协处理器cp15 
</li><li>arm920t_mmu.[ch]：模拟arm920t的协处理器cp13、cp14、cp15 </li></ul></li>
				<li>IO模拟宏模块：本模块包含各种逻辑行为各异的外设模拟，主要包括系统IO模拟模块、网络芯片模拟模块、LCD模拟模块等。 
</li>
				<li>系统IO模拟模块：本模块的主要任务包括：根据配置文件进行IO和外设初始化；完成各种外部IO设备的模拟(如时钟计数器累加、产生中断、LCD显示等)；进行各种特定CPU和外设的IO寄存器读写的模拟。本模块与各种具体的开发板和CPU有很紧密的联系，主要的文件包括： 
<ul><li>armio.[ch]：建立在各个特定模拟子模块上的抽象层模块 
</li><li>skyeye_mach_at91.c：模拟Atmel AT91X40开发板 
</li><li>skyeye_mach_ep7312.c：模拟cirrus ep7312开发板 
</li><li>skyeye_mach_pxa.c：模拟intel xscale lubbock开发板 
</li><li>skyeye_mach_s3c4510b.c：模拟基于samsung s3c4510b的开发板 
</li><li>skyeye_mach_s3c44b0.c：模拟基于samsung s3c44b0的开发板 
</li><li>skyeye_mach_sa.c：模拟基于intel strongam的adsbitsy开发板 
</li><li>skyeye_mach_lpc.c：模拟基于philip lpc2249的开发板 
</li><li>skyeye_mach_sharp.c：模拟基于sharp lh7a400的开发板 
</li><li>skyeye_mach_at91rm92.c：模拟基于atmel at91rm9200的开发板 
</li><li>skyeye_mach_cs89712.c：模拟基于cs89712的开发板 </li></ul></li>
				<li>网络芯片模拟模块：本模块主要完成了对8019AS网络芯片的模拟工作，主要任务包括：模拟8019AS的控制逻辑、8019AS与具体开发板IO模拟模块的接口、虚拟网络输入输出接口处理。主要的文件包括： 
<ul><li>skyeye-ne2k.[ch]：8019AS的硬件逻辑模拟 
</li><li>skyeye_mach_at91.c：部分内容完成接收虚拟网络输入处理模拟 
</li><li>skyeye_net_tuntap.c：配置tuntap虚拟网络的接口 
</li><li>skyeye_net_vnet.c：配置vnet虚拟网络的接口 
</li><li>vnet.c、if_vnet.h：独立存在的软件包，vnet虚拟网络的具体实现 </li></ul></li>
				<li>LCD/TouchScreen模拟模块：本模块主要完成LCD/TouchScreen控制逻辑的模拟，是目前唯一需要GUI支持的模块，它的主要任务是：配置LCD/TouchScreen硬件模拟、模拟LCD/TouchScreen控制逻辑。有关LCD/TouchScreen模拟相关的文件包括： 
<ul><li>skyeye_lcd.[ch]： LCD/TouchScreen配置和LCD/TouchScreen模拟的通用控制逻辑 
</li><li>skyeye_mach_*.c：与开发板相关LCD/TouchScreen的控制逻辑和中断处理，目前支持ep7312和pxa255的skyeye模拟。 </li></ul></li>
				<li>MEMORY模拟模块：本模块与具体的CPU和开发板无关，它的主要任务包括：根据配置文件进行内存初始化，并加载binary image文件；进行RAM/ROM读写的模拟。主要的文件包括： 
<ul><li>armmem.[ch]：主要完成RAM/ROM读写模拟 </li></ul></li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10125">
						<span class="atitle">三． SkyEye关键数据结构</span>
				</a>
		</p>
		<p>SkyEye目标模拟模块中，各种数据结构很多，用于模拟硬件总体机构定义的主要数据结构有skyeye_config_t和ARMul_State。把握这两个数据结构，是理解整个skyeye模拟的硬件体系结构的关键，在这两个数据结构上进行进一步细化分析，则可充分了解skyeye的硬件体系结构细节。</p>
		<p>
				<a name="N1012E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1. skyeye_config数据结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>skyeye_config_t结构描述了SkyEye模拟的整个硬件的静态配置，它的具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct {
        cpu_config_t *cpu;
        machine_config_t *mach;
        mem_config_t mem;
        net_config_t net[NET_MAXNICNUM_PER_HOST];
        uart_config_t uart;
        log_config_t log;
        ARMword start_address;
	    ARMword no_lcd;
        char config_file[MAX_FILE_NAME];
} skyeye_config_t;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>skyeye_config_t结构包含了CPU核心配置信息－cpu、开发板配置信息－mach、memory map 配置信息-mem、网络芯片和网络环境配置信息－net、面向主机的输入输出配置信息－uart、测试记录输出配置信息－log、模拟执行起始地址配置信息－start_address、是否有LCD－no_lcd和记录文件名信息－config_file。这里面与模拟硬件紧密相关的是CPU核心配置信息、开发板配置信息、memory map 配置信息、网络芯片和网络环境、LCD配置信息。</p>
		<p>
				<a name="N1013E">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2. cpu_config_t数据结构 </font>
								</strong>
						</span>
				</a>
		</p>
		<p>描述CPU核心的结构定义在cpu_config_t数据结构中，具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct {
        const char *cpu_arch_name; 
        const char *cpu_name; 
        ARMword cpu_val;
        ARMword cpu_mask; 
        ARMword cachetype;
} cpu_config_t;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其具体描述解释如下：</p>
		<ul>
				<li>cpu_arch_name：描述了arm cpu体系结构的名称，根据ARM CPU内核的发展，其体系结构已经从Version1发展到了Version5，其最新版本为Version5TE。而Intel在其基础上又进行了自己的扩展体系结构StrongARM(基于ARM version4)和XScale(基于ARM version5)。目前SkyEye支持"armv3"、"armv4"、"arm5"、"arm5TE"、"xscale"的体系结构。 
</li>
				<li>cpu_name：描述了具体的arm cpu名称，如arm7TDMI、ARM720T、StrongARM1100/1110、XScale PXA2xx等。目前SkyEye支持"arm710"、"arm7TDMI"、"arm720t"、"sa1100"、"xscale"等。 
</li>
				<li>cpu_val：这是用来表示process id，一般而言每种具体的ARM CPU 都有一个ID，更详细的描述可参考《ARM Architecture Reference Manual》的B2-6。操作系统根据这个ID来识别cpu的类型并执行相关配置。 
</li>
				<li>cpu_mask：这是用来确定process id的屏蔽位数。由于process id中的某些位用于其它目的，并不用来表示具体的CPU类型。实际上操作系统在确定CPU类型时用到的数字是cpu_val&amp;cpu_mask。 
</li>
				<li>cache_type：基于ARM内核的CPU种类繁多，但如果根据CACHE类型来分，可分为三种：无CACHE类型、统一结构CACHE类型和哈佛结构CACHE类型。SkyEye支持这三种类型。统一结构CACHE类型的CPU中，指令和数据共用同一个CACHE；而哈佛结构CACHE类型的CPU中，存在相互独立的数据CACHE和指令CACHE。无CACHE的CPU尺寸比有CACHE的CPU尺寸要小很多，成本上有优势，但在性能上要低于有CACHE的CPU。 </li>
		</ul>
		<p>SkyEye定义了一个cpu_config_t结构的数组(位于skyeye_option.c中)，结构如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">cpu_config_t arm_cpu[] = {
      {"armv3", "arm710",      0x41007100, 0xfff8ff00, DATACACHE},
      {"armv3", "arm7tdmi",   0x41007700, 0xfff8ff00, NONCACHE},
      {"armv4", "arm720t",     0x41807200, 0xffffff00,  DATACACHE},
      {"armv4", "sa1110",       0x6901b110, 0xfffffff0,   INSTCACHE},
      {"armv4", "sa1100",       0x4401a100, 0xffffffe0,   INSTCACHE},
      {"xscale", "xscale",         0x69052100, 0xfffffff0,   INSTCACHE}
};
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10167">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3. machine_config_t数据结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>machine_config_t结构描述了开发板配置信息，定义在skyeye_config.h中，具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct machine_config{
    const char *machine_name;  
    void (*mach_init)(ARMul_State *state,\
                      struct machine_config *this_mach);
    void (*mach_io_do_cycle)(ARMul_State *state);
    void (*mach_io_reset)(ARMul_State *state);
    void (*mach_update_int)(ARMul_State *state);
    ARMword (*mach_io_read_byte)(ARMul_State *state, ARMword addr);
    void (*mach_io_write_byte)(ARMul_State *state, ARMword addr,\   
                                 ARMword data);
    ARMword (*mach_io_read_halfword)(ARMul_State *state, \
                                           ARMword addr);
    void (*mach_io_write_halfword)(ARMul_State *state, ARMword addr,\
                                     ARMword data);
    ARMword (*mach_io_read_word)(ARMul_State *state, ARMword addr);
    void (*mach_io_write_word)(ARMul_State *state, ARMword addr,\   
                                 ARMword data);} machine_config_t;
}machine_config_t
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其具体描述解释如下：</p>
		<ul>
				<li>machine_name：开发板的名称。目前支持的开发板有：atmel的基于AT91X40 CPU的开发板、基于Cirrus Logic ep7312的开发板、基于Intel StrongARM的adsbitsy开发板、基于Intel XScale PXA25x的Lubbock开发板等。 
</li>
				<li>mach_init：开发板初始化配置函数，主要初始化一些与开发板相关的变量和配置mach_io_do_cycyle、mach_io_read/write_byte/halfword/word函数。mach_init函数被wrappe.c中的init函数调用。 
</li>
				<li>mach_io_reset：开发板运行初始化函数。主要初始化与开发板相关的变量。 
</li>
				<li>mach_update_int ：定义了与开发板相关的中断处理函数。 
</li>
				<li>mach_io_read/write_*：分别定义与开发板相关的I/O函数。 </li>
		</ul>
		<p>SkyEye定义了一个machine_config_t结构的数组(位于skyeye_option.c中)，结构如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">machine_config_t arm_machines[] = {     
      {"at91",              at91_mach_init,          NULL, ......},
      {"ep7312",         ep7312_mach_init,      NULL, ......},
      {"s3c4510b",      s3c4510b_mach_init,  NULL, ......},
      {"s3c44b0",        s3c44b0_mach_init,    NULL, ......},
      {"sa1100",          sa1100_mach_init,      NULL, ......},
      {"pxa_lubbock",  pxa_mach_init,           NULL, ......} …… 
};
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="N10190">
						<span class="smalltitle">
								<strong>
										<font face="Arial">4. mem_config_t和mem_bank_t数据结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>SkyEye的内存映射配置结构由mem_config_t和mem_bank_t数据结构描述。ARM体系结构与x86体系结构在I/O内存映射上有所不同。X86体系结构可以使用I/O端口来映射外部设备上的寄存器和设备内存；而ARM体系结构是通过标准的memory地址空间来映射外设的寄存器或设备内存，而且在通常情况下，I/O地址空间不会通过CACHE进行缓存。目前SkyEye支持三种类型的内存映射：ROM SPACE(只读)、RAM SPACE(可读写)、IO SPACE(可读写，与特定开发板相关)。SkyEye对这三种类型的内存映射的处理是不同的。在SkyEye中把一段连续的地址空间称为一个mem_bank，多个mem_bank之间不一定连续。mem_config_t数据结构的具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct {
        int bank_num;
        int current_num;
        mem_bank_t mem_banks[MAX_BANK];
} mem_config_t;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其中 bank_num用来记录当前的硬件配置中的mem_bank总数，current_num是用于解析skyeye.conf中的mem_bank配置信息的一个辅助变量，mem_banks数组具体记录了每个mem_bank的类型和相关的访问函数。mem_bank_t数据结构的具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct mem_bank_t {
  ARMword (*read_byte)(ARMul_State *state, ARMword addr);
  void (*write_byte)(ARMul_State *state, ARMword addr, ARMword data);
  ARMword (*read_halfword)(ARMul_State *state, ARMword addr);
  void(*write_halfword)(ARMul_State *state, ARMword addr, ARMword data);
  ARMword (*read_word)(ARMul_State *state, ARMword addr);
  void (*write_word)(ARMul_State *state, ARMword addr, ARMword data);
  unsigned long   addr, len;
  char    filename[MAX_STR];
  unsigned type;
} mem_bank_t;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其中的read/write_* 函数指针分别对应了不同类型内存映射的访问函数；addr表示mem_bank的起始地址；len表示mem_bank_的大小；filename是binary image文件名；type表示mem_bank的类型。函数指针赋值等配置过程由skyeye_options.c中的函数do_mem_bank_option完成。如果在skyeye.conf中存在binary image文件名，则do_mem_bank_option函数会把文件内容读入到对应的mem_bank中。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part3/s1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N101A7">
						<span class="atitle">5. net_config_t数据结构</span>
				</a>
		</p>
		<p>SkyEye支持网络模拟，目前描述网络配置的数据结构是net_config_t，它的具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">typedef struct {
   int state;
   unsigned char macaddr[6];
   unsigned char  hostip[4]; 
   int ethmod;
   int fd;                     
   int hubindex; 
   int (*net_init)(int index, unsigned char *macaddr, unsigned char *hostip);
   unsigned char (*net_output)(int if_fd, ARMul_State *state,\
                   unsigned char startpage,unsigned short packet_len);
   void  (*net_input)(int if_fd, ARMul_State *state);
}net_config_t;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>其中各个field的含义描述如下：</p>
		<ul>
				<li>state是一个布尔变量，它为1表示网络芯片工作，它为0表示网络芯片不工作。 
</li>
				<li>macaddr用来保存网络芯片的mac地址 
</li>
				<li>hostip用来保存主机上与SkyEye进行网络通信所用的IP地址 
</li>
				<li>ethmod：表示与主机的模拟网络交互的方式；目前定义的交互方式有： 
<ul><li>#define NET_MOD_LINUX 0 
</li><li>#define NET_MOD_TUNTAP 1 
</li><li>#define NET_MOD_WIN 2 
</li><li>#define NET_MOD_VNET 3 </li></ul></li>
		</ul>
		<p>目前可以使用的两种方式有 NET_MOD_VNET(与SkyEye提供的vnet.o内核模块进行网络交互)和 NET_MOD_TUNTAP(与linux的tun.on内核模块进行网络交互)。</p>
		<ul>
				<li>fd：表示SkyEye用于与主机进行网络交互的设备文件描述符。 
</li>
				<li>hubindex：用于NET_MOD_VNET方式，表示所处的是第几个虚拟hub网段。如果它的值是i，则处于第i个hub网段中。 
</li>
				<li>net_init/net_input/net_output：这三个函数与具体的模拟网络交互方式有关，分别完成初始化操作和与主机网络的输入输出操作。相关的实现在文件skyeye_net_*.c中。 </li>
		</ul>
		<p>有关8019AS模拟芯片(NE2000兼容)的具体配置与实现位于文件skyeye-ne2k.[ch]中。有关网络模拟的具体实现可参考错误！未找到引用源。节。</p>
		<p>
				<a name="N101E7">
						<span class="smalltitle">
								<strong>
										<font face="Arial">6. ARMul_State数据结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>上面讲述的是与SkyEye的硬件配置相关的数据结构，可以理解为一种静态硬件配置的数据结构，这些数据结构中的域基本不随着SkyEye模拟硬件的运行而改变。而ARMul_State描述的是一种动态硬件配置的数据结构，它保存了随着SkyEye模拟硬件的运行而时刻改变的硬件数据。由于ARMul_State中的域数量繁多，大体分为</p>
		<ul>
				<li>与CPU模拟相关的域 
</li>
				<li>与协处理器模拟相关的域 
</li>
				<li>与内存和MMU/CACHE相关的域 
<ul><li>与统计相关的域 
</li><li>与具体开发板相关的io部分 </li></ul></li>
		</ul>
		<p>这里只描述其中关键的部分：</p>
		<ul>
				<li>与CPU模拟相关的域 
<ul><li>ARMword Reg[16]：CPU当前模式下的寄存器值 
</li><li>ARMword RegBank[7][16]：CPU所有七种模式下的寄存器值 
</li><li>ARMword Cpsr：CPU的当前程序状态寄存器 
</li><li>ARMword Spsr[7]：CPU所有七种模式下的程序状态保存寄存器 
</li><li>ARMdword Accumulator：40bit的累加寄存器，目前用于xscale体系结构中 
</li><li>ARMword NFlag, ZFlag, CFlag, VFlag, IFFlags, Sflag,TFlag：各种状态位 
</li><li>ARMword Bank：CPU对应模式寄存器组的索引值 
</li><li>ARMword Mode：CPU模式索引值 
</li><li>ARMword instr, pc：pc是目前正在执行的程序指针，instr是pc所指地址的内容 
</li><li>ARMword loaded, decoded：loaded是正在加载的指令，decoded是正在解码的指令 
</li><li>unsigned NfiqSig：FIQ信号 
</li><li>unsigned NirqSig：IRQ信号 </li></ul></li>
				<li>与协处理器模拟相关的域 
<ul><li>ARMul_CPInits *CPInit[16]：16个协处理器的初始化函数 
</li><li>ARMul_CPExits *CPExit[16]：16个协处理器的退出函数 
</li><li>ARMul_LDCs *LDC[16]：16个协处理器的LDC指令函数 
</li><li>ARMul_STCs *STC[16]：16个协处理器的STC指令函数 
</li><li>ARMul_MRCs *MRC[16]：16个协处理器的MRC指令函数 
</li><li>ARMul_MCRs *MCR[16]：16个协处理器的MCR指令函数 
</li><li>ARMul_CDPs *CDP[16]：16个协处理器的CDP指令函数 
</li><li>ARMul_CPReads *CPRead[16]：16个协处理器的读CP寄存器函数 
</li><li>ARMul_CPWrites *CPWrite[16]：16个协处理器的写CP寄存器函数 
</li><li>unsigned char *CPData[16]：16个协处理器的数据指针 
</li><li>ARMword CP14R0_CCD：在xscale体系结构的CP14协处理器中，用于统计时钟周期 </li></ul></li>
				<li>与内存和MMU/CACHE相关的域 
<ul><li>mmu_state_t mmu：mmu/cache的数据结构，在armmmu.h中定义，详解请参考"SkyEye的MMU/CACHE和Memory模拟实现"一节 
</li><li>mem_state_t mem：memory的数据结构，在armmem.h中定义，详解请参考"SkyEye的MMU/CACHE和Memory模拟实现"一节 </li></ul></li>
				<li>与统计相关的域 
<ul><li>unsigned long NumScycles, NumNcycles, NumIcycles, NumCcycles, NumFcycles：用于统计不同状态下的周期数 
</li><li>unsigned long NumInstrs：当前执行的指令数 </li></ul></li>
		</ul>
		<p>其它与特定CPU和开发板相关的各种io寄存器的定义放到了各个与开发板相关的文件中，如skyeye_mach_at91/ep7312/pxa/sa.c等处，详解请参考"SkyEye的开发板IO模拟实现"。</p>
		<p>与具体开发板相关的io部分 <br />ARMul_io mach_io; <br />其中ARMul_io的结构目前为 </p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">struct ARMul_io
{
	ARMword *instr; //to display the current interrupt state
	ARMword *net_flag;//to judge if network is enabled
	ARMword *net_int; //netcard interrupt
	ARMword *lcd_is_enable;   	   //turn lcd on?
	ARMword *lcd_addr_begin;   //the begining display mem addr of lcd 
	ARMword *lcd_addr_end;     //the end      display mem addr of lcd
};
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>instr是记录当前的中断状态 <br />net_flag判断网络选项是否打开 <br />net_int用来记录网络中断号 <br />lcd_is_enable来记录LCD是否使能 <br />lcd_addr_begin记录lcd显存的起始位置 <br />lcd_addr_end记录显存的结束位置 </p>
		<p>
				<a name="N1028F">
						<span class="smalltitle">
								<strong>
										<font face="Arial">7． SkyEye逻辑执行流程</font>
								</strong>
						</span>
				</a>
		</p>
		<p>了解SkEye的总体逻辑执行流程，对了解硬件的体系结构和软件/硬件的接口有较大帮助。从总体上，可把SkyEye逻辑执行流程按执行的时间顺序划分为两个阶段：</p>
		<p>1. SkyEye加载与配置处理过程</p>
		<p>2. SkyEye模拟执行过程</p>
		<p>第一阶段为第二阶段的正常执行做了充分的准备，具体的执行内容包括；</p>
		<ul>
				<li>读入带调试信息的操作系统执行文件(由GDB完成) 
</li>
				<li>根据配置文件skyeye.conf的信息配置模拟硬件 
</li>
				<li>如果skyeye.conf中存在binary image格式文件，加载这些文件 
</li>
				<li>根据操作系统执行文件的内容加载调试信息(由GDB完成) 
</li>
				<li>根据操作系统执行文件信息加载执行文件中的代码段和数据段等(由GDB完成) 
</li>
				<li>执行相关模拟硬件的初始化函数 </li>
		</ul>
		<p>其中总的初始化函数是位于wrapper.c中的init函数，它调用如下函数完成整个模拟硬件的初始化工作：</p>
		<ol>
				<li>ARMul_EmulateInit：初始化与执行机器指令相关的数据ARMul_ImmedTable和ARMul_BitList 
</li>
				<li>ARMul_NewState：初始化结构为ARMul_State的全局变量state 
</li>
				<li>skyeye_option_init：初始化全局变量skyeye_config 
</li>
				<li>skyeye_read_config：读取配置文件skyeye.conf并根据配置文件进行相关配置 
</li>
				<li>nic_init：根据配置文件信息配置网络模拟环境 
</li>
				<li>skyeye_config.mach-&gt;mach_init(state, skyeye_config.mach)：根据配置文件信息配置CPU和开发板的相关I/O函数 
</li>
				<li>ARMul_Reset(state)：进一步初始化全局变量state，并根据配置文件信息配置MMU/CACHE和memory 
</li>
				<li>io_reset：初始化特定CPU和开发板的IO寄存器 </li>
		</ol>
		<p>第二阶段根据特定硬件的配置描述，开始执行特定硬件模拟处理。整个过程围绕CPU执行指令展开，根据模拟硬件可分为如下几个阶段：</p>
		<ul>
				<li>CPU执行三级流水线处理，即取指令、译码、执行指令，主要处理集中在armemu.c中的ARMul_Emulate32/26函数。 
</li>
				<li>在执行指令过程中，如果有中断产生，CPU调整运行模式，并改变指令指向中断向量起始地址，主要处理集中在arminit.c中的函数ARMul_Abort函数、armemu.c中的ARMul_Emulate32/26函数。 
</li>
				<li>在执行指令过程中，如果指令是协处理器指令，则把指令转交给协处理器模拟模块进行进一步处理，主要处理集中在文件armcopro.c、xscale_copro.c等文件中。 
</li>
				<li>在执行指令过程中，如果发现指令是访问内存/IO的指令，则根据SkyEye模拟的特定CPU是否有MMU/CACHE分别进行处理： 
<ul><li>如果CPU有MMU/CACHE，则进入MMU/CACHE模拟模块，如果还需要内存访问，则进入memory模拟模块处理。如果访问地址属于IO地址空间，则转到特定CPU和开发板的IO模拟模块处理。 
</li><li>如果CPU没有MMU/CACHE，则直接进入memory模拟模块处理。如果访问地址属于IO地址空间，则转到特定CPU和开发板的IO模拟模块处理。 </li></ul></li>
		</ul>
		<p>处理访问内存/IO的指令的相关内容集中在armvirt.c；与MMU/CACHE处理、read/write buffer(用于StrongARM和XScale体系结构的模拟)处理相关的文件包括armmmu.[ch]、mmu/*.[ch]；与访问memory模拟有关的内容主要集中在armmem.[ch]中。</p>
		<ul>
				<li>如果要执行IO地址访问，这具体的处理过程由特定CPU和开发板IO模拟模块中的read/write_byte/halfword/word函数处理。 
<ul><li>为了模拟外设的执行，在执行指令过程的每一个周期，会执行一个io_do_cycle函数，它会调用特定CPU和开发板的IO模拟模块中的*_io_do_cycle函数，完成对时钟、网络输入输出、UART输入输出等的处理，并根据条件产生中断信号。 </li></ul></li>
		</ul>
		<p>下一篇文章将讨论 CPU/开发板仿真。</p>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>本文节自 <a href="http://www.china-pub.com/computers/common/info.asp?id=21879"><font color="#996699">《源码开放的嵌入式系统软件分析与实践——基于SkyEye和ARM开发平台》</font></a>一书的第三章，对 SkyEye 开源项目感兴趣的可以阅读本书。 <br /><br /><br /></li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html">
								<font color="#996699">SkyEye硬件模拟平台, 第一部分: SkyEye 介绍</font>
						</a>
						<br />
						<br />
				</li>
				<li>
						<a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.html">
								<font color="#996699">SkyEye硬件模拟平台，第二部分: 安装与使用</font>
						</a>
						<br />
						<br />
				</li>
				<li>在 <a href="http://www.ibm.com/developerworks/cn/linux/"><font color="#996699">developerWorks Linux 专区</font></a> 可以找到更多为 Linux 开发者准备的参考资料。 <br /></li>
		</ul>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>陈渝, 清华大学，通过 <a href="mailto:yuchen@tsinghua.edu.cn?cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a> 可以和他联系。 </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/fenixchen/aggbug/19642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenixchen/" target="_blank">陈长虹</a> 2007-03-12 16:36 <a href="http://www.cppblog.com/fenixchen/articles/19642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SkyEye硬件模拟平台，第二部分: 安装与使用</title><link>http://www.cppblog.com/fenixchen/articles/19640.html</link><dc:creator>陈长虹</dc:creator><author>陈长虹</author><pubDate>Mon, 12 Mar 2007 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/fenixchen/articles/19640.html</guid><wfw:comment>http://www.cppblog.com/fenixchen/comments/19640.html</wfw:comment><comments>http://www.cppblog.com/fenixchen/articles/19640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenixchen/comments/commentRss/19640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenixchen/services/trackbacks/19640.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1> </h1>
										<img class="display-img" height="6" alt="" src="http://www.ibm.com/i/c.gif" width="1" />
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/cn/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<table cellspacing="0" cellpadding="0" width="143" border="0">
																												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																												<form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp">
																														<input type="hidden" value="本文主要介绍SkyEye硬件模拟平台的安装与使用。对SkyEye的使用，可以调试和开发多种嵌入式操作系统和系统软件，有助于对操作系统、驱动程序如何与嵌入式硬件系统进行交互有更深刻的了解。" name="body" />
																														<input type="hidden" value="SkyEye硬件模拟平台，第二部分: 安装与使用" name="subject" />
																														<input type="hidden" value="cn" name="lang" />
																														<script language="JavaScript" type="text/javascript">
																																<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																														</script>
																														<tbody>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td width="16">
																																						<img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</tbody>
																												</form>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- 03/20/06 updated by gretchen -->
										<br />
										<table cellspacing="0" cellpadding="0" width="150" border="0">
												<tbody>
														<tr>
																<td class="v14-header-2-small">拓展 Tomcat 应用</td>
														</tr>
												</tbody>
										</table>
										<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td class="no-padding" width="150">
																		<table cellspacing="0" cellpadding="0" width="143" border="0">
																				<tbody>
																						<tr valign="top">
																								<td width="8">
																										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																								</td>
																								<td>
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/fw_bold.gif" width="16" vspace="3" border="0" />
																								</td>
																								<td width="125">
																										<p>
																												<a class="smallplainlink" href="http://www.ibm.com/developerworks/cn/kickstart/webserver.html?S_TACT=105AGX52&amp;S_CMP=simpleart">
																														<font color="#5c81a7" size="2">下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1</font>
																												</a>
																										</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>级别: 初级</p>
		<p>
				<a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.html#author">
						<font color="#996699">陈渝</font>
				</a> (<a href="mailto:yuchen@tsinghua.edu.cn?subject=安装与使用&amp;cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a>)清华大学<br /></p>
		<p>2004 年 9 月 01 日</p>
		<blockquote> </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="N10043">
						<span class="atitle">一． SkyEye配置选项</span>
				</a>
		</p>
		<p>SkyEye模拟的硬件配置和模拟执行行为由配置文件skyeye.conf中的选项确定。根据选项的功能，skyeye.conf的选项分为硬件配置选项和模拟执行选项。根据参数的个数，skyeye.conf的选项主要由两种组成：</p>
		<ul>
				<li>单参数选项行 <br />格式为： <br />symbol: value <br />symbol可以是硬件定义，如cpu、mach等，也可以是执行控制定义，如log等。 <br />value是symbol对应的值，可能是数字也可能是字符串。 
</li>
				<li>多参数选项行 <br />格式为： <br />symbol:opt1=value1,opt2=value2,...... <br />opt1是参数名，value1是opt1对应的值，可能是数字也可能是字符串。 </li>
		</ul>
		<p>目前skyeye.conf的配置定义如下：</p>
		<ul>
				<li>基本CPU核配置选项 <br />目前存在的选项有：arm710、arm7tdmi、arm720t、arm920t、sa1100、sa1110、xscale <br />格式为 <br />cpu: cpuname <br />注：cpuname表示一个代表cpu名字的字符串。 <br />例如： <br />cpu: arm7tdmi 
</li>
				<li>具体的开发板(包括CPU扩展)配置选项 <br />目前存在的选项有：at91、ep7312、adsbitsy，pxa_Lubbock、lpc、s3c4510b、s3c44b0、cs89712、sa1100、at91rm92、sharp_lh7a400 <br />格式为： <br />mach: machinename <br />注：cpuname表示一个代表基于特定CPU的开发板名字的字符串。 <br />例如： <br />mach: at91 
</li>
				<li>内存组配置选项 <br />一个内存组内的地址是连续的，类型分为RAM SPACE, ROM SPACE, mapped IO SPACE <br />格式为： <br />mem_bank: map=M|I, type=RW|R, addr=0xXXXXXXXX, size=0xXXXXXXXX,file=imagefilename,boot=yes|no <br /><ul><li>map=M 表示 RAM/ROM SPACE， map=I 表示 mapped IO SPACE。 
</li><li>type=RW ，且如果map=M则表示RAM SPACE, type=R，且如果map=M则表示ROM SPACE。 
</li><li>addr=0xXXXXXX 表示内存组的起始物理地址(32bit，16进制)。 
</li><li>size =0xXXXXXX 表示内存组的大小(32bit，16进制) 。 
</li><li>file =imagefilename <br />file的值imagefilename是一个字符串，实际上表示了一个文件，一般是一个可以执行的binary image格式的可执行程序或OS内核文件或是一个binary image格式的根文件系统。如果存在这个文件，SkyEye会把文件的内容直接写到对应的模拟内存组地址空间中。 
</li><li>boot=yes/no，如果boot=yes，则SkyEye会把模拟硬件启动后的第一条指令的地址定位到对应的内存组的起始地址。 </li></ul><p>例如： <br />mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000 <br />mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom <br />mem_bank: map=M, type=RW, addr=0x10000000, size=0x00000800, file=./loader.bin,boot=yes </p></li>
				<li>网络芯片8019AS的配置 <br />格式为 nic: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd <br />注：xx表示两位16进制数，dd表示两位10进制数 <br /><ul><li>state表示模拟开始后,网络芯片是否开始工作 
</li><li>mac表示模拟的nic的mac地址 
</li><li>ethmod表示skyeye所处主机上的网络模拟方式, 目前有tuptap和vnet两种模式。tuntap是linux kernel支持的一个点到点虚拟网络实现，vnet是skyeye实现的一个功能更多的一个基于虚拟HUB的网络。 
</li><li>hostip表示主机方与skyeye交互用的ip地址 </li></ul><p>例如： <br />net: state=on, mac=0:4:3:2:1:f, ethmod=tuntap, hostip=10.0.0.1 </p></li>
				<li>LCD的配置 <br />格式为 lcd: state=on/off <br />state=on表示LCD处于接通状态； state=off 表示LCD处于关闭状态。 <br />例如： <br />lcd: state=on 
</li>
				<li>skyeye的UART控制选项 <br />uart选项可以控制skyeye在另一个与某个串口连接的终端上输入/输出字符 <br />格式： <br />uart: fd_in=indevname, fd_out=outdevname 
<ul><li>fd_in=indevname indevname表示用于输入的设备文件名，其值为实际的串口设备文件/dev/ttySx 
</li><li>fd_out=outdevname outdevname表示用于输出的设备文件名，其值为实际的串口设备文件/dev/ttySx </li></ul>例如： <br />uart: fd_in=/dev/ttyS0, fd_out=/dev/ttyS0 <br /></li>
				<li>skyeye的log控制选项 <br />log选项用于控制skyeye输出硬件系统的执行状态信息，包括每次执行指令时的执行指令值、寄存器值、各种硬件状态等。 <br />格式： <br />log: logon=0|1, logfile=filename, start=number1, end=number2, length=number3 <br /><ul><li>logon=0|1|2|3，如果值等于0表示不进行记录，如果值等于1表示记录指令和指令地址流，如果值等于2表示记录指令和指令地址和主要寄存器内容，如果值等于3表示记录指令和指令地址和所有的寄存器内容。 
</li><li>logfile=filename 其值是一个字符串，表示用于记录信息的文件名 
</li><li>start=number1 其值是一个&gt;=0的十进制整数，表示系统执行到第number1条指令时开始进行记录 
</li><li>end =number2其值是一个&gt;=0的十进制整数，表示系统执行到第number2条指令时停止记录 
</li><li>length =number3其值是一个&gt;=0的十进制整数，表示只记录系统最近执行的number3条指令时的信息 </li></ul><p>格式： <br />log: logon=0, logfile=/tmp/sk1.log, start=100000, end=200000, length=100 </p><br /><br /><a name="N10112"><b>图 0 1 SkyEye硬件模拟逻辑结构图</b></a><br /><img height="422" alt="图 0 1 SkyEye硬件模拟逻辑结构图" src="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/images/image001.gif" width="440" border="0" /><br /><p>SkyEye目标模拟模块模拟的硬件逻辑结构图如图 0-1所示。</p></li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N10127">
						<span class="atitle">二. 安装使用SkyEye</span>
				</a>
		</p>
		<p>
				<a name="N1012D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1. SkyEye的安装</font>
								</strong>
						</span>
				</a>
		</p>
		<p>目前SkyEye在Linux操作系统下运行得很好， SkyEye通过MingW或cywgin软件也可以在Windows环境中运行。</p>
		<p>下面我们以在RedHat 9.0环境的SkyEye安装为例:</p>
		<p>首先需要从解开skyeye-x.x.x.src.tar.bz2软件包（x.x.x代表SkyEye的版本号）开始，按照软件包中的SkyEye.README或README文件中介绍的步骤进行（下面命令中的"#"是shell提示符，用户不用输入）：</p>
		<p>(1) 解压源码包（假定skyeye-x.x.x.src.tar.bz2放在本机的"/usr/src"目录下），会在当前目录生成一个skyeye的目录 <br /><code>#cd /usr/src</code><br /><code># tar xjvf skyeye-x.x.x.src.tar.bz2</code></p>
		<p>(2) 进入解压SkyEye目录，配置SkyEye <br />#cd skyeye <br />如果是SkyEye 0.6.0以前的版本，运行下面的命令进行配置： <br /><code># ./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest</code><br />如果你的SkyEye版本大于0.6.0，则带有LCD仿真支持。为了增加对LCD仿真的支持，则运行如下命令： <br /><code># ./configure --target=arm-elf --prefix=/usr/local</code></p>
		<p>(3) 然后是编译和安装（正确执行完下面的指令且命令正常结束后，系统中的/usr/local/bin/skyeye 执行程序就是安装好的SkyEye软件。）</p>
		<br />
		<code># make</code>
		<br />
		<code># make install</code>
		<br />
		<p>在编译安装过程中，须注意以下几点：</p>
		<ul>
				<li>如果你使用的是Mandrake Linux，那么有可能你在编译SkyEye时会出现有关readline, ncurse, termcap等库的一些错误，那么你需要运行下面的命令： <br /><code>ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h</code></li>
				<li>然后再重新编译 
</li>
				<li>如果你使用的是Debian Linux, 不要用gcc 2.95 或 gcc 3.0, 要使用gcc 3.2或更高版本。 
</li>
				<li>在你系统中所使用的gcc 版本号应该要大于或等于2.96 
</li>
				<li>如果SkyEye版本号大于0.6.0, 那么你需要在你的系统中安装GTK (LCD模拟要用到) 。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1018C">
						<span class="atitle">2. SkyEye的使用</span>
				</a>
		</p>
		<p>下面我们以SkyEye模拟基于Atmel AT91X40的开发板，并运行μClinux为例来讲解SkyEye的具体使用。</p>
		<p>
				<a name="N10195">
						<span class="smalltitle">
								<strong>
										<font face="Arial">第1步　安装交叉编译环境并配置μClinux</font>
								</strong>
						</span>
				</a>
		</p>
		<p>先安装交叉编译器。注意这里最好用root用户来执行如下操作。将arm-elf-tools-20011219.tar.gz（20011219是该工具的产生时间，也可以选择更新的arm-elf-tools。）在本机的根目录下用tar命令解开（假定arm-elf-tools-20011219.tar.gz放在本机的根目录"/"下）。具体命令（下面命令中的"#"是shell提示符，用户不用输入）如下：</p>
		<br />
		<code>#cd /</code>
		<br />
		<code># tar /zxvf arm-elf-tools-20011219.tar.gz</code>
		<br />
		<p>然后将uClinux-dist-20020927.tar.gz（假定该软件包放在本机的根目录下）解开，比如解开在/usr/src/uClinux-dist/下，需要执行如下命令：</p>
		<code># cd /usr/src</code>
		<br />
		<code># tar zxvf /uClinux-dist-20020927.tar.gz</code>
		<br />
		<p>然后在/usr/src/uClinux-dist/目录下执行如下命令：</p>
		<ul>
				<li>在图形方式下可用命令 <br /><code># make xconfig </code><br /></li>
				<li>在命令行方式下可用命令 <br /><code># make menuconfig</code><br /></li>
		</ul>
		<p>在这两种界面下，在vendor/product选项中选择GDB/ARMulator，kernel版本选择2.4.x，其它选项不变，然后保存配置退出，即选择save and exit选项。</p>
		<p>
				<a name="N101DA">
						<span class="smalltitle">
								<strong>
										<font face="Arial">第2步 编译生成μClinux和包含应用程序的文件系统</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<strong>方案A</strong>
		</p>
		<p>如果要生成带调试信息的linux kernel执行文件，在第一步执行完后，继续执行如下命令： <br /><code># make dep; make linux</code><br />这时在/usr/src/uClinux-dist/linux-2.4.x目录下生成具有ELF执行文件格式的linux内核文件。到这一步还没有生成文件系统，为了生成文件系统，还需要执行如下命令： <br /><code># make romfs; make image</code><br />如果在/usr/src/uClinux-dist/images/下存在文件 romfs.img，表示文件系统生成成功。 </p>
		<p>
				<b>方案B</b>
		</p>
		<p>如果想一步生成带调试信息的linux kernel执行文件和linux kenel 执行文件映像和磁盘映像文件romfs.img，可简单地运行命令： <br /><code># make dep; make</code><br />就行了。可查看/usr/src/uClinux-dist/images/下是否有文件 romfs.img等在/usr/src/uClinux-dist目录下，如果有，表示编译安装成功。 </p>
		<p>
				<a name="N1020A">
						<span class="smalltitle">
								<strong>
										<font face="Arial">第3步　用SkyEye运行和调试μClinux内核</font>
								</strong>
						</span>
				</a>
		</p>
		<p>假定SkyEye的工作目录位于/usr/src/uClinux-dist下，首先要进行一些准备工作：</p>
		<p>在工作目录下建立专门用于基于AT91X40开发板的SkyEye硬件配置文件skyeye.conf。一个简单的方法是从SkyEye软件包中的README文件中截取一块内容（以"FOR AT91 (1) special for uclinux"开始的一行，从它下面第三行开始截取，共取9行）作为skyeye.conf的内容，具体内容如下：</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这样我们可以通过如下命令看看在/usr/src/uClinux-dist目录下的skyeye.conf文件是否与上面的内容一致： <br /><code># more /usr/src/uClinux-dist/skyeye.conf</code><br />然后是建立文件系统的联接，需要在目录/usr/src/uClinux-dist目录下执行如下命令： <br /><code>#ln -s images/romfs.img boot.rom</code><br />这主要是与skyeye.conf中的内容保持一致，大家可注意skyeye.conf中的第5行。 <br />完成上述准备工作后，就可以用SkyEye来运行和调试μClinux内核了，我们可以尝试如下命令（"#"和"(SkyEye)"后面跟着的字符串是需要使用者输入的）： </p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode"># cd /usr/src/uClinux-dist
# /usr/local/bin/skyeye linux-2.4.x/linux
(SkyEye)target sim
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0 
mach info: name at91, mach_init addr 0x813ebc0
SKYEYE: use arm7100 mmu ops
Loaded ROM ./boot.rom
Connected to the simulator.
(SkyEye)load
Loading section .init, size 0xa000 vma 0x1000000
Loading section .text, size 0xc5cb0 vma 0x100a000
Loading section .data, size 0x8320 vma 0x10d0000
Start address 0x1000000
Transfer rate: 7077504 bits/sec.
(SkyEye)run
Starting program: /usr/src/uClinux-dist/linux-2.4.x/linux 
Linux version 2.4.19-uc1 (root@hpclab.cs.tsinghua.edu.cn) (gcc version 2.95.3 20010315 (release)
(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from 
http://www.snapgear.com/)) #1 Sun Sep 5 12:00:39 HKT 2004
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
……
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />你还可以在run之前给kernel设置断点来调试。 <br /><p>在使用SkyEye时要注意以下几点：</p><p>a .注意要在 memmap.conf（skyeye-0.2以前版本的配置文件）或skyeye.conf（skyeye-0.2以后版本的配置文件）和boot.rom所在目录下执行skyeye。</p><p>b. memmap.conf 和 skyeye.conf都是skyeye的硬件配置文件。memmap.conf 适用于skyeye0.2以下版本，而skyeye.conf 用于skyeye0.2以上版本。</p><p>c. 运行带网络选项的硬件配置时，注意用户必须为root用户，而且当前的可执行路径中可以搜索到ifconfig命令</p><p>d. 运行带网络选项的硬件配置时，需要编译安装内核模块tuo.o (在RedHat系统中，该模块在/lib/modules/2.4.x/kernel/drivers/net/tun.o)</p><p>e. 请阅读skyeye.conf.txt来获得skyeye.conf的配置选项的含义</p><p>f. 可参考skyeye-binary-testutils-x.x.x.tar.bz2软件包（x.x.x代表其的版本号）中已经设定好的skyeye.conf来配置特定的硬件模拟环境，并可尝试用SkyEye运行这个软件包中编译好的操作系统内核。</p><p>下面是一些skyeye.conf的例子：</p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td class="code-outline"><pre class="displaycode">FOR AT91 (0)  special for ucosii
-------------------------------------------
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
FOR AT91 (1) special for μClinux
-------------------------------------------
#skyeye config file sample
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R,  addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
#set nic info state=on/off  mac=xx:xx:xx:xx:xx:xx  ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:5:3:2:1:f, ethmod=tuntap, hostip=192.168.2.1
FOR ep7312 (1) special for linux
-------------------------------------------
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00200000
mem_bank: map=M, type=RW, addr=0xc0200000, size=0x00200000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0400000, size=0x00c00000
FOR StrongArm SA1100 (1) speciall for linux
-------------------------------------------
cpu: sa1100
mach: sa1100
mem_bank: map=I, type=RW, addr=0x80000000, size=0x40000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00800000
mem_bank: map=M, type=RW, addr=0xc0800000, size=0x00400000, file=./initrd.img
mem_bank: map=M, type=RW, addr=0xc0c00000, size=0x01400000
mem_bank: map=I, type=RW, addr=0xe0000000, size=0x08000000
#0xe0000000 128M cache flush memory bank 
</pre></td></tr></tbody></table><br /><br /><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br /><img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" /><br /><table cellspacing="0" cellpadding="0" border="0"><tbody><tr><td valign="center"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br /></td><td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part2/index.html#main"><b><font color="#996699">回页首</font></b></a></td></tr></tbody></table></td></tr></tbody></table><br /><br /><p><a name="N10251"><span class="atitle">三．小结</span></a></p><p>本文讲解了SkyEye硬件模拟平台的硬件配置选项，以及如何安装使用SkyEye。如果读者能够熟练掌握SkyEye的使用，则会提高开发、调试操作系统等的进度，特别是对操作系统、驱动程序如何与嵌入式硬件系统进行交互有更深刻的了解。</p><br /><br /><p><a name="resources"><span class="atitle">参考资料 </span></a></p><ul><li>本文节自 <a href="http://www.china-pub.com/computers/common/info.asp?id=21879"><font color="#996699">《源码开放的嵌入式系统软件分析与实践——基于SkyEye和ARM开发平台》</font></a>一书的第三章，对 SkyEye 开源项目感兴趣的可以阅读本书。 <br /><br /><br /></li><li><a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html"><font color="#996699">SkyEye硬件模拟平台, 第一部分: SkyEye 介绍</font></a><br /><br /></li><li>在 <a href="http://www.ibm.com/developerworks/cn/linux/"><font color="#996699">developerWorks Linux 专区</font></a> 可以找到更多为 Linux 开发者准备的参考资料。 <br /></li></ul><br /><br /><p><a name="author"><span class="atitle">关于作者</span></a></p><table cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td></tr><tr valign="top" align="left"><td><p></p></td><td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td><td width="100%"><p>陈渝, 清华大学，通过 <a href="mailto:yuchen@tsinghua.edu.cn?cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a> 可以和他联系。 </p></td></tr></tbody></table><img src ="http://www.cppblog.com/fenixchen/aggbug/19640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenixchen/" target="_blank">陈长虹</a> 2007-03-12 16:30 <a href="http://www.cppblog.com/fenixchen/articles/19640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SkyEye硬件模拟平台, 第一部分: SkyEye 介绍</title><link>http://www.cppblog.com/fenixchen/articles/19639.html</link><dc:creator>陈长虹</dc:creator><author>陈长虹</author><pubDate>Mon, 12 Mar 2007 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/fenixchen/articles/19639.html</guid><wfw:comment>http://www.cppblog.com/fenixchen/comments/19639.html</wfw:comment><comments>http://www.cppblog.com/fenixchen/articles/19639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenixchen/comments/commentRss/19639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenixchen/services/trackbacks/19639.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="100%">
										<h1> </h1>
								</td>
								<td class="no-print" width="192">
										<img height="18" alt="developerWorks" src="http://www.ibm.com/developerworks/cn/i/dw.gif" width="192" />
								</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr valign="top">
								<td width="10">
										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td width="100%">
										<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
												<tbody>
														<tr>
																<td width="10">
																		<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" />
																</td>
																<td>
																		<table cellspacing="0" cellpadding="0" width="150" border="0">
																				<tbody>
																						<tr>
																								<td class="v14-header-1-small">文档选项</td>
																						</tr>
																				</tbody>
																		</table>
																		<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
																				<tbody>
																						<tr>
																								<td class="no-padding" width="150">
																										<table cellspacing="0" cellpadding="0" width="143" border="0">
																												<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																												<form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp">
																														<input type="hidden" value="本文主要介绍了SkyEye硬件模拟平台起源，背景和发展状况。SkyEye是一个可以模拟嵌入式硬件开发板的系统软件。通过SkyEye的了解，有助于对嵌入式硬件系统有更深入的认识，特别是对操作系统、驱动程序如何与嵌入式硬件系统进行交互有更深刻的了解。" name="body" />
																														<input type="hidden" value="SkyEye硬件模拟平台, 第一部分: SkyEye 介绍" name="subject" />
																														<input type="hidden" value="cn" name="lang" />
																														<script language="JavaScript" type="text/javascript">
																																<!--
document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><b>将此页作为电子邮件发送</b></a></p></td></tr>');
//-->
																														</script>
																														<tbody>
																																<tr valign="top">
																																		<td width="8">
																																				<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																																		</td>
																																		<td width="16">
																																				<img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" />
																																		</td>
																																		<td width="122">
																																				<p>
																																						<a class="smallplainlink" href="javascript:document.email.submit();">
																																								<b>
																																										<font color="#5c81a7" size="2">将此页作为电子邮件发送</font>
																																								</b>
																																						</a>
																																				</p>
																																		</td>
																																</tr>
																																<noscript>
																																		<tr valign="top">
																																				<td width="8">
																																						<img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td width="16">
																																						<img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif" />
																																				</td>
																																				<td class="small" width="122">
																																						<p>
																																								<span class="ast">未显示需要 JavaScript 的文档选项</span>
																																						</p>
																																				</td>
																																		</tr>
																																</noscript>
																														</tbody>
																												</form>
																										</table>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
										<!-- 03/20/06 updated by gretchen -->
										<br />
										<table cellspacing="0" cellpadding="0" width="150" border="0">
												<tbody>
														<tr>
																<td class="v14-header-2-small">拓展 Tomcat 应用</td>
														</tr>
												</tbody>
										</table>
										<table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td class="no-padding" width="150">
																		<table cellspacing="0" cellpadding="0" width="143" border="0">
																				<tbody>
																						<tr valign="top">
																								<td width="8">
																										<img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" />
																								</td>
																								<td>
																										<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/fw_bold.gif" width="16" vspace="3" border="0" />
																								</td>
																								<td width="125">
																										<p>
																												<a class="smallplainlink" href="http://www.ibm.com/developerworks/cn/kickstart/webserver.html?S_TACT=105AGX52&amp;S_CMP=simpleart">
																														<font color="#5c81a7" size="2">下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1</font>
																												</a>
																										</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<p>级别: 初级</p>
		<p>
				<a href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html#author">
						<font color="#996699">陈渝</font>
				</a> (<a href="mailto:yuchen@tsinghua.edu.cn?subject=SkyEye 介绍&amp;cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a>)清华大学<br /></p>
		<p>2004 年 9 月 01 日</p>
		<blockquote> </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="N10043">
						<span class="atitle">一．SkyEye介绍</span>
				</a>
		</p>
		<p>
				<a name="N10049">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1．SkyEye的起源和发展</font>
								</strong>
						</span>
				</a>
		</p>
		<p>2002年11月，一个偶然的机会，一群操作系统的爱好者在网上进行聊天，成立了一个TM－Linux兴趣小组，希望要做一些感兴趣的事情。当时在清华大学计算机系做博士后的陈渝提出做一个用软件实现的嵌入式开发板硬件模拟器，可以在模拟器上运行各种操作系统，这样就可以在没有开发板的情况下学习和研究操作系统。一开始就陈渝一人做，首先他了解了当前国际上的一些类似的项目，发现著名的μCLinux组织实现了一个armulator模拟器软件（在Linux系统上运行），可以模拟Ateml AT91（基于ARM7TDMI CPU）开发板，μCLinux可以在armulator（其网址为http://www.uclinux.org/pub/uCLinux/utilities/armulator/）上运行。于是陈渝以此为基点，借鉴armulator的实现，提出了SkyEye项目，其目标是让SkyEye仿真多种主流的嵌入式开发板和外设，实现一个可扩展的硬件模拟框架，让更多的嵌入式操作系统可以在SkyEye上运行。SkyEye项目于2002年12月1日正式建立后，陈渝完成的第一件工作是把armulator移植到了cygwin/windows环境下，其成果被μCLinux组织接收。接下来清华大学计算机系硕士生李明加入到SkyEye的开发中，8天后，SkyEye的第一个版本推出，再过了4天，μC/OS-II for SkyEye推出。在这期间，SkyEye的网站也建立起来了。紧接着，杨晔、王利明、尹首一等在校学生也加入到SkyEye的开发中，给SkyEye带来了新的活力，SkyEye进入了新的发展阶段，目前通过访问SkyEye的网站（http://www.skyeye.org/）和在linux公社上的SkyEye论坛（ <a href="http://www.linuxfans.org/" target="_blank"><font color="#996699">http://www.linuxfans.org</font></a>）可以了解到SkyEye的最新进展并对有关嵌入式系统开发方面的问题进行交流，还可以到 <a href="http://gro.clinux.org/projects/skyeye/" target="_blank"><font color="#996699">http://gro.clinux.org/projects/skyeye/</font></a> 下载最新的SkyEye相关软件和文档。 </p>
		<p>
				<a name="N1005C">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2．SkyEye的背景</font>
								</strong>
						</span>
				</a>
		</p>
		<p>如果你看过电影"黑客帝国"（又称"matrix"），相信电影描述的虚幻世界会深深地吸引你，至少它是我们看过最有想象力的科幻电影之一。也许我们可以把SkyEye看作一个"matrix "，把运行在SkyEye上的各种程序看成是这个"matrix"中的芸芸众生。我们创造SkyEye和编写运行在SkyEye上运行的程序就是为了洞悉计算机的奥秘，尝尝当"造物主"的感觉。当看到各种软件Linux、μCLinux、μC/OS-II...在SkyEye上"愉快"地运行时，那种感觉真是太奇妙了。 </p>
		<p>对于那些想进行嵌入式系统软件开发和学习，或者想研究嵌入式Linux等操作系统和一些底层系统软件（如TCP/IP等）的研究和开发人员来说，可能存在如下几方面的问题：（1）经常苦于经费不足，缺少足够的硬件开发板和完善的软件开发环境，相关的书籍对一些最新软件的分析还不够全面，无法深入研究和开发嵌入式软件。（2）高层次的软件设计和开发一般不用太考虑底层硬件的实现细节，如果直接处于一个具体的硬件环境下，在开发和研究中可能会陷入硬件的具体细节中不能自拔，而不能把精力放到高层次的软件设计和开发上。（3）如果硬件开发环境不太稳定（这种情况经常见到），且对具体的硬件不是很了解，则可能在排除问题上花费大量的不必要的时间。（4）如果你想自己尝试设计一个操作系统，则先在一个提供源码级调试的软件仿真器上进行开发，可能会大大提高你的开发进度。</p>
		<p>对于想了解、学习一般操作系统的实现原理，Linux/μCLinux操作系统或TCP/IP等系统级软件的实现的人员，目前一般采用的方法是看书和读源代码，这是一种静态的学习方法，效率较低，比较枯燥，缺少亲自实践的感觉。要想深入分析和开发软件，就要动手编程，不能只是看看书，读读代码，只有通过亲手实践才能够掌握软件设计的核心内容。上面所指出的问题和需求促使SkyEye项目的诞生。 </p>
		<p>
				<a name="N1006B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3．SkyEye的目标和意义 </font>
								</strong>
						</span>
				</a>
		</p>
		<p>SkyEye是一个开源软件（OpenSource Software）项目，中文名字是"天目"。SkyEye的目标是在通用的Linux和Windows平台上实现一个纯软件集成开发环境，模拟常见的嵌入式计算机系统(这里假定"仿真"和"模拟"的意思基本相同)；可在SkyEye上运行μCLinux以及μC/OS-II等多种嵌入式操作系统和各种系统软件（如TCP/IP，图形子系统，文件子系统等），并可对它们进行源码级的分析和测试。</p>
		<p>纯软件的模拟器有许多种，如模拟一个芯片时序逻辑的模拟器、只模拟CPU指令的模拟器、模拟整个硬件开发板的模拟器、模拟一个PDA的模拟器等。存在一些纯软件的仿真器或模拟器，如Stanford大学的SimOS模拟器，它仿真的是MIPS系列CPU和相关外设，可以在其上运行SGI公司的Irix操作系统和软件，目前基本上停止了进一步的开发；PSIM是一个仿真PowerPC指令集的模拟器，目前只支持简单的命令行应用程序；xcopilot是一个PDA模拟器，它是由Greg Hewgill出于个人喜好编写的，它仿真的是M68K CPU，通过它可以给基于PalmOS的软件开发者提供一个模拟开发环境。Bochs是一个仿真x86 CPU的开源项目，目前还支持AMD64 CPU，在它上面可以运行Linux操作系统。其它一些商业的仿真软件如vmware和virtualPC可以仿真一个真实的x86计算机，而Virtutech Simics仿真器可以仿真多种CPU和硬件，功能强大，可用于硬件和系统软件的评测。</p>
		<p>SkyEye是一个指令级模拟器，可以模拟多种嵌入式开发板，可支持多种CPU指令集，在SkyEye上运行的操作系统意识不到它是在一个虚拟的环境中运行，而且开发人员可以通过SkyEye调试操作系统和系统软件。由于SkyEye的目标不是验证硬件逻辑，而是协助开发、调试和学习系统软件，所以在实现上SkyEye与真实的硬件环境相比还是有一定差别的。SkyEye在时钟节拍的时序上不保证与硬件完全相同，对软件透明的一些硬件仿真进行了一定的简化。这样带来的好处是SkyEye的执行效率更高。SkyEye的推出具有下面三方面的意义：</p>
		<ul>
				<li>通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境和软件开发环境的用户来说，它将是一个非常有效的学习工具和开发手段，因为SkyEye的整个软件系统都是Open Source的，且基于GPL协议（μCOS-II除外）。因此，如果要学习Linux操作系统或者进行嵌入式系统开发，但苦于没有硬件支持，SkyEye仿真环境软件是一个很好的选择！ 
</li>
				<li>如果想研究与具体硬件无关的系统软件（如TCP/IP协议栈等），采用SkyEye可以有效地提高工作效率，因为你可以直接在μCOS-II和μCLinux for SkyEye上进行开发和调试，而与具体硬件打交道的各种driver已经存在，且有源码级调试环境，只需关心高层的逻辑设计和实现就可以了。 
</li>
				<li>SkyEye本身作为一个开放式的项目体系，可以划分为多个独立的子项目系统。通过参与SkyEye的各个子项目，与大家共同交流、协作，可以进一步学习、分析、精通Linux内核，掌握ARM嵌入式CPU编程。 </li>
		</ul>
		<p>在32位嵌入式CPU领域中，ARM系列CPU所占比重很大，而ARM7TDMI是其中最广泛的一种ARM CPU核，因此SkyEye首先选择了ARM7TDMI作为仿真的目标CPU核，当然将来SkyEye会支持更多种类的CPU。目前在SkyEye上可运行并进行源码级调试ARM Linux、μCLinux、μC/OS-II操作系统和LwIP（一个著名的嵌入式TCP/IP实现）、MiniGUI（一个著名的嵌入式GUI系统）等系统软件。SkyEye可用于学习，分析，开发这些系统软件的实现，了解ARM嵌入式CPU编程。而这一切都可在一个纯软件的环境中完成。通过分析SkyEye本身实现，系统软件开发人员对ARM，8019as（NE2000兼容）以太网络芯片等硬件的了解也会更深入。</p>
		<p>SkyEye并不能取代开发板等硬件的功能，但通过它可以比较容易进入到嵌入式软件的广阔天地中。由于SkyEye建立在GDB基础之上，使用者可以方便地使用GDB提供的各种调试手段对SkyEye仿真系统上的软件进行源码级的调试，还可以进行各种分析，如执行热点分析、程序执行覆盖度分析等。由于SkyEye提供了源代码和相关文档，有经验的用户完全可以修改和扩充SkyEye来满足自己的需求。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1008C">
						<span class="atitle">二．SkyEye模拟硬件介绍 </span>
				</a>
		</p>
		<p>目前SkyEye模拟了大量的硬件，包括CPU内核、存储器、存储器管理单元、缓存单元、串口、网络芯片、时钟等。下面做一简单介绍。</p>
		<p>
				<a name="N10095">
						<span class="smalltitle">
								<strong>
										<font face="Arial">1．CPU和开发板系列</font>
								</strong>
						</span>
				</a>
		</p>
		<p>目前SkyEye可以模拟的CPU主要是基于ARM内核的CPU，包括ARM7TDMI，ARM720T，ARM9TDMI，ARM9xx，ARM10xx，StrongARM，XScale等。ARM7/9/10TDMI是ARM系列CPU的基本核心部分，它们不支持MMU/CACHE和一些扩展指令，是ARM CPU基本核。ARM720T、ARM920T、ARM10xx、StrongARM、Xscale是建立在以上ARM CPU核上，并扩展了MMU/CACHE和其它功能。各硬件开发公司可以根据它们的需求在上述CPU核上加上特定的扩展，形成基于各种ARM基本核心的特定CPU，如Atmel91X40和 ep7312，分别扩展了ARM7TDMI和ARM720T的内存控制和各种I/O控制器，简化了开发板的逻辑设计，大大增强了开发板的功能。</p>
		<p>目前SkyEye模拟的开发板包括基于Atmel 91X40/AT91RM92 CPU的开发板，基于Crirus Logic ep7312的开发板、基于StrongARM CPU的ADSBITSY开发板，基于XScale PXA250 CPU的LUBBOCK开发板、基于SAMSUNG S3C4510B/S3C44B0 CPU的开发板、基于SHARP LH7A400 CPU的开发板、基于Philip LPC22xx CPU的开发板等。主要模拟了对应各个开发板的串口、时钟、RAM、ROM、LCD、网络芯片等硬件外设。</p>
		<p>
				<a name="N100A1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2．存储器管理单元和缓存单元</font>
								</strong>
						</span>
				</a>
		</p>
		<p>MMU（Memory Management Unit）即存储器管理单元，是用来管理虚拟内存系统的硬件。MMU的两个主要功能是：将虚地址转换成物理地址；控制存储器的存取权限。MMU关掉时，虚地址直接输出到物理地址总线。MMU本身有少量存储空间存放从虚拟地址到物理地址的匹配表，此表称作TLB(Translation Lookaside Buffers)。TLB表中保存的是虚址及其对应的物理地址，权限，域和映射类型。当CPU对一虚拟地址进行存取时，首先搜索TLB表以查找对应的物理地址等信息，如果没有查到，则进行查找translation table，称为Translation Table Walk（简称TTW）。经过TTW过程后，将查到的信息保存到TLB。然后根据TLB表项的物理地址进行读写。CACHE是缓存单元，主要用于缓存内存中的数据，其读写速度远快于内存的读写速度，所以可以提高CPU的内存数据的访问效率。</p>
		<p>write/read buffer硬件单元的作用与CACHE的作用类似。MMU、CACHE、write/read buffer一般是高性能CPU的重要组成部分，且不同类型CPU的MMU、CACHE、write/read buffer的逻辑行为也有一定的差异。为了支持模拟多种类型CPU的MMU/CACHE，SkyEye包含了一个通用的MMU/CACHE模拟实现。通过对一些参数的调整可以支持模拟多种类型的MMU/CACHE物理结构和逻辑行为。 </p>
		<p>
				<a name="N100AD">
						<span class="smalltitle">
								<strong>
										<font face="Arial">3．网络芯片</font>
								</strong>
						</span>
				</a>
		</p>
		<p>目前SkyEye模拟了网络芯片8019AS，其特点是：NE2000兼容，内建 16KRAM缓冲区，10MB传输速率。虽然目前模拟的开发板上不一定有网络芯片8019AS，但我们可以在我们模拟的开发板上加上网络芯片8019AS的模拟。这样再加上在不同操作系统上的8019AS驱动程序，就可以方便地完成各种网络应用的开发和设计。目前已经在在基于Atmel91X40 CPU的开发板上实现了网络芯片8019AS扩展，并增加了μC/OS-II和μClinux的网络驱动程序，已经支持大量的网络应用程序，如LwIP （一个TCP/IP协议栈实现）、nfs server/clinet、http server/client、telnet server/client、ftp server/client等。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100B6">
						<span class="atitle">三．SkyEye的设计实现</span>
				</a>
		</p>
		<p>1．SkyEye设计原则</p>
		<p>SkyEye软件的核心在目标模拟模块。为了提高模拟效率，且能够模拟更多的CPU、开发板和各种外设，方便开发人员进行开发和学习，SkyEye遵循如下的设计原则：</p>
		<ul>
				<li>用C语言编程，采用面向对象的方式定义各种要模拟的硬件； 
</li>
				<li>定义抽象模拟硬件对象，最大化重用代码； 
</li>
				<li>定义硬件配置脚本，使得不用改动SkyEye代码就可以灵活地调整各种硬件配置； </li>
		</ul>
		<p>保持与GDB上层接口的一致性，这样可充分利用GDB强大的源代码级调试功能。</p>
		<p>
				<a name="N100D1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">2．SkyEye的总体结构</font>
								</strong>
						</span>
				</a>
		</p>
		<p>SkyEye基于GDB/ARMulator(目前由David McCullough 维护)，并进行了全面的改变和扩展。SkyEye建立在GNU GDB的底层，可以模仿多种完整的嵌入式计算机系统，目前模拟的硬件包括CPU、内存、I/O寄存器、时钟、UART、网络芯片、MMU、CACHE，将来还会模拟 LCD、USB等各种硬件。在SkyEye上运行的操作系统和各种系统软件"意识"不到它们是在一个虚拟的计算机系统上运行。 </p>
		<p>SkyEye从总体上分为四个层次：</p>
		<ul>
				<li>用户接口模块：包括命令行用户界面和图形用户界面，完成处理用户的输入命令，并把相关调试数据输出给用户的任务。这一部分基本上直接利用了GDB的用户接口模块，并在此基础上有一定的扩充。 
</li>
				<li>符号处理模块：主要处理执行文件的头信息，解释执行文件中内嵌的debuger调试信息，对符号表的管理，对源代码表达式的解析，定位源代码中的语句位置和机器码的位置关系等。这一部分也是直接利用了GDB的符号处理模块，也正是有了这个模块的支持，SkyEye可以支持源码级调试。 
</li>
				<li>目标控制模块：主要完成执行控制（如中断程序的执行，设置中断条件等），程序栈结构分析，对具体目标硬件的控制（如本地调试、远程调试和模拟调试的控制）。这一部分完成对SkyEye上运行的软件的控制，提供了多种调试手段。 
</li>
				<li>目标模拟模块：这一部分是SkyEye的核心。它的功能是模仿计算机系统中的主要硬件（包括CPU、内存和各种硬件外设等）的执行，对执行文件的机器指令进行解释，并模拟执行每一条机器指令，产生相应的硬件响应等。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.html#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100EC">
						<span class="atitle">四．小结</span>
				</a>
		</p>
		<p>本文主要介绍了SkyEye硬件模拟平台的起源、背景和发展状况。如果读者能够熟练掌握SkyEye的使用，则会提高开发、调试操作系统等的进度，特别是对操作系统、驱动程序如何与嵌入式硬件系统进行交互有更深刻的了解。SkyEye还在不断地发展之中，对SkyEye感兴趣的读者需要跟踪最新的SkyEye源码和相关文档，并可在SkyEye论坛上与SkyEye开发人员进行实时交流。</p>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>本文节自 <a href="http://www.china-pub.com/computers/common/info.asp?id=21879"><font color="#996699">《源码开放的嵌入式系统软件分析与实践——基于SkyEye和ARM开发平台》</font></a>一书的第三章，对 SkyEye 开源项目感兴趣的可以阅读本书。 <br /><br /><br /></li>
				<li>在 <a href="http://www.ibm.com/developerworks/cn/linux/"><font color="#996699">developerWorks Linux 专区</font></a> 可以找到更多为 Linux 开发者准备的参考资料。 <br /></li>
		</ul>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">关于作者</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>陈渝, 清华大学，通过 <a href="mailto:yuchen@tsinghua.edu.cn?cc=d"><font color="#5c81a7">yuchen@tsinghua.edu.cn</font></a> 可以和他联系。 </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/fenixchen/aggbug/19639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenixchen/" target="_blank">陈长虹</a> 2007-03-12 16:28 <a href="http://www.cppblog.com/fenixchen/articles/19639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式设备上的 Linux 系统开发(ZZ)</title><link>http://www.cppblog.com/fenixchen/articles/19635.html</link><dc:creator>陈长虹</dc:creator><author>陈长虹</author><pubDate>Mon, 12 Mar 2007 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/fenixchen/articles/19635.html</guid><wfw:comment>http://www.cppblog.com/fenixchen/comments/19635.html</wfw:comment><comments>http://www.cppblog.com/fenixchen/articles/19635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenixchen/comments/commentRss/19635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenixchen/services/trackbacks/19635.html</trackback:ping><description><![CDATA[
		<p>级别: 初级</p>
		<p>
				<a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#author">
						<font color="#996699">Anand K Santhanam</font>
				</a>(<a href="mailto:asanthan@in.ibm.com?subject=嵌入式设备上的 Linux 系统开发&amp;cc=asanthan@in.ibm.com"><font color="#5c81a7">asanthan@in.ibm.com</font></a>), 软件工程师, IBM Global Services<br /><a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#author"><font color="#996699">Vishal Kulkarni</font></a> (<a href="mailto:kvishal@in.ibm.com?subject=嵌入式设备上的 Linux 系统开发&amp;cc=kvishal@in.ibm.com"><font color="#5c81a7">kvishal@in.ibm.com</font></a>), 软件工程师, IBM Global Services<br /></p>
		<p>2002 年 3 月 01 日</p>
		<blockquote>如果您刚接触嵌入式开发，那么大量可用的引导装载程序（bootloader）、规模缩小的分发版（distribution）、文件系统和 GUI 看起来可能太多了。但是这些丰富的选项实际上是一种恩赐，允许您调整开发或用户环境以完全符合您的需要。对 Linux 嵌入式开发的概述将帮助您理解所有这些选项。</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>Linux 正在嵌入式开发领域稳步发展。因为 Linux 使用 GPL（请参阅本文后面的 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>），所以任何对将 Linux 定制于 PDA、掌上机或者可佩带设备感兴趣的人都可以从因特网免费下载其内核和应用程序，并开始移植或开发。许多 Linux 改良品种迎合了嵌入式／实时市场。它们包括 RTLinux（实时 Linux）、uclinux（用于非 MMU 设备的 Linux）、Montavista Linux（用于 ARM、MIPS、PPC 的 Linux 分发版）、ARM-Linux（ARM 上的 Linux）和其它 Linux 系统（请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>以链接到本文中提到的这些和其它术语及产品。） </p>
		<p>嵌入式 Linux 开发大致涉及三个层次：引导装载程序、Linux 内核和图形用户界面（或称 GUI）。在本文中，我们将集中讨论涉及这三层的一些基本概念；深入了解引导装载程序、内核和文件系统是如何交互的；并将研究可用于文件系统、GUI 和引导装载程序的众多选项中的一部分。</p>
		<p>
				<a name="1">
						<span class="atitle">引导装载程序</span>
				</a>
		</p>
		<p>引导装载程序通常是在任何硬件上执行的第一段代码。在象台式机这样的常规系统中，通常将引导装载程序装入主引导记录（Master Boot Record，(MBR)）中，或者装入 Linux 驻留的磁盘的第一个扇区中。通常，在台式机或其它系统上，BIOS 将控制移交给引导装载程序。这就提出了一个有趣的问题：谁将引导装载程序装入（在大多数情况中）没有 BIOS 的嵌入式设备上呢？</p>
		<p>解决这个问题有两种常规技术：专用软件和微小的引导代码（tiny bootcode）。</p>
		<p>
				<b>专用软件</b>可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。 <i>闪存设备</i>是与存储设备功能类似的特殊芯片，而且它们能持久存储信息 ― 即，在重新引导时不会擦除其内容。 </p>
		<p>这个软件使用目标（在嵌入式开发中，嵌入式设备通常被称为 <i>目标</i>）上的 JTAG 端口，它是用于执行外部输入（通常来自主机机器）的指令的接口。JFlash-linux 是一种用于直接写闪存的流行工具。它支持为数众多的闪存芯片；它在主机机器（通常是 i386 机器 ― 本文中我们把一台 i386 机器称为 <i>主机</i>）上执行并通过 JTAG 接口使用并行端口访问目标的闪存芯片。当然，这意味着目标需要有一个并行接口使它能与主机通信。Jflash-linux 在 Linux 和 Windows 版本中都可使用，可以在命令行中用以下命令启动它： <br /></p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">Jflash-linux &lt;bootloader&gt;</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>某些种类的嵌入式设备具有 <b>微小的引导代码</b>― 根据几个字节的指令 ― 它将初始化一些 DRAM 设置并启用目标上的一个串行（或者 USB，或者以太网）端口与主机程序通信。然后，主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上，并将它写入闪存。 </p>
		<p>在安装它并给予其控制后，这个引导装载程序执行下列各类功能：</p>
		<ul>
				<li>初始化 CPU 速度 
</li>
				<li>初始化内存，包括启用内存库、初始化内存配置寄存器等 
</li>
				<li>初始化串行端口（如果在目标上有的话） 
</li>
				<li>启用指令／数据高速缓存 
</li>
				<li>设置堆栈指针 
</li>
				<li>设置参数区域并构造参数结构和标记（这是重要的一步，因为内核在标识根设备、页面大小、内存大小以及更多内容时要使用引导参数） 
</li>
				<li>执行 POST（加电自检）来标识存在的设备并报告任何问题 
</li>
				<li>为电源管理提供挂起／恢复支持 
</li>
				<li>跳转到内核的开始 </li>
		</ul>
		<p>带有引导装载程序、参数结构、内核和文件系统的系统典型内存布局可能如下所示：</p>
		<br />
		<br />
		<a name="code1">
				<b>清单 1. 典型内存布局</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">   /* Top Of Memory */ 
        Bootloader
        Parameter Area 
        Kernel 
        Filesystem
    /* End Of Memory */ 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>嵌入式设备上一些流行的并可免费使用的 Linux 引导装载程序有 Blob、Redboot 和 Bootldr（请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>获得链接）。所有这些引导装载程序都用于基于 ARM 设备上的 Linux，并需要 Jflash-linux 工具用于安装。 </p>
		<p>一旦将引导装载程序安装到目标的闪存中，它就会执行我们上面提到的所有初始化工作。然后，它准备接收来自主机的内核和文件系统。一旦装入了内核，引导装载程序就将控制转给内核。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="2">
						<span class="atitle">设置工具链</span>
				</a>
		</p>
		<p>设置工具链在主机机器上创建一个用于编译将在目标上运行的内核和应用程序的构建环境 ― 这是因为目标硬件可能没有与主机兼容的二进制执行级别。</p>
		<p>工具链由一套用于编译、汇编和链接内核及应用程序的组件组成。 这些组件包括：</p>
		<ul>
				<li>
						<b>Binutils</b> ― 用于操作二进制文件的实用程序集合。它们包括诸如 <code>ar</code> 、 <code>as</code> 、 <code>objdump</code> 、 <code>objcopy</code> 这样的实用程序。 
</li>
				<li>
						<b>Gcc</b>― GNU C 编译器。 
</li>
				<li>
						<b>Glibc</b>― 所有用户应用程序都将链接到的 C 库。避免使用任何 C 库函数的内核和其它应用程序可以在没有该库的情况下进行编译。 </li>
		</ul>
		<p>构建工具链建立了一个交叉编译器环境。 <i>本地编译器</i>编译与本机同类的处理器的指令。 <i>交叉编译器</i>运行在某一种处理器上，却可以编译另一种处理器的指令。重头设置交叉编译器工具链可不是一项简单的任务：它包括下载源代码、修补补丁、配置、编译、设置头文件、安装以及很多很多的操作。另外，这样一个彻底的构建过程对内存和硬盘的需求是巨大的。如果没有足够的内存和硬盘空间，那么在构建阶段由于相关性、配置或头文件设置等问题会突然冒出许多问题。 </p>
		<p>因此能够从因特网上获得已预编译的二进制文件是一件好事（但不太好的一点是，目前它们大多数只限于基于 ARM 的系统，但迟早会改变的）。一些比较流行的已预编译的工具链包括那些来自 Compaq（Familiar Linux ）、LART（LART Linux）和 Embedian（基于 Debian 但与它无关）的工具链 ― 所有这些工具链都用于基于 ARM 的平台。</p>
		<p>
				<a name="N100FB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">内核设置</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Linux 社区正积极地为新硬件添加功能部件和支持、在内核中修正错误并且及时地进行常规改进。这导致大约每 6 个月（或 6 个月不到）就有一个稳定的 Linux 树的新发行版。不同的维护者维护针对特定体系结构的不同内核树和补丁。当为一个项目选择了一个内核时，您需要评估最新发行版的稳定性如何、它是否符合项目要求和硬件平台、从编程角度来看它的舒适程度以及其它难以确定的方面。还有一点也非常重要：找到需要应用于基本内核的所有补丁，以便为特定的体系结构调整内核。</p>
		<p>
				<a name="N10104">
						<span class="smalltitle">
								<strong>
										<font face="Arial">内核布局</font>
								</strong>
						</span>
				</a>
		</p>
		<p>内核布局分为特定于体系结构的部分和与体系结构无关的部分。内核中特定于体系结构的部分首先执行，设置硬件寄存器、配置内存映射、执行特定于体系结构的初始化，然后将控制转给内核中与体系结构无关的部分。系统的其余部分在这第二个阶段期间进行初始化。内核树下的目录 arch/ 由不同的子目录组成，每个子目录用于一个不同的体系结构（MIPS、ARM、i386、SPARC、PPC 等）。每一个这样的子目录都包含 kernel/ 和 mm/ 子目录，它们包含特定于体系结构的代码来完成象初始化内存、设置 IRQ、启用高速缓存、设置内核页面表等操作。一旦装入内核并给予其控制，就首先调用这些函数，然后初始化系统的其余部分。</p>
		<p>根据可用的系统资源和引导装载程序的功能，内核可以编译成 vmlinux、Image 或 zImage。vmlinux 和 zImage 之间的主要区别在于 <i>vmlinux</i>是实际的（未压缩的）可执行文件，而 <i>zImage</i>是或多或少包含相同信息的自解压压缩文件 ― 只是压缩它以处理（通常是 Intel 强制的）640 KB 引导时间的限制。有关所有这些的权威性解释，请参阅 <i>Linux Magazine</i>的文章“Kernel Configuration: dealing with the unexpected”（请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>）。 </p>
		<p>
				<a name="N1011D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">内核链接和装入</font>
								</strong>
						</span>
				</a>
		</p>
		<p>一旦为目标系统编译了内核后，通过使用引导装载程序（它已经被装入到目标的闪存中），内核就被装入到目标系统的内存（在 DRAM 中或者在闪存中）。通过使用串行、USB 或以太网端口，引导装载程序与主机通信以将内核传送到目标的闪存或 DRAM 中。在将内核完全装入目标后，引导装载程序将控制传递给装入内核的地址。</p>
		<p>内核可执行文件由许多链接在一起的对象文件组成。对象文件有许多节，如文本、数据、init 数据、bass 等等。这些对象文件都是由一个称为 <i>链接器脚本</i>的文件链接并装入的。这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中；换句话说，它将所有输入对象文件都链接到单一的可执行文件中，将该可执行文件的各节装入到指定地址处。 <i>vmlinux.lds</i>是存在于 arch/&lt;target&gt;/ 目录中的内核链接器脚本，它负责链接内核的各个节并将它们装入内存中特定偏移量处。典型的 vmlinux.lds 看起来象这样： </p>
		<br />
		<br />
		<a name="code2">
				<b>清单 2. 典型的 vmlinux.lds 文件</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">OUTPUT_ARCH(&lt;arch&gt;)      /* &lt;arch&gt; includes architecture type */ 
 ENTRY(stext)               /* stext is the kernel entry point */ 
 SECTIONS                   /* SECTIONS command describes the layout
                   of the output file */ 
 { 
     .  = TEXTADDR;         /* TEXTADDR is LMA for the kernel */ 
     .init : {          /* Init code and data*/ 
              _stext = .;       /* First section is stext followed 
                   by __init data section */ 
              __init_begin = .; 
                     *(.text.init) 
              __init_end = .; 
             } 
     .text : {          /* Real text segment follows __init_data section */ 
              _text = .; 
                     *(.text) 
              _etext = .;       /* End of text section*/ 
             } 
     .data :{ 
              _data=.;          /* Data section comes after text section */ 
                     *(.data) 
              _edata=.;  
             }                  /* Data section ends here */ 
     .bss : {                   /* BSS section follows symbol table section */ 
              __bss_start = .; 
                     *(.bss) 
              _end = . ;        /* BSS section ends here */  
             } 
  } 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>LMA</code> 是装入模块地址；它表示将要装入内核的目标虚拟内存中的地址。 <code>TEXTADDR</code> 是内核的虚拟起始地址，并且在 arch/&lt;target&gt;/ 下的 Makefile 中指定它的值。这个地址必须与引导装载程序使用的地址相匹配。 </p>
		<p>一旦引导装载程序将内核复制到闪存或 DRAM 中，内核就被重新定位到 <code>TEXTADDR</code> — 它通常在 DRAM 中。然后，引导装载程序将控制转给这个地址，以便内核能开始执行。 </p>
		<p>
				<a name="N1014B">
						<span class="smalltitle">
								<strong>
										<font face="Arial">参数传递和内核引导</font>
								</strong>
						</span>
				</a>
		</p>
		<p>
				<code>stext</code> 是内核入口点，这意味着在内核引导时将首先执行这一节下的代码。它通常用汇编语言编写，并且通常它在 arch/&lt;target&gt;/ 内核目录下。这个代码设置内核页面目录、创建身份内核映射、标识体系结构和处理器以及执行分支 <code>start_kernel</code> （初始化系统的主例程）。 </p>
		<p>
				<code>start_kernel</code> 调用 <code>setup_arch</code> 作为执行的第一步，在其中完成特定于体系结构的设置。这包括初始化硬件寄存器、标识根设备和系统中可用的 DRAM 和闪存的数量、指定系统中可用页面的数目、文件系统大小等等。所有这些信息都以参数形式从引导装载程序传递到内核。 </p>
		<p>将参数从引导装载程序传递到内核有两种方法：parameter_structure 和标记列表。在这两种方法中，不赞成使用参数结构，因为它强加了限制：指定在内存中，每个参数必须位于 <code>param_struct</code> 中的特定偏移量处。最新的内核期望参数作为标记列表的格式来传递，并将参数转化为已标记格式。 <code>param_struct</code> 定义在 include/asm/setup.h 中。它的一些重要字段是： </p>
		<br />
		<br />
		<a name="code3">
				<b>清单 3. 样本参数结构</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">struct param_struct  { 
  unsigned long page_size;     /* 0:  Size of the page  */ 
  unsigned long nr_pages;      /* 4:  Number of pages in the system */ 
  unsigned long ramdisk        /* 8: ramdisk size */ 
  unsigned long rootdev;       /* 16: Number representing the root device */ 
  unsigned long initrd_start;  /* 64: starting address of initial ramdisk */
                                      /* This can be either in flash/dram */ 
  unsigned long initrd_size;   /* 68: size of initial ramdisk */ 
 }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>请注意：这些数表示定义字段的参数结构中的偏移量。这意味着如果引导装载程序将参数结构放置在地址 0xc0000100，那么 rootdev 参数将放置在 0xc0000100 + 16，initrd_start 将放置在 0xc0000100 + 64 等等 ― 否则，内核将在解释正确的参数时遇到困难。</p>
		<p>正如上面提到的，因为从引导装载程序到内核的参数传递会有一些约束条件，所以大多数 2.4.x 系列内核期望参数以已标记的列表格式传递。在已标记的列表中，每个标记由标识被传递参数的 tag_header 以及其后的参数值组成。标记列表中标记的常规格式可以如下所示：</p>
		<br />
		<br />
		<a name="code4">
				<b>清单 4. 样本标记格式。内核通过 &lt;ATAG_TAGNAME&gt; 头来标识每个标记。</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">#define &lt;aTAG_TAGNAME&gt;  &lt;Some Magic number&gt; 
 struct &lt;tag_tagname&gt; { 
         u32 &lt;tag_param&gt;; 
         u32 &lt;tag_param&gt;; 
 }; 
 /* Example tag for passing memory information */ 
 #define ATAG_MEM        0x54410002  /* Magic number */ 
 struct tag_mem32 { 
         u32     size;               /* size of memory */ 
         u32     start;              /* physical start address of memory*/ 
 }; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>setup_arch</code> 还需要对闪存存储库、系统寄存器和其它特定设备执行内存映射。一旦完成了特定于体系结构的设置，控制就返回到初始化系统其余部分的 start_kernel 函数。这些附加的初始化任务包含： </p>
		<ul>
				<li>设置陷阱 
</li>
				<li>初始化中断 
</li>
				<li>初始化计时器 
</li>
				<li>初始化控制台 
</li>
				<li>调用 <code>mem_init</code> ，它计算各种区域、高内存区等内的页面数量 
</li>
				<li>初始化 slab 分配器并为 VFS、缓冲区高速缓存等创建 slab 高速缓存 
</li>
				<li>建立各种文件系统，如 proc、ext2 和 JFFS2 
</li>
				<li>创建 <code>kernel_thread</code> ，它执行文件系统中的 init 命令并显示 lign 提示符。 如果在 /bin、/sbin 或 /etc 中没有 init 程序，那么内核将执行文件系统的 /bin 中的 shell。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="3">
						<span class="atitle">设备驱动程序</span>
				</a>
		</p>
		<p>嵌入式系统通常有许多设备用于与用户交互，象触摸屏、小键盘、滚动轮、传感器、RA232 接口、LCD 等等。除了这些设备外，还有许多其它专用设备，包括闪存、USB、GSM 等。内核通过所有这些设备各自的设备驱动程序来控制它们，包括 GUI 用户应用程序也通过访问这些驱动程序来访问设备。本节着重讨论通常几乎在每个嵌入式环境中都会使用的一些重要设备的设备驱动程序。</p>
		<p>
				<a name="N101BF">
						<span class="smalltitle">
								<strong>
										<font face="Arial">帧缓冲区驱动程序</font>
								</strong>
						</span>
				</a>
		</p>
		<p>这是最重要的驱动程序之一，因为通过这个驱动程序才能使系统屏幕显示内容。帧缓冲区驱动程序通常有三层。最底层是基本控制台驱动程序 drivers/char/console.c，它提供了文本控制台常规接口的一部分。通过使用控制台驱动程序函数，我们能将文本打印到屏幕上 ― 但图形或动画还不能（这样做需要使用视频模式功能，通常出现在中间层，也就是 drivers/video/fbcon.c 中）。这个第二层驱动程序提供了视频模式中绘图的常规接口。</p>
		<p>帧缓冲区是显卡上的内存，需要将它内存映射到用户空间以便可以将图形和文本能写到这个内存段上：然后这个信息将反映到屏幕上。帧缓冲区支持提高了绘图的速度和整体性能。这也是顶层驱动程序引人注意之处：顶层是非常特定于硬件的驱动程序，它需要支持显卡不同的硬件方面 ― 象启用／禁用显卡控制器、深度和模式的支持以及调色板等。所有这三层都相互依赖以实现正确的视频功能。与帧缓冲区有关的设备是 /dev/fb0（主设备号 29，次设备号 0）。</p>
		<p>
				<a name="N101CB">
						<span class="smalltitle">
								<strong>
										<font face="Arial">输入设备驱动程序</font>
								</strong>
						</span>
				</a>
		</p>
		<p>可触摸板是用于嵌入式设备的最基本的用户交互设备之一 ― 小键盘、传感器和滚动轮也包含在许多不同设备中以用于不同的用途。</p>
		<p>触摸板设备的主要功能是随时报告用户的触摸，并标识触摸的坐标。这通常在每次发生触摸时，通过生成一个中断来实现。</p>
		<p>然后，这个设备驱动程序的角色是每当出现中断时就查询触摸屏控制器，并请求控制器发送触摸的坐标。一旦驱动程序接收到坐标，它就将有关触摸和任何可用数据的信号发送给用户应用程序，并将数据发送给应用程序（如果可能的话）。然后用户应用程序根据它的需要处理数据。</p>
		<p>几乎所有输入设备 ― 包括小键盘 ― 都以类似原理工作。</p>
		<p>
				<a name="N101DD">
						<span class="smalltitle">
								<strong>
										<font face="Arial">闪存 MTD 驱动程序</font>
								</strong>
						</span>
				</a>
		</p>
		<p>MTD 设备是象闪存芯片、小型闪存卡、记忆棒等之类的设备，它们在嵌入式设备中的使用正在不断增长。</p>
		<p>MTD 驱动程序是在 Linux 下专门为嵌入式环境开发的新的一类驱动程序。相对于常规块设备驱动程序，使用 MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的，所以它们通常有更好的支持、更好的管理和基于扇区的擦除和读写操作的更好的接口。Linux 下的 MTD 驱动程序接口被划分为两类模块：用户模块和硬件模块。</p>
		<p>
				<b>用户模块</b>
				<br />这些模块提供从用户空间直接使用的接口：原始字符访问、原始块访问、FTL（闪存转换层，Flash Transition Layer ― 用在闪存上的一种文件系统）和 JFS（即日志文件系统，Journaled File System ― 在闪存上直接提供文件系统而不是模拟块设备）。用于闪存的 JFS 的当前版本是 JFFS2（稍后将在本文中描述）。 </p>
		<p>
				<b>硬件模块</b>
				<br />这些模块提供对内存设备的物理访问，但并不直接使用它们。通过上述的用户模块来访问它们。这些模块提供了在闪存上读、擦除和写操作的实际例程。 </p>
		<p>
				<b>MTD 驱动程序设置</b>
				<br />为了访问特定的闪存设备并将文件系统置于其上，需要将 MTD 子系统编译到内核中。这包括选择适当的 MTD 硬件和用户模块。当前，MTD 子系统支持为数众多的闪存设备 ― 并且有越来越多的驱动程序正被添加进来以用于不同的闪存芯片。 </p>
		<p>有两个流行的用户模块可启用对闪存的访问： <code>MTD_CHAR</code> 和 <code>MTD_BLOCK</code> 。 </p>
		<p>
				<code>MTD_CHAR</code> 提供对闪存的原始字符访问，而 <code>MTD_BLOCK</code> 将闪存设计为可以在上面创建文件系统的常规块设备（象 IDE 磁盘）。与 <code>MTD_CHAR</code> 关联的设备是 /dev/mtd0、mtd1、mtd2（等等），而与 <code>MTD_BLOCK</code> 关联的设备是 /dev/mtdblock0、mtdblock1（等等）。由于 <code>MTD_BLOCK</code> 设备提供象块设备那样的模拟，通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的文件系统。 </p>
		<p>为了进行这个操作，可能需要创建分区表将闪存设备分拆到引导装载程序节、内核节和文件系统节中。样本分区表可能包含以下信息：</p>
		<br />
		<br />
		<a name="code5">
				<b>清单 5. MTD 的简单闪存设备分区</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">struct mtd_partition sample_partition = { 
      { 
                                           /* First partition */ 
            name : bootloader,             /* Bootloader section */ 
            size    : 0x00010000,          /* Size  */ 
            offset  : 0,          /* Offset from start of flash- location 0x0*/  
            mask_flags : MTD_WRITEABLE     /* This partition is not writable */ 
      },  
      {                                    /* Second partition */ 
            name : Kernel,                 /* Kernel section */ 
            size    :  0x00100000,         /* Size */ 
            offset : MTDPART_OFS_APPEND,   /* Append after bootloader section */ 
            mask_flags : MTD_WRITEABLE     /* This partition is not writable */ 
      },  
      {                                    /* Third partition */ 
            name : JFFS2,                  /* JFFS2 filesystem */ 
            size    :  MTDPART_SIZ_FULL,   /* Occupy rest of flash */ 
            offset :  MTDPART_OFS_APPEND   /* Append after kernel section */ 
      }
 }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>上面的分区表使用了 <code>MTD_BLOCK</code> 接口对闪存设备进行分区。这些分区的设备节点是： </p>
		<br />
		<br />
		<a name="IDASLDEB">
				<b>简单闪存分区的设备节点</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode"> User      device node         Major number    Minor number
  Bootloader    /dev/mtdblock0          31              0 
  Kernel        /dev/mtdblock1          31              1 
  Filesystem    /dev/mtdblock2          31              2 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在本例中，引导装载程序必须将有关 root 设备节点（/dev/mtdblock2）和可以在闪存中找到文件系统的地址（本例中是 <code>FLASH_BASE_ADDRESS + 0x04000000</code> ）的正确参数传递到内核。一旦完成分区，闪存设备就准备装入或挂装文件系统。 </p>
		<p>Linux 中 MTD 子系统的主要目标是在系统的硬件驱动程序和上层，或用户模块之间提供通用接口。硬件驱动程序不需要知道象 JFFS2 和 FTL 那样的用户模块使用的方法。所有它们真正需要提供的就是一组对底层闪存系统进行 <code>read</code> 、 <code>write</code> 和 <code>erase</code> 操作的简单例程。 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="4">
						<span class="atitle">嵌入式设备的文件系统</span>
				</a>
		</p>
		<p>系统需要一种以结构化格式存储和检索信息的方法；这就需要文件系统的参与。Ramdisk（请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>）是通过将计算机的 RAM 用作设备来创建和挂装文件系统的一种机制，它通常用于无盘系统（当然包括微型嵌入式设备，它只包含作为永久存储媒质的闪存芯片）。 </p>
		<p>用户可以根据可靠性、健壮性和／或增强的功能的需求来选择文件系统的类型。下一节将讨论几个可用选项及其优缺点。</p>
		<p>
				<a name="N10267">
						<span class="smalltitle">
								<strong>
										<font face="Arial">第二版扩展文件系统（Ext2fs）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Ext2fs 是 Linux 事实上的标准文件系统，它已经取代了它的前任 ― 扩展文件系统（或 Extfs）。Extfs 支持的文件大小最大为 2 GB，支持的最大文件名称大小为 255 个字符 ― 而且它不支持索引节点（包括数据修改时间标记）。Ext2fs 做得更好；它的 <b>优点</b>是： </p>
		<ul>
				<li>Ext2fs 支持达 4 TB 的内存。 
</li>
				<li>Ext2fs 文件名称最长可以到 1012 个字符。 
</li>
				<li>当创建文件系统时，管理员可以选择逻辑块的大小（通常大小可选择 1024、2048 和 4096 字节）。 
</li>
				<li>Ext2fs 了实现快速符号链接：不需要为此目的而分配数据块，并且将目标名称直接存储在索引节点（inode）表中。这使性能有所提高，特别是在速度上。 </li>
		</ul>
		<p>因为 Ext2 文件系统的稳定性、可靠性和健壮性，所以几乎在所有基于 Linux 的系统（包括台式机、服务器和工作站 ― 并且甚至一些嵌入式设备）上都使用 Ext2 文件系统。然而，当在嵌入式设备中使用 Ext2fs 时，它有一些 <b>缺点</b>： </p>
		<ul>
				<li>Ext2fs 是为象 IDE 设备那样的块设备设计的，这些设备的逻辑块大小是 512 字节，1 K 字节等这样的倍数。这不太适合于扇区大小因设备不同而不同的闪存设备。 
</li>
				<li>Ext2 文件系统没有提供对基于扇区的擦除／写操作的良好管理。在 Ext2fs 中，为了在一个扇区中擦除单个字节，必须将整个扇区复制到 RAM，然后擦除，然后重写入。考虑到闪存设备具有有限的擦除寿命（大约能进行 100,000 次擦除），在此之后就不能使用它们，所以这不是一个特别好的方法。 
</li>
				<li>在出现电源故障时，Ext2fs 不是防崩溃的。 
</li>
				<li>Ext2 文件系统不支持损耗平衡，因此缩短了扇区／闪存的寿命。（损耗平衡确保将地址范围的不同区域轮流用于写和／或擦除操作以延长闪存设备的寿命。） 
</li>
				<li>Ext2fs 没有特别完美的扇区管理，这使设计块驱动程序十分困难。 </li>
		</ul>
		<p>由于这些原因，通常相对于 Ext2fs，在嵌入式环境中使用 MTD/JFFS2 组合是更好的选择。</p>
		<p>
				<b>用 Ramdisk 挂装 Ext2fs</b>
				<br />通过使用 Ramdisk 的概念，可以在嵌入式设备中创建并挂装 Ext2 文件系统（以及用于这一目的的任何文件系统）。 </p>
		<br />
		<br />
		<a name="code6">
				<b>清单 6. 创建一个简单的基于 Ext2fs 的 Ramdisk</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode"> mke2fs -vm0 /dev/ram 4096
  mount -t ext2 /dev/ram /mnt
  cd /mnt
  cp /bin, /sbin, /etc, /dev ... files in mnt
  cd ../
  umount /mnt
  dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<code>mke2fs</code> 是用于在任何设备上创建 ext2 文件系统的实用程序 — 它创建超级块、索引节点以及索引节点表等等。 </p>
		<p>在上面的用法中， <code>/dev/ram</code> 是上面构建有 4096 个块的 ext2 文件系统的设备。然后，将这个设备（ <code>/dev/ram</code> ）挂装在名为 <code>/mnt</code> 的临时目录上并且复制所有必需的文件。一旦复制完这些文件，就卸装这个文件系统并且设备（ <code>/dev/ram</code> ）的内容被转储到一个文件（ext2ramdisk）中，它就是所需的 Ramdisk（Ext2 文件系统）。 </p>
		<p>上面的顺序创建了一个 4 MB 的 Ramdisk，并用必需的文件实用程序来填充它。</p>
		<p>一些要包含在 Ramdisk 中的重要目录是：</p>
		<ul>
				<li>
						<b>/bin</b> ― 保存大多数象 <code>init</code> 、 <code>busybox</code> 、 <code>shell</code> 、文件管理实用程序等二进制文件。 
</li>
				<li>
						<b>/dev</b>― 包含用在设备中的所有设备节点 
</li>
				<li>
						<b>/etc</b>― 包含系统的所有配置文件 
</li>
				<li>
						<b>/lib</b>― 包含所有必需的库，如 libc、libdl 等 </li>
		</ul>
		<p>
				<a name="N102F6">
						<span class="smalltitle">
								<strong>
										<font face="Arial">日志闪存文件系统，版本 2（JFFS2）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>瑞典的 Axis Communications 开发了最初的 JFFS，Red Hat 的 David Woodhouse 对它进行了改进。 第二个版本，JFFS2，作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。JFFS2 文件系统是日志结构化的，这意味着它基本上是一长列节点。每个节点包含有关文件的部分信息 ― 可能是文件的名称、也许是一些数据。相对于 Ext2fs，JFFS2 因为有以下这些 <b>优点</b>而在无盘嵌入式设备中越来越受欢迎： </p>
		<ul>
				<li>JFFS2 在扇区级别上执行闪存擦除／写／读操作要比 Ext2 文件系统好。 
</li>
				<li>JFFS2 提供了比 Ext2fs 更好的崩溃／掉电安全保护。当需要更改少量数据时，Ext2 文件系统将整个扇区复制到内存（DRAM）中，在内存中合并新数据，并写回整个扇区。这意味着为了更改单个字，必须对整个扇区（64 KB）执行读／擦除／写例程 ― 这样做的效率非常低。要是运气差，当正在 DRAM 中合并数据时，发生了电源故障或其它事故，那么将丢失整个数据集合，因为在将数据读入 DRAM 后就擦除了闪存扇区。JFFS2 附加文件而不是重写整个扇区，并且具有崩溃／掉电安全保护这一功能。 
</li>
				<li>这可能是最重要的一点：JFFS2 是专门为象闪存芯片那样的嵌入式设备创建的，所以它的整个设计提供了更好的闪存管理。 </li>
		</ul>
		<p>因为本文主要是写关于闪存设备的使用，所以在嵌入式环境中使用 JFFS2 的 <b>缺点</b>很少： </p>
		<ul>
				<li>当文件系统已满或接近满时，JFFS2 会大大放慢运行速度。这是因为垃圾收集的问题（更多信息，请参阅 <a href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#resources"><font color="#996699">参考资料</font></a>）。 </li>
		</ul>
		<p>
				<b>创建 JFFS2 文件系统</b>
				<br />在 Linux 下，用 <code>mkfs.jffs2</code> 命令创建 JFFS2 文件系统（基本上是使用 JFFS2 的 Ramdisk）。 </p>
		<br />
		<br />
		<a name="code7">
				<b>清单 7. 创建 JFFS2 文件系统</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">mkdir jffsfile 
 cd jffsfile 
 /* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries 
that are needed for the filesystem here */ 
 /* Type the following command under jffsfile directory to create the JFFS2 Image */ 
 ./mkfs.jffs2 -e 0x40000 -p -o ../jffs.image 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>上面显示了 mkfs.jffs2 的典型用法。 <code>-e</code> 选项确定闪存的擦除扇区大小（通常是 64 千字节）。 <code>-p</code> 选项用来在映像的剩余空间用零填充。 <code>-o</code> 选项用于输出文件，通常是 JFFS2 文件系统映像 ― 在本例中是 jffs.image。一旦创建了 JFFS2 文件系统，它就被装入闪存中适当的位置（引导装载程序告知内核查找文件系统的地址）以便内核能挂装它。 </p>
		<p>
				<b>tmpfs</b>
				<br />当 Linux 运行于嵌入式设备上时，该设备就成为功能齐全的单元，许多守护进程会在后台运行并生成许多日志消息。另外，所有内核日志记录机制，象 syslogd、dmesg 和 klogd，会在 /var 和 /tmp 目录下生成许多消息。由于这些进程产生了大量数据，所以允许将所有这些写操作都发生在闪存是不可取的。由于在重新引导时这些消息不需要持久存储，所以这个问题的解决方案是使用 tmpfs。 </p>
		<p>tmpfs 是基于内存的文件系统，它主要用于减少对系统的不必要的闪存写操作这一唯一目的。因为 tmpfs 驻留在 RAM 中，所以写／读／擦除的操作发生在 RAM 中而不是在闪存中。因此，日志消息写入 RAM 而不是闪存中，在重新引导时不会保留它们。tmpfs 还使用磁盘交换空间来存储，并且当为存储文件而请求页面时，使用虚拟内存（VM）子系统。</p>
		<p>tmpfs 的 <b>优点</b>包括： </p>
		<ul>
				<li>动态文件系统大小 ― 文件系统大小可以根据被复制、创建或删除的文件或目录的数量来缩放。使得能够最理想地使用内存。 
</li>
				<li>速度 ― 因为 tmpfs 驻留在 RAM，所以读和写几乎都是瞬时的。即使以交换的形式存储文件，I/O 操作的速度仍非常快。 </li>
		</ul>
		<p>tmpfs 的一个 <b>缺点</b>是当系统重新引导时会丢失所有数据。因此，重要的数据不能存储在 tmpfs 上。 </p>
		<p>
				<b>挂装 tmpfs</b>
				<br />诸如 Ext2fs 和 JFFS2 等大多数其它文件系统都驻留在底层块设备之上，而 tmpfs 与它们不同，它直接位于 VM 上。因而，挂装 tmpfs 文件系统是很简单的事： </p>
		<br />
		<br />
		<a name="code8">
				<b>清单 8. 挂装 tmpfs</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">/* Entries in /etc/rc.d/rc.sysinit for creating/using tmpfs */ 
 # mount -t tmpfs tmpfs /var -o size=512k 
 # mkdir -p /var/tmp 
 # mkdir -p /var/log 
 # ln -s /var/tmp /tmp 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>上面的命令将在 /var 上创建 tmpfs 并将 tmpfs 的最大大小限制为 512 K。同时，tmp/ 和 log/ 目录成为 tmpfs 的一部分以便在 RAM 中存储日志消息。</p>
		<p>如果您想将 tmpfs 的一个项添加到 /etc/fstab，那么它可能看起来象这样： </p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">tmpfs /var tmpfs size=32m 0 0</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这将在 /var 上挂装一个新的 tmpfs 文件系统。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="5">
						<span class="atitle">图形用户界面（GUI）选项</span>
				</a>
		</p>
		<p>从用户的观点来看，图形用户界面（GUI）是系统的一个最至关重要的方面：用户通过 GUI 与系统进行交互。所以 GUI 应该易于使用并且非常可靠。但它还需要是有内存意识的，以便在内存受限的、微型嵌入式设备上可以无缝执行。所以，它应该是轻量级的，并且能够快速装入。</p>
		<p>另一个要考虑的重要方面涉及许可证问题。一些 GUI 分发版具有允许免费使用的许可证，甚至在一些商业产品中也是如此。另一些许可证要求如果想将 GUI 合并入项目中则要支付版税。</p>
		<p>最后，大多数开发人员可能会选择 XFree86，因为 XFree86 为他们提供了一个能使用他们喜欢的工具的熟悉环境。但是市场上较新的 GUI，象 Century Software 的 Microwindows（Nano-X）和 Trolltech 的 QT/Embedded，与 X 在嵌入式 Linux 的竞技舞台中展开了激烈竞争，这主要是因为它们占用很少的资源、执行的速度很快并且具有定制窗口构件的支持。</p>
		<p>让我们看一看这些选项中的每一个。</p>
		<p>
				<a name="N10394">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Xfree86 4.X（带帧缓冲区支持的 X11R6.4）</font>
								</strong>
						</span>
				</a>
		</p>
		<p>XFree86 Project, Inc. 是一家生产 XFree86 的公司，该产品是一个可以免费重复分发、开放源码的 X Window 系统。X Window 系统（X11）为应用程序以图形方式进行显示提供了资源，并且它是 UNIX 和类 UNIX 的机器上最常用的窗口系统。它很小但很有效，它运行在为数众多的硬件上，它对网络透明并且有良好的文档说明。X11 为窗口管理、事件处理、同步和客户机间通信提供强大的功能 ― 并且大多数开发人员已经熟悉了它的 API。它具有对内核帧缓冲区的内置支持，并占用非常少的资源 ― 这非常有助于内存相对较少的设备。X 服务器支持 VGA 和非 VGA 图形卡，它对颜色深度 1、2、4、8、16 和 32 提供支持，并对渲染提供内置支持。最新的发行版是 XFree86 4.1.0。</p>
		<p>它的 <b>优点</b>包括： </p>
		<ul>
				<li>帧缓冲区体系结构的使用提高了性能。 
</li>
				<li>占用的资源相对很小 ― 大小在 600 K 到 700 K 字节的范围内，这使它很容易在小型设备上运行。 
</li>
				<li>非常好的支持：在线有许多文档可用，还有许多专用于 XFree86 开发的邮递列表。 
</li>
				<li>X API 非常适合扩展。 </li>
		</ul>
		<p>它的 <b>缺点</b>包括： </p>
		<ul>
				<li>比最近出现的嵌入式 GUI 工具性能差。 
</li>
				<li>此外，当与 GUI 中最新的开发 ― 象专门为嵌入式环境设计的 Nano-X 或 QT/Embedded ― 相比时，XFree86 似乎需要更多的内存。 </li>
		</ul>
		<p>
				<a name="N103C1">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Microwindows</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Microwindows 是 Century Software 的开放源代码项目，设计用于带小型显示单元的微型设备。它有许多针对现代图形视窗环境的功能部件。象 X 一样，有多种平台支持 Microwindows。</p>
		<p>Microwindows 体系结构是基于客户机／服务器的并且具有分层设计。最底层是屏幕和输入设备驱动程序（关于键盘或鼠标）来与实际硬件交互。在中间层，可移植的图形引擎提供对线的绘制、区域的填充、多边形、裁剪以及颜色模型的支持。</p>
		<p>在最上层，Microwindows 支持两种 API：Win32/WinCE API 实现，称为 Microwindows；另一种 API 与 GDK 非常相似，它称为 Nano-X。Nano-X 用在 Linux 上。它是象 X 的 API，用于占用资源少的应用程序。</p>
		<p>Microwindows 支持 1、2、4 和 8 bpp（每像素的位数）的 palletized 显示，以及 8、16、24 和 32 bpp 的真彩色显示。Microwindows 还支持使它速度更快的帧缓冲区。Nano-X 服务器占用的资源大约在 100 K 到 150 K 字节。</p>
		<p>原始 Nano-X 应用程序的平均大小在 30 K 到 60 K。由于 Nano-X 是为有内存限制的低端设备设计的，所以它不象 X 那样支持很多函数，因此它实际上不能作为微型 X（Xfree86 4.1）的替代品。</p>
		<p>可以在 Microwindows 上运行 FLNX，它是针对 Nano-X 而不是 X 进行修改的 FLTK（快速轻巧工具箱(Fast Light Toolkit)）应用程序开发环境的一个版本。本文中描述 FLTK。</p>
		<p>Nano-X 的 <b>优点</b>包括： </p>
		<ul>
				<li>与 Xlib 实现不同，Nano-X 仍在每个客户机上同步运行，这意味着一旦发送了客户机请求包，服务器在为另一个客户机提供服务之前一直等待，直到整个包都到达为止。这使服务器代码非常简单，而运行的速度仍非常快。 
</li>
				<li>占用很小的资源 </li>
		</ul>
		<p>Nano-X 的 <b>缺点</b>包括： </p>
		<ul>
				<li>联网功能部件至今没有经过适当地调整（特别是网络透明性）。 
</li>
				<li>还没有太多现成的应用程序可用。 
</li>
				<li>与 X 相比，Nano-X 虽然近来正在加速开发，但仍没有那么多文档说明而且没有很好的支持，但这种情形会有所改变。 </li>
		</ul>
		<p>
				<a name="N103FA">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Microwindows 上的 FLTK API</font>
								</strong>
						</span>
				</a>
		</p>
		<p>FLTK 是一个简单但灵活的 GUI 工具箱，它在 Linux 世界中赢得越来越多的关注，它特别适用于占用资源很少的环境。它提供了您期望从 GUI 工具箱中获得的大多数窗口构件，如按钮、对话框、文本框以及出色的“赋值器”选择（用于输入数值的窗口构件）。还包括滑动器、滚动条、刻度盘和其它一些构件。</p>
		<p>针对 Microwindows GUI 引擎的 FLTK 的 Linux 版本被称为 FLNX。FLNX 由两个组件构成：Fl_Widget 和 FLUID。Fl_Widget 由所有基本窗口构件 API 组成。FLUID（快速轻巧的用户界面设计器(Fast Light User Interface Designer, FLUID)）是用来产生 FLTK 源代码的图形编辑器。总的来说，FLNX 是能用来为嵌入式环境创建应用程序的一个出色的 UI 构建器。</p>
		<p>Fl_Widget 占用的资源大约是 40 K 到 48 K，而 FLUID（包括了每个窗口构件）大约占用 380 K。这些非常小的资源占用率使 Fl_Widget 和 FLUID 在嵌入式开发世界中非常受欢迎。</p>
		<p>
				<b>优点</b>包括： </p>
		<ul>
				<li>习惯于在象 Windows 这样已建立得较好的环境中开发基于 GUI 的应用程序的任何人都会非常容易地适应 FLTK 环境。 
</li>
				<li>它的文档包括一本十分完整且编写良好的手册。 
</li>
				<li>它使用 LGPL 进行分发，所以开发人员可以灵活地发放他们应用程序的许可证。 
</li>
				<li>FLTK 是一个 C++ 库（Perl 和 Python 绑定也可用）。面向对象模型的选择是一个好的选择，因为大多数现代 GUI 环境都是面向对象的；这也使将编写的应用程序移植到类似的 API 中变得更容易。 
</li>
				<li>Century Software 的环境提供了几个有用的工具，诸如 ScreenToP 和 ViewML 浏览器。 </li>
		</ul>
		<p>它的 <b>缺点</b>是： </p>
		<ul>
				<li>普通的 FLTK 可以与 X 和 Windows API 一同工作，而 FLNX 不能。它与 X 的不兼容性阻碍了它在许多项目中的使用。 </li>
		</ul>
		<p>
				<a name="N1042D">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Qt/Embedded</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Qt/Embedded 是 Trolltech 新开发的用于嵌入式 Linux 的图形用户界面系统。Trolltech 最初创建 Qt 作为跨平台的开发工具用于 Linux 台式机。它支持各种有 UNIX 特点的系统以及 Microsoft Windows。KDE ― 最流行的 Linux 桌面环境之一，就是用 Qt 编写的。</p>
		<p>Qt/Embedded 以原始 Qt 为基础，并做了许多出色的调整以适用于嵌入式环境。Qt Embedded 通过 Qt API 与 Linux I/O 设施直接交互。那些熟悉并已适应了面向对象编程的人员将发现它是一个理想环境。而且，面向对象的体系结构使代码结构化、可重用并且运行快速。与其它 GUI 相比，Qt GUI 非常快，并且它没有分层，这使得 Qt/Embedded 成为用于运行基于 Qt 的程序的最紧凑环境。</p>
		<p>Trolltech 还推出了 Qt 掌上机环境（Qt Palmtop Environment，俗称 Qpe）。Qpe 提供了一个基本桌面窗口，并且该环境为开发提供了一个易于使用的界面。Qpe 包含全套的个人信息管理（Personal Information Management (PIM)）应用程序、因特网客户机、实用程序等等。然而，为了将 Qt/Embedded 或 Qpe 集成到一个产品中，需要从 Trolltech 获得商业许可证。（原始 Qt 自版本 2.2 以后就可以根据 GPL 获得 。）</p>
		<p>它的 <b>优点</b>包括： </p>
		<ul>
				<li>面向对象的体系结构有助于更快地执行 
</li>
				<li>占用很少的资源，大约 800 K 
</li>
				<li>抗锯齿文本和混合视频的象素映射 </li>
		</ul>
		<p>它的 <b>缺点</b>是： </p>
		<ul>
				<li>Qt/Embedded 和 Qpe 只能在获得商业许可证的情况下才能使用。 </li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.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="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/linux/embed/embdev/#main">
																				<b>
																						<font color="#996699">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="6">
						<span class="atitle">结束语</span>
				</a>
		</p>
		<p>嵌入式 Linux 开发正迅速地发展着。您必须学习并从引导装载程序和分发版到文件系统和 GUI 中的每一个事物的各种选项中作出选择。但是要感谢有这种选择自由度以及非常活跃的 Linux 社区，Linux 上的嵌入式开发已经达到了新的境界，并且调整模块以适合您的规范从未比现在更简单。这已经导致出现了许多时新的手持和微型设备作为开放盒，这是件好事 ― 因为事实是您不必成为一个专家从这些模块中进行选择来调整您的设备以满足您自己的要求和需要。</p>
		<p>我们希望这篇对嵌入式 Linux 领域的介绍性概述能激起您进行试验的欲望，并且希望您将体会摆弄微型设备的乐趣以满足您的爱好。为进一步有助于您的项目，请参阅下面的“参考资料”，链接到有关我们这里已经概述的技术的更深入的信息。</p>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<p>
				<b>引导</b>： </p>
		<ul>
				<li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/library/l-embdev.html?S_TACT=105AGX52&amp;S_CMP=cn-a-l"><font color="#5c81a7">英文原文</font></a>. <br /><br /></li>
				<li>如需获得对 vmlinux 和 zimage 之间区别的极好解释，请在 Alessandro Rubini 编写的“ <a href="http://www.linux.it/kerneldocs/kconf/"><font color="#996699">Kernel Configuration: dealing with the unexpected</font></a>（ <i>Linux Magazine</i>）的一文中找到“Booting your kernel”一节。 <br /><br /></li>
		</ul>
		<p>
				<b>小型分发版</b>： </p>
		<ul>
				<li>
						<a href="http://www.linuxdevices.com/articles/AT2760742655.html">
								<font color="#996699">The Embedded Linux Distributions Quick Reference Guide</font>
						</a>涵盖了许多商业的和开放源码的分发版（ <i>Linux Devices</i>，2001 年 8 月）。 <br /><br /><br /></li>
				<li>请查看另一个 <a href="http://linux-embedded.com/software.php3"><font color="#5c81a7">详尽的分发版</font></a>和有用的工具的清单（ <i>Linux-embedded.com</i>）。 <br /></li>
		</ul>
		<p>
				<b>工具链</b>： </p>
		<ul>
				<li>
						<a href="http://tuxscreen.net/wiki/view/Main/ToolChain">
								<font color="#5c81a7">Wiki 工具链页面</font>
						</a>包含到本文提到的所有三个工具链的链接，还有对它们的评论。 <br /></li>
		</ul>
		<p>
				<b>设备驱动程序</b>： </p>
		<ul>
				<li>
						<a href="http://linux-mtd.infradead.org/">
								<font color="#5c81a7">Memory Technology Device (MTD) Subsystem for Linux</font>
						</a>的目的是简化内存设备（特别是闪存设备）的驱动程序的创建。 <br /><br /><br /></li>
				<li>Vipin Malik 编写的 <a href="http://ftp.linux.org.uk/pub/people/dwmw2/mtd/cvs/mtd/mtd-jffs-HOWTO.txt"><font color="#5c81a7">The Linux MTD, JFFS HOWTO</font></a>将帮助您使 MTD 和 JFFS2 一起工作。 <br /><br /><br /></li>
				<li>
						<a href="http://penguinppc.org/embedded/howto/device-drivers.html">
								<font color="#5c81a7">Linux for PowerPC Embedded Systems HOWTO</font>
						</a>有一个很好的设备驱动程序清单。 <br /><br /><br /></li>
				<li>理解 <a href="http://www.penguinmagazine.com/Magazine/This_Issue/0015"><font color="#5c81a7">Linux device drivers</font></a>有助于理解本篇介绍性文章（ <i>Penguin Magazine</i>）。 <br /><br /><br /></li>
				<li>要精通 Linux 设备驱动程序，请阅读 O'Reilly 的 <a href="http://www.xml.com/ldd/chapter/book/"><font color="#5c81a7">Linux Device Drivers，第 2 版</font></a>一书。 <br /></li>
		</ul>
		<p>
				<b>有用的工具</b>： </p>
		<ul>
				<li>
						<a href="http://www.gnu.org/directory/binutils.html">
								<font color="#5c81a7">Binutils</font>
						</a>、 <a href="http://gcc.gnu.org/gcc-3.0/"><font color="#5c81a7">GCC</font></a>和 <a href="http://www.gnu.org/software/libc/libc.html"><font color="#5c81a7">Glibc</font></a>都可从 Free Software Foundation 下载获得。 <br /><br /><br /></li>
				<li>许多有用的下载都可从 <a href="http://www.netwinder.org/services.html"><font color="#5c81a7">Netwinder.org</font></a>获得，这是一个致力于 NetWinder 平台上开发工作的志愿者站点。 <br /><br /><br /></li>
				<li>请在 Mark Nielsen 写得非常棒的 <a href="http://www.gnujobs.com/mark/articles/Ramdisk.html"><font color="#5c81a7">How to use a Ramdisk for Linux</font></a>一文中阅读有关 Ramdisk 的所有信息。 <br /><br /><br /></li>
				<li>
						<a href="http://www.viewml.com/download/">
								<font color="#996699">FLNX</font>
						</a>是以 FLTK（快速轻巧的工具箱）为基础的。 <br /></li>
		</ul>
		<p>
				<b>文件系统</b>： </p>
		<ul>
				<li>第二版扩展文件系统 <a href="http://e2fsprogs.sourceforge.net/ext2.html"><font color="#5c81a7">Ext2fs</font></a>的主页在 SourceForge。 <br /><br /><br /></li>
				<li>Red Hat 英国公司的 David Woodhouse 概述了大量有关 <a href="http://sources.redhat.com/jffs2/jffs2-html/jffs2-html.html"><font color="#5c81a7">JFFS2：日志闪存文件系统，第 2 版</font></a>的背景知识。 <br /><br /><br /></li>
				<li>您可以在 Linux HeadQuarters 阅读更多有关 <a href="http://www.linuxhq.com/kernel/v2.4/patch/patch-2.4.17-pre5/linux/Documentation/filesystems/tmpfs.txt.html"><font color="#5c81a7">tmpfs</font></a>的信息。 <br /><br /><br /></li>
				<li>Cliff Brake 和 Jeff Sutherland 编写的 <a href="http://embedded.linuxjournal.com/magazine/issue04/4678/?sid=449c51a20d1809f80435d77163f511ee"><font color="#5c81a7">Flash Filesystems for Embedded Linux Systems</font></a>一文论述了用于闪存设备的更多文件系统（ <i>Embedded Linux Journal</i>）。 <br /></li>
		</ul>
		<p>
				<b>GUI</b>： </p>
		<ul>
				<li>Xfree86 是 <a href="http://www.xfree86.org/"><font color="#5c81a7">X 开发</font></a>的主页。 <br /><br /><br /></li>
				<li>请查看一篇对 <a href="http://mail.gnome.org/archives/gtk-devel-list/2000-March/msg00157.html"><font color="#5c81a7">Microwindows 的一些缺点</font></a>（GNOME gtk 开发人员的邮递列表）的讨论（时间比较长了）。 <br /><br /><br /></li>
				<li>在 Trolltech 上查找有关 <a href="http://www.trolltech.com/products/embedded/index.html"><font color="#5c81a7">Qt/Embedded</font></a>的更多信息。 <br /><br /><br /></li>
				<li>
						<a href="http://www.linuxdevices.com/articles/AT9202043619.html">
								<font color="#5c81a7">The Embedded Linux GUI/Windowing Quick Reference Guide</font>
						</a>中有丰富的链接（ <i>Linux Devices</i>，2002 年 2 月）。 <br /></li>
		</ul>
		<p>
				<b>一般参考资料</b>： </p>
		<ul>
				<li>
						<a href="http://www.gnu.org/copyleft/gpl.html">
								<font color="#5c81a7">General Public License 或 GPL</font>
						</a>确保用户复制、分发和修改软件的权利。 <br /><br /><br /></li>
				<li>
						<a href="http://www.arm.linux.org.uk/docs/whatis.shtml">
								<font color="#5c81a7">ARM Linux</font>
						</a>是您了解有关 Linux 用于 ARM 处理器的信息的一个非常好的站点。它由 ARM 的创建者 Russell King 来维护。 <br /><br /><br /></li>
				<li>
						<a href="http://penguinppc.org/about/">
								<font color="#5c81a7">Penguinppc.org</font>
						</a>是关于 Linux 用于 PowerPC 系列处理器的的主页。该站点上有一个关于为基于 PPC 的体系结构建立工具链的资料丰富的教程。 <br /><br /><br /></li>
				<li>
						<a href="http://www.linuxdevices.com/">
								<font color="#996699">Linux Devices</font>
						</a>是一个非常全面的站点，它包含有关 Linux 和嵌入式开发的出版发行、快速参考、新闻和特色报告等各种信息。 <br /><br /><br /></li>
				<li>
						<a href="http://www.siliconpenguin.com/">
								<font color="#5c81a7">Silicon Penguin</font>
						</a>列表站点上拥有嵌入式 Linux 参考资料的详尽集合。 <br /><br /><br /></li>
				<li>
						<a href="http://www.aleph1.co.uk/armlinux/thebook.html">
								<font color="#5c81a7">ARMLinux - the book</font>
						</a>可从 Aleph One 上获得。您可以定购一本，也可以 <a href="http://www.aleph1.co.uk/armlinux/book/book1.html"><font color="#996699">在线阅读</font></a>。 <br /><br /><br /></li>
				<li>
						<a href="http://www.embedded-linux.org/vision.php3">
								<font color="#5c81a7">嵌入式 Linux 协会（Embedded Linux Consortium）</font>
						</a>是一个非赢利的互助协会，它欢迎致力于嵌入式 Linux 领域的开发人员成为会员。 <br /><br /><br /></li>
				<li>IBM 的 <a href="http://www.ibm.com/products/gallery/linuxwatch.shtml"><font color="#5c81a7">Linux wristwatch</font></a>是运行 Linux 的微型嵌入式设备的示例；本文的作者之一，Vishal Kulkarni 也参与了它的研发。请在 <a href="http://www.freeos.com/articles/3800"><font color="#5c81a7">本文</font></a>（ <i>FreeOS.com</i>，2001 年 3 月）中阅读有关它的信息。 <br /><br /><br /></li>
				<li>在 <i>developerWorks</i>上浏览 <a href="http://www.ibm.com/developerworks/linux/?S_TACT=105AGX52&amp;article=lr&amp;S_CMP=cn-a-l"><font color="#5c81a7">更多 Linux 参考资料</font></a>。 <br /><br /><br /></li>
				<li>在 <i>developerWorks</i>上浏览 <a href="http://www.ibm.com/developerworks/wireless/?S_TACT=105AGX52&amp;S_CMP=cn-a-l"><font color="#5c81a7">更多无线领域的参考资料</font></a>。 <br /></li>
		</ul>
		<br />
		<br />
		<p>
				<a name="author">
						<span class="atitle">作者简介</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Anand K Santhanam 在印度 Madras 大学获得计算机科学工学学士学位。自 1999 年 7 月以来他一直在印度为 IBM Global Services（软件实验室）工作。他是 IBM Linux 小组的成员，这个小组主要致力于嵌入式系统中的 ARM-Linux、设备驱动程序和电源管理的研究和开发。他感兴趣的其它领域是 O/S 本质和联网。可以通过 <a href="mailto:asanthan@in.ibm.com?cc=asanthan@in.ibm.com"><font color="#5c81a7">asanthan@in.ibm.com</font></a> 与他联系。 </p>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
										</p>
								</td>
								<td>
										<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
								</td>
								<td width="100%">
										<p>Vishal Kulkarni 从印度 Maharashtra 的 Shivaji 大学获得电子工程的学士学位。自 1999 年 3 月以来他一直在印度为 IBM Global Services（软件实验室）工作。在此之前，他曾在美国 IBM Austin 工作了一年半多。他是 IBM Linux 小组的成员，这个小组主要致力于嵌入式设备上的 ARM-Linux、设备驱动程序和 GUI。他感兴趣的其它领域是 O/S 本质和联网。可以通过 <a href="mailto:kvishal@in.ibm.com?cc=kvishal@in.ibm.com"><font color="#5c81a7">kvishal@in.ibm.com</font></a>与他联系。 </p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/fenixchen/aggbug/19635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenixchen/" target="_blank">陈长虹</a> 2007-03-12 15:29 <a href="http://www.cppblog.com/fenixchen/articles/19635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>