﻿<?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++博客-Tommy的技术博客-文章分类-嵌入式</title><link>http://www.cppblog.com/tommyyan/category/10477.html</link><description>&lt;br&gt;C++/web技术/设计模式/LINUX/MYSQL/P2P交流/嵌入式系统&lt;br&gt;
个人相关：&lt;a href="http://3965743.qzone.qq.com/" id = "MyLinks1_HomeLink" class="listitem" &gt;http://3965743.qzone.qq.com/&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 16 Aug 2009 19:03:23 GMT</lastBuildDate><pubDate>Sun, 16 Aug 2009 19:03:23 GMT</pubDate><ttl>60</ttl><item><title> 开贴整理QtEmbedded/Qtopia FAQ</title><link>http://www.cppblog.com/tommyyan/articles/92896.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Tue, 11 Aug 2009 06:13:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/92896.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/92896.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/92896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/92896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/92896.html</trackback:ping><description><![CDATA[<span style="color: purple;">提问 ---- 回答(注意哦，这里都是以Qtopia2.2为蓝本的，因为我用的是这个版本... )</span><br><span style="color: blue;"><strong>Qt-X11/QtEmbedded/Qtopia及其他常见包的关系?</strong></span><br>build Qtopia时经常能看到以下的包：<br>qt-x11-2.3.2<br>qt-x11-3.3.x<br>qte-2.3.x<br>qtopia-2.x<br>tmake-1.3<br>qmake, uic, moc<br>...<br><br>其中Qtopia编译依赖Qte;<br>qt-x11-2.3只与编译一些tool有关， 如uic,moc,qvfb..Qtopia并不依赖qt-x11;<br>qt-
x11-3.3.x用来编译qtopia desktop（qtopia与桌面同步的工具）和i18n相关的lupdate、lrelease工具，
所以如果你configure
qtopia的时候没有加-no-qtopiadesktop选项或者用到了-languages参数就得准备qt-x11-3.x了;
另外在phone版本中有一个modem模拟的工具叫做phonesim， 也依赖qt-x11-3.x编译，不过多数人是用不上的， 呵呵。<br><br>tmake用于生成Makefile文件， 用在qte应用上;<br>qmake包含在qtopia里， 用于为Qtopia应用生成Makefile文件;<br>uic,moc,qvfb,qmake,tmake
和designer使用的时候要注意版本，2.x, 3.x, 4.x之间是不兼容的， 但相同主版本号之间是兼容的，所以我们在build
Qtopia过程中经常从qt-x11-2.3中拷贝现成的uic和moc供qte使用。<br>编译过程中出现一些头文件找不到， 类未定义等等，很多时候是因为误使用了系统默认搜索路径下的uic等工具造成的。大家要注意这个问题<br><br><span style="color: blue;"><strong>Qtopia/QtEmbedded版本对应关系?</strong></span><br>Qtopia1.7.0 / Qte 2.3.7<br>Qtopia2.1.1 / Qte 2.3.10<br>Qtopia2.1.2 / Qte 2.3.11<br>Qtopia2.2.0 / Qte 2.3.12 (包含在qtopia2.2源码包中)<br><br><span style="color: blue;"><strong>Qtopia/QtEmbedded相关源码包下载地址?</strong></span><br><strong>Qt/Qte:</strong><br><a  href="ftp://ftp.trolltech.com/qt/source" target="_blank">ftp://ftp.trolltech.com/qt/source</a><br><a  href="ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qt/source" target="_blank">ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qt/source</a><br><br><strong>Qtopia(1.6-2.2):</strong><br><a  href="ftp://ftp.trolltech.com/qtopia/source" target="_blank">ftp://ftp.trolltech.com/qtopia/source</a><br><a  href="ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qtopia/source" target="_blank">ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qtopia/source</a><br><br><strong>tmake:</strong><br><a  href="ftp://ftp.trolltech.com/freebies/tmake" target="_blank">ftp://ftp.trolltech.com/freebies/tmake</a><br><a  href="ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/freebies/tmake" target="_blank">ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/freebies/tmake</a><br><br><span style="color: blue;"><strong>我的QtEmbedded程序中的中文字符为什么显示成方块?</strong></span><br>两个可能的原因：<br>一是qte的库未编译进对中文textcodec的支持， 解决方案：修改qconfig-qpe.h， 去掉CODEC有关的宏， 重新configure和make<br><br>二
是程序中选用的字体不是中文字体(默认的字体是Helvetica，没有中文)， 需要在程序中指定一个中文字体，
如qte自带的unifont(这个字体大家普遍的看法是看上去像残废)， qt4版本里新加入了文泉驿的unicode字体，
可以在源码包里找到，比较漂亮， 推荐。<br><br><span style="color: blue;"><strong>如何把QtEmbedded程序移植为Qtopia程序?</strong></span><br>Qtopia里提供了简单的宏来创建主窗口、应用style等， 最主要的改变在main函数。<br>参考qtopia/src/applications/clock/main.cpp<br>--------------------------------------------------<br>#include "mymainwindow.h"<br>#include &lt;qtopia/qpeapplication.h&gt;<br>QTOPIA_ADD_APPLICATION("myappname", "MyMainWindow")<br>QTOPIA_MAIN<br>---------------------------------------------------<br>这一步很简单把，cp过来改改类名和binary的名字就OK了。<br>需要注意的是你的mainwindow的构造函数要符合(QWidget*p, const char* name, int f)的形式（三个参数）<br><br>相应的，修改pro文件。 参考qtopia/src/applications/clock/clock.pro<br>其中最重要的一行是 CONFIG+= qtopiaapp<br>这样编出来是quicklaunch插件程序（applications目录下的程序默认config是quichlaunch， 别的目录不是哦~）<br><br>要想编成独立的应用， 加上这句：CONFIG -= buildQuicklaunch<br><br>大功告成！<br><br><span style="color: blue;"><strong>如何将自己的应用添加到qtopia桌面里?</strong></span><br>首先把你的应用修改成qtopia应用程序（见上一个问题）。<br>然后把你的程序cp到qtopia程序默认的搜索路径中：<br>应用程序放到SRCDIR/qtopia/image/opt/Qtopia/bin下；（后面的SRCDIR/qtopia/image/opt/Qtopia简写为"..."）<br>quicklaunch插件放到../plugins/application下。 <br><br>假设你编译得到的quicklauncher插件叫libmybin.so, 则相应的需要在../bin下建立一个链接文件： ln -s quicklauncher mybin<br><br>另外，还需要创建一个desktop文件（找个现成的改改）， 把这个desktop文件放到qtopia的<br>../apps/Applications下。<br><br>desktop
文件里最重要的信息是关联的执行档名称和图标文件的名称。 执行档名称和上文中的mybin对应，
图标的话desktop文件里只写了一个文件的名字，但实际上qtopia去搜索的时候会到以执行档的名字命名的子目录去寻找该icon文件，
也就是.../pics/mybin/xxx.png。<br><br>以上环境都弄好后， 你进到Applications页面里就能看见自己的应用程序了。<br><br>在
qtopia1.7版本里对图标文件的处理略有不同， 默认的图标搜索主要是两个位置，一个是内嵌图标，
也就是用qembed工具生成的inlinepics_p.h， 另外 就是pics目录下的文件。
如果在inline头文件里没有找到对应的图标数组，则会在pics目录下搜索。 其他好像差不多。<br><br><br><span style="color: blue;"><strong>如何设置Qtopia的字体?</strong></span><br>2.x系列版本在运行时的$HOME/Settings/下有个qpe.conf文件， 其中的[Apperance]下的FontFamily字段设置字体， FontSize设置字号。 <br><br>Qtopia
和Qte程序都会在运行时的$QTDIR/lib/fonts目录里搜索字体， 所以你要用的字体也要放在这个地方。
另外还要根据需要修改该目录下的fontdir文件。这个文件是字体(FontFamily, FontSize...)与实际的字体文件的映射，
要写正确才能找到字体文件， 所以不可马虎。<br><br><span style="color: blue;"><strong>为什么QtEmbedded自带的例子无法编译通过?</strong></span><br>在编译例子的时候经常会出现这样的提示信息，无法编译：<br>&#8220;#make<br>Some of the required modules (full-config) are not available.<br>Skipped.&#8221;<br><br>这是怎么回事呢？<br>我想大家应该知道qte的库可以通过修改qconfig来增删一些特性吧， 也就是说通过定义一些宏可以去掉qte库包含的class定义，以减小qte库的大小。 所以说不同的config下编译出来的qte库多数情况下是不兼容的。 <br><br>大家可以从该例子的.pro文件中获得一些信息（比如aclock这个例子），在pro文件中往往会有这么一行：<br>REQUIRES+=full-config<br>这
句话表明，这个qte应用用到的类只有在full-config才能满足。 所以如果你用的是别的config选项干脆就不让你编译。
如果你非要编译也不是不可能，把这个限制去掉重新生成Makefile就可以了，不过很可能会出现undefined
reference或者找不到类之类的错误， 大家要做好心理准备......<br><br>要想成功编译qte的例子还有个方法是用-qconfig all参数configure QtEmbedded， 这样qte库包含所有的特性， 肯定什么例子都能编过去。<br><br><span style="color: blue;"><strong>如何裁减QtEmbedded库?</strong></span><br>QtEmbedded定义了一系列的features， 用<br>#ifndef NO_XXX<br>#endif<br>的方式把特性相关的代码包围在特定的宏里，这样如果定义了某个NO_XXX的宏，就是去掉了该特性， 从而达到减少编译的代码，进而减小libqte的大小的目的。<br><br>你
在configure qte的时候有一个-qconfig xxx参数， 这个xxx指定的是包含features宏的头文件，
比如qtopia里带的qconfig-qpe.h就是专门为qtopia量身定制的宏定义文件，
该文件里去掉了qtopia未用到的feature(如打印等)。如果configure时不指定-qconfig参数，则会提示你从qte预先定义好的
qconfig中选择一个，如small/large/full， 这三项对应不同的qconfig-xxx文件，
每个文件包含不同的feature定义。 具体的位置在:$QTEDIR/src/tools/qconfig-xxx.h<br><br>我们要裁减qte库最好是建立一个自己的qconfig-myconfig.h文件， 把自己的程序未用到的特性对应的宏定义在这个文件里。 configure qte的时候加-qconfig myconfig选项，这样就可以使用自己的feature定义文件了。<br><br>另外需要注意的一点是， feature之间有依赖关系，你disable某个特性很可能连带其他一些特性也被disable。 所以还要参看$QTEDIR/src/tools/qfeatures.h中对feature依赖关系的描述。<br><br>feature宏对应的功能参见文档：<br><a  href="http://doc.trolltech.com/qtopia2.0/html/features.html" target="_blank">http://doc.trolltech.com/qtopia2.0/html/features.html</a><br><br>Good Luck！<br><br><br><span style="color: blue;"><strong>如何改变qvfb桌面的默认颜色（绿色）?</strong></span><br>qte 2.x里提供的API：<br>QWSServer::setDesktopBackground(const QColor&amp;);<br>QWSServer::setDesktopBackground(const QImage&amp;);<br><br>qtopia core 4里提供的API:<br>QWSServer::setBackground(const QBrush&amp;);<br><br>默认的颜色在源码的qwindowsystem_qws.cpp文件， QWSServer的构造函数里赋值，也可以直接去修改源码。<img src ="http://www.cppblog.com/tommyyan/aggbug/92896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-08-11 14:13 <a href="http://www.cppblog.com/tommyyan/articles/92896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vivi的配置与编译</title><link>http://www.cppblog.com/tommyyan/articles/83351.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Tue, 19 May 2009 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/83351.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/83351.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/83351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/83351.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/83351.html</trackback:ping><description><![CDATA[<div>今天主要学习了vivi，当然，这是个入门级别的bootloader，但通过分析vivi来学习uboot是一个非常好的选择，vivi的配置仿照 kernel的配置，所以也可以作为配置kernel的入门材料，至于vivi的一些启动过程这里就不做详细的解释了，这里只对vivi的配置中的一些选项做一下解析。</div>
<div><br>make menuconfig <br>出现的菜单主要有以下一些选项：</div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>System Type ---&gt;&nbsp; 【系统配置：主要设置芯片、平台类型&nbsp;底层启动选项等】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>General setup---&gt;&nbsp;【通用设置：vivi基地址、系统缓存、电源管理等 】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Private Data ---&gt;&nbsp; 【私有数据设置：vivi的私有数据 启动的一些用户私有数据】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Serial Port&nbsp; ---&gt;&nbsp;&nbsp; 【串口：是否支持串口（vivi只支持串口，怎么敢不选），串口传输协议】&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Memory Technology Devices(MTD)--&gt;&nbsp; 【存储设备相关选项】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Add Built-in Commands&nbsp; ----&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【vivi支持命令】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>System hacking&nbsp; ----&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【系统调试相关选项】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Debugging messages&nbsp;&nbsp; ---&gt;&nbsp;&nbsp;&nbsp; 【调试信息相关】&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>----&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#0000ff>Load and Alternate Configuration File&nbsp; 【载入配置文件，vivi自带一个sdmk的配置文件】&nbsp; </font></div>
<div><font style="BACKGROUND-COLOR: rgb(118,118,118)" color=#0000ff><font style="BACKGROUND-COLOR: rgb(255,255,255)">Save Configuration to an Alternate File&nbsp; 【保存自己的配置信息】<br></font></font><font style="BACKGROUND-COLOR: rgb(118,118,118)"></font></div>
<div>下边一一详解。<br></div>
<div></div>
<div>system type: </div>
<div>这里有连个选项，非常的简单，就是选择我们的arm芯片的类型，我这里使用的是s3c2410,<br>所以在arm system type 中选择 s3c2410-based.<br>这里还有一个implementation选项，这个选项主要选择一些平台的其他信息，这里需要知道一个简单smdk</div>
<div>Symbol Mobility Developer Kit (SMDK) ，通用移动设备开发套件，现在很多的s3c2410的板子都属于这个，所以要选择这个，如果不是的话，可能vivi就不能满足你的bootloader的要求了，可以选择uboot，这里有一些关于启动的选项，我这里是只有一块nand flash,所以选择nand boot.<br><br><font color=#0000ff>(S3C2440-based)&nbsp;&nbsp; ARM System&nbsp; type&nbsp;&nbsp;</font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; SA1100&nbsp;&nbsp; &#8211;&nbsp;&nbsp; based&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; PXA250/210&nbsp;&nbsp; &#8211;&nbsp;&nbsp; based&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //英特尔Xscale arm芯片</font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; S3C2400&nbsp;&nbsp; &#8211;&nbsp;&nbsp; based&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //三星公司arm芯片</font></div>
<div><font color=#0000ff>&nbsp; (&nbsp; )&nbsp;&nbsp; S3C2410&nbsp;&nbsp; &#8211;&nbsp;&nbsp; based&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //三星公司arm芯片</font></div>
<div><font color=#0000ff>&nbsp; ( )&nbsp;&nbsp; S3C2440&nbsp;&nbsp; &#8211;&nbsp;&nbsp; based&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//三星公司arm芯片</font></div>
<div><font color=#0000ff>&nbsp; Implementations&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动位置&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (SMDK)&nbsp;&nbsp;&nbsp; Platform&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (x)SMDK&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )MPORT3&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )MPORT1&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [ ]Support&nbsp;&nbsp; NAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Boot 支持NAND启动&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]Support&nbsp;&nbsp; AMD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Boot 支持AMD启动&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; &#8211;&nbsp;&nbsp; Low&nbsp;&nbsp; Level&nbsp;&nbsp; Hardware Debugging&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //底层调试（硬件级）&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]Enable&nbsp;&nbsp; simple&nbsp;&nbsp; memory&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //简单的存储器测试&nbsp;&nbsp; <br></font></div>
<div>关于通用配置，不知道是什么问题，在我的机器上如果加入support&nbsp;reset handler,会编译出错，只能取消这个选项了，关于缓存，这里不太明白，需要请下昊昱，</div>
<div>&nbsp;</div>
<div><font color=#0000ff>General&nbsp;&nbsp; Setup //通用设置&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Define&nbsp;&nbsp; TEXT&nbsp;&nbsp; Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义text段地址&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (0)&nbsp;&nbsp; vivi&nbsp;&nbsp; base&nbsp;&nbsp; address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//vivi基地址&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>[&nbsp;&nbsp; ]&nbsp;&nbsp; support&nbsp;&nbsp; reset&nbsp;&nbsp; handler&nbsp;&nbsp;&nbsp; //支持复位处理，可以不选，一般平台都有硬件复位。&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; &#8211;&nbsp;&nbsp; CACHE&nbsp;&nbsp; Enable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //缓存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; I&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Cache&nbsp;&nbsp; on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //指令缓存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; D&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Cach&nbsp;&nbsp; on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //数据缓存&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; &#8211;&nbsp;&nbsp; Power&nbsp;&nbsp; Management //电源管理&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; power&nbsp;&nbsp; management&nbsp;&nbsp;&nbsp; //支持电源管理&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Others&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Display&nbsp;&nbsp; progress&nbsp;&nbsp; bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //显示进度&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; MD5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持MD5&nbsp;&nbsp; </font></div>
<p><font color=#0000ff><font color=#000000>私有数据选项中，具体的现象含义还不知道，等研究完vivi的源码在补充吧，但这里需要支持的是，这里的选项是和用户有关的，那么这些数据是非必须的，推荐全选。</font><br></font><br><font color=#0000ff>Private&nbsp;&nbsp; Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //专用数据&nbsp;&nbsp; </font></p>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; VIVI&nbsp;&nbsp; private&nbsp;&nbsp; data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持vivi专用数据&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Parse vivi private data from&nbsp; MTD //从MTD上解析vivi专用数据&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Use user&#8211;define&nbsp; parameter block&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用用户设定参数块&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Enable&nbsp;&nbsp; debugging&nbsp;&nbsp; messages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开调试信息</font>&nbsp;&nbsp; </div>
<div>&nbsp;</div>
<div>现在到了vivi最为中要的地方了，串口相关的设计，我们知道原版的vivi只能通过串口进行数据的传输，当然不包括现在网上流传的一些改进版的vivi了，由于vivi只支持串口进行数据的传输，所以速度非常的慢，你可以想象下，如果你的跟文件系统有10M，而串口的速度一般不会超过 10K/s，算算要多长时间才能传完你的根文件系统，但让，vivi也自动了一个很方便的工具那就是imagewrite，但前提是你有一个已经可以运作的linux才能使用imagewrite,至少你第一次少文件系统的时候需要半个多小时的等待吧。</div>
<div><font color=#0000ff>Serial&nbsp;&nbsp; Port&nbsp;&nbsp;&nbsp; //串口&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Serial&nbsp;&nbsp; Port&nbsp;&nbsp; (UART)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //support 串口支持&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; serial&nbsp;&nbsp; terminal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持串口终端&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; EXTENDED)User&nbsp;&nbsp; interface&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用户界面&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )STANDARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标准&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )EXTENDED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //扩展&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; Default&nbsp;&nbsp; prompt&nbsp;&nbsp; &#8220;vivi&#8221;&nbsp;&nbsp; //默认的提示信息:"vivi"， </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ports&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //端口&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; UART&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持UART0&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; UART&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持UART1&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; UART&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持UART2&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; UART&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持UART3&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Transfer&nbsp;&nbsp; Protocol&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //传输协议&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; X&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Modem //支持&nbsp;&nbsp; X&nbsp;&nbsp; Modem&nbsp;&nbsp; 传输&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; Y&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Modem //支持&nbsp;&nbsp; Y&nbsp;&nbsp; Modem&nbsp;&nbsp; 传输&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Support&nbsp;&nbsp; Z&nbsp;&nbsp; &#8211;&nbsp;&nbsp; Modem //支持&nbsp;&nbsp; Z&nbsp;&nbsp; Modem&nbsp;&nbsp; 传输&nbsp;&nbsp;<br><br></font>下边，我们开始存储器管理部分，这部分是比较麻烦一些的。<br><font color=#0000ff>Memory&nbsp;&nbsp; Technology&nbsp;&nbsp; Devices&nbsp;&nbsp; (MTD) //存储器设备种类&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Memory&nbsp;&nbsp; Technology&nbsp;&nbsp; Devices&nbsp;&nbsp; (MTD)&nbsp; // support 支持存储器&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Debugging&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调试&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; NOR&nbsp;&nbsp; Flash&nbsp;&nbsp; chip&nbsp;&nbsp; drivers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Nor Flash 芯片驱动&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; NOR&nbsp;&nbsp; Device&nbsp;&nbsp; Support&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持 Nor Flash 设备&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp;[ ] Detect flash chips by Common Flash Interface (CFI) //probe 检测 CF 接口&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp; ] Flash chip&nbsp;&nbsp; driver&nbsp;&nbsp; advanced&nbsp;&nbsp; configuration&nbsp;&nbsp; options&nbsp;&nbsp; (NEW)&nbsp;&nbsp;&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>//高级的闪存设置选项&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; ) Flash cmd/query data swapping //设置查看FLASH上的数据的字节序&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; NO&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; BIG_ENDIAN_BYTE&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; (&nbsp;&nbsp; )&nbsp;&nbsp; LITTLE_&nbsp;&nbsp; ENDIAN_BYTE&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Specific CFI Flash geometry&nbsp; selection&nbsp; (NEW)&nbsp;&nbsp; //特殊的CF选择&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 8-bit&nbsp;&nbsp; buswidth&nbsp;&nbsp; (NEW)&nbsp;&nbsp;&nbsp; //支持8位总线宽度&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 16-bit&nbsp;&nbsp; buswidth&nbsp;&nbsp; (NEW) //支持16线宽度&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 32-bit&nbsp;&nbsp; buswidth&nbsp;&nbsp; (NEW) //支持32线宽度&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 64-bit&nbsp;&nbsp; buswidth&nbsp;&nbsp; (NEW) //支持64线宽度&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 1-chip&nbsp;&nbsp; flash&nbsp;&nbsp; interleave&nbsp;&nbsp; (NEW) //支持1片闪存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 2-chip&nbsp;&nbsp; flash&nbsp;&nbsp; interleave&nbsp;&nbsp; (NEW) //支持2片闪存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 4-chip&nbsp;&nbsp; flash&nbsp;&nbsp; interleave&nbsp;&nbsp; (NEW) //支持4片闪存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; 8-chip&nbsp;&nbsp; flash&nbsp;&nbsp; interleave&nbsp;&nbsp; (NEW) //支持8片闪存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Support&nbsp;&nbsp; for&nbsp;&nbsp; Intel/Sharp&nbsp;&nbsp; flash&nbsp;&nbsp; chips //支持Intel或harp&nbsp;&nbsp; 的闪存&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] Older&nbsp;&nbsp; (theoretically&nbsp;&nbsp; obsoleted&nbsp;&nbsp; now)&nbsp;&nbsp; deivers&nbsp;&nbsp; for&nbsp;&nbsp; non-CFI&nbsp;&nbsp; chips&nbsp; //不支持CFI芯片的旧设备。&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] AMD&nbsp;&nbsp; compatible&nbsp;&nbsp; flash&nbsp;&nbsp; chip&nbsp;&nbsp; support&nbsp;&nbsp; (non-CFI) //支持AMD兼容闪存（无cfi）&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; Mapping&nbsp;&nbsp; drivers&nbsp;&nbsp; for&nbsp;&nbsp; chip&nbsp;&nbsp; access&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Flash&nbsp;&nbsp; device&nbsp;&nbsp; mapped&nbsp;&nbsp; on&nbsp;&nbsp; S3C2410&nbsp;&nbsp; //S3C2410上的&nbsp;&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>NAND&nbsp;&nbsp; Flash&nbsp;&nbsp; Device&nbsp;&nbsp; Drivers NAND闪存设备驱动&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Enable&nbsp;&nbsp; ECC&nbsp;&nbsp; correction&nbsp;&nbsp; algorithm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ECC修正算法&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; Verify&nbsp;&nbsp; NAND&nbsp;&nbsp; page&nbsp;&nbsp; writes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //NAND页写入校验&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; SMC&nbsp;&nbsp; Device&nbsp;&nbsp; Support&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持SMC设备&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; bonfs&nbsp;&nbsp; support&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //支持bonfs<br><br><font color=#000000>这里是选择vivi支持的命令，part是flash分区相关的命令，可以show save del 等<br>param 是设置一些启动参数。amd这条命令在我的实验板上编译不通过，只能取消它。</font><br><br>Add&nbsp;&nbsp; Built&nbsp;&nbsp; &#8211;&nbsp;&nbsp; in&nbsp;&nbsp; Command&nbsp;&nbsp;&nbsp;&nbsp; //内部命令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; men&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存储器指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ] mem&nbsp;&nbsp; test&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存储器测试指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; param&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //参数指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; part&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //退出指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; bon&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //分区指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; sleep&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //停顿指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; prompt&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //提示指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; built-in&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //内部指令&nbsp;&nbsp; </font></div>
<div><font color=#0000ff>&nbsp; [&nbsp;&nbsp; ]&nbsp;&nbsp; amd&nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初期指令&nbsp;&nbsp; <br><font color=#000000>基本的配置就这些，这里参考了：<a href="http://sns.linuxpk.com/space-1717-do-blog-id-15328.html"><u><font color=#0000ff>http://sns.linuxpk.com/space-1717-do-blog-id-15328.html</font></u></a><br></font></font></div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div><font color=#0000ff><font color=#000000>在配置完vivi后，生成Makefile后，还不能正常的编译，这里需要做一些修改。下边是一个Makefile文件需要修改的地方：<br></font><br></font></div>
</blockquote><font color=#0000ff></font>
<div></div>
<div></div>
<div></div>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><font color=#006666>LINUX_INCLUDE_DIR&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">=</span> /usr/local/arm/2.95.3/include/<br>CROSS_COMPILE <span style="COLOR: rgb(0,0,204)">=</span> /usr/local/arm/2.95.3/bin/arm-linux-<br>ARM_GCC_LIBS&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">=</span> /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3</font></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>需要注意的是，vivi-20030629.tar.bz2这般的vivi只支持编译器为2.95.3,这是在嵌入式开发当中经常遇到的问题，如果 Makefile没有问题，而编译又不能正常进行，首先需要想到的就是编译器的版本问题，这个版本的vivi使用3.4.1的编译器是不能正常编译的，应为我们要把vivi放到arm平台上运行，所以需要把arm相关的库文件，这就需要在Makefile中制定这些库文件存储的地方。做完这些，基本上就可以了。<br><br>&nbsp;&nbsp; 我们在看看vivi中关于flash的分区，在vivi中受用part show，可以看到有一下几个分区： vivi&nbsp; param kernel&nbsp; root&nbsp; usr ,这些分区信息定义在下边的结构体当中：</p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"><br>&nbsp; vivi/arch/s3c2410/smdk.c</span></span></code></p>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"><br>#</span><span style="COLOR: rgb(255,0,0)">ifdef</span> CONFIG_S3C2410_NAND_BOOT<br>mtd_partition_t default_mtd_partitions<span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"vivi"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00020000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"param"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00020000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00010000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"kernel"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00030000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000C0000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"root"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00100000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00140000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MF_BONFS<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><br><span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">;</span><br><span style="COLOR: rgb(0,0,204)">#</span><span style="COLOR: rgb(255,0,0)">endif</span><br><span style="COLOR: rgb(0,0,204)">#</span><span style="COLOR: rgb(255,0,0)">ifdef</span> CONFIG_S3C2410_AMD_BOOT<br>mtd_partition_t default_mtd_partitions<span style="COLOR: rgb(0,0,204)">[</span><span style="COLOR: rgb(0,0,204)">]</span> <span style="COLOR: rgb(0,0,204)">=</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"vivi"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00020000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"param"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00020000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00010000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"kernel"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00030000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000C0000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">,</span> <span style="COLOR: rgb(0,0,204)">{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"root"</span><span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00100000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00140000<span style="COLOR: rgb(0,0,204)">,</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag<span style="COLOR: rgb(0,0,204)">:</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MF_BONFS<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">}</span><br><span style="COLOR: rgb(0,0,204)">}</span><span style="COLOR: rgb(0,0,204)">;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>在上边的分区表可以看出，这些分区在flash中成线性排列的。这样，这里的这些数据是mizi公司推荐使用smdk开发板的用户的数据，当然可以根据自己的需要来修改各个分区的大小了。这里的offset是相对于flash起始地址0而言，自己的相对地址，其实就是实际地址，而size就是这个分区实际占据的大小了。 <br>vivi的使用在这里就告一段落了，更多的细节就需要看vivi的源码了。</p>
<img src ="http://www.cppblog.com/tommyyan/aggbug/83351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-19 10:55 <a href="http://www.cppblog.com/tommyyan/articles/83351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vivi的Makefile文件解析</title><link>http://www.cppblog.com/tommyyan/articles/83350.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Tue, 19 May 2009 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/83350.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/83350.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/83350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/83350.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/83350.html</trackback:ping><description><![CDATA[<div>这段时间学习的压力要小的多，处理做LFS外，还编译了vivi，vivi是mizi公司一款bootloader，总体说了，这是一个轻量级的bootloader，代码的规模比较小，非常适合用于学习研究，不想uboot，万行的代码，不是那么容易读的，同时，vivi还有一个优点，就是它的Makefile文件结构，完全是仿照kernel的Makefile，所以，学习vivi的Makefile是很有价值的，可以从vivi的 makefile看出，很多的Makefile是直接从kernel的文件中的粘贴过来的。废话不说了，我们开始解析下vivi的Makefile文件吧。</div>
<div>&nbsp; 首先需要看一些vivi的文件组织形式：</div>
<div>
<table style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>|-- COPYING&nbsp; //这是一个GPL文件<br>|-- CVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //这是一个版本控制软件的文件夹<br>|-- Documentation&nbsp; //相关说明文档<br>|-- Makefile&nbsp;&nbsp;&nbsp;&nbsp; //Makefile文件<br>|-- Rules.make&nbsp;&nbsp; //Makefile通用规则<br>|-- arch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //与平台板卡相关的文件<br>|-- drivers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //驱动文件<br>|-- include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //头文件<br>|-- init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 系统初始化文件<br>|-- lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //库文件<br>|-- scripts&nbsp;&nbsp; //一些vivi的配置脚本，同时包含有menuconfig的源代码<br>|-- util&nbsp;&nbsp;&nbsp; //二进制工具，这里有两个工具：imagewrite 和ecc</font></td>
        </tr>
    </tbody>
</table>
</div>
<p>上边就是vivi的文件组织结构，有一些文件是与编译无关的，一些说明文档、版本控制文件以及其他一些文件，我们把不需要的文件删除，util这里边的工具用在其他的地方，可以选择性的编译，但这些文件是与vivi的编译无关的，当然，GPL协议是非常重要的，这里不是说GPL不重要，删除只是为了列举与vivi编译有关的文件。下边是精简的文件组织形式：</p>
<p>
<table style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>|-- Makefile&nbsp;&nbsp; //主Makefile<br>|-- Rules.make&nbsp;&nbsp; //通用Makefile规则<br>|-- arch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //与平台板卡相关的文件<br>|-- drivers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //驱动文件<br>|-- include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //头文件<br>|-- init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化文件<br>|-- lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //库文件<br>|-- scripts&nbsp;&nbsp;&nbsp; //配置脚本与menuconfig的源码</font></td>
        </tr>
    </tbody>
</table>
</p>
<div>我们来分析下vivi从配置到最后生成的总体流程：</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make menuconfig&nbsp;或者 make config 或者 make oldconfig</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |||||</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \&nbsp;&nbsp;&nbsp; /</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成 vivi/.config文件【保存了配置文件】</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后make ,这时候make根据.config的内容进行编译。</div>
<div>这里我们感兴趣的是执行make menuconfig后，出现的图形化菜单选项是怎么完成这个功能的，其实，mizi公司的程序是直接仿照kernel的形式，实质就是COPY过来的。&nbsp; 具体的过程是这样的，当执行make menuconfig ,首先 进入到scripts/lxdialog文件下，用gcc编译一个 menuconfig程序出来，这就是为什么在你输入make menuconfig的时候，会打印出来如下的内容：</div>
<div>&nbsp;</div>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>make -C scripts/lxdialog all<br>make[1]: Entering directory `/tmp/vivi/scripts/lxdialog' # 跳转入目录<br>make[1]: Leaving directory `/tmp/vivi/scripts/lxdialog' # 编译完后，离开目录<br>bin/sh scripts/Menuconfig arch/config.in #执行<font face=新宋体>lxdialog</font> arch/config.in <br>Using defaults found in .config<br>Preparing scripts: functions, parsing.............done.</font></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
它首先是跳转如scripts/lxdialog文件夹下，然后进行编译，生成<font face=新宋体 color=#0000ff>lxdialog</font>的可执行文件，这个主要用于构建可视化图形界面，具体的功能这里不做详细介绍了，这样，编译生成<font face=新宋体 color=#0000ff>lxdialog后，&nbsp; <font color=#000000>这个可执行文件和menuconfig脚本的相互配合下就可以进行配置了，同时需要说明的时，在图形化配置中，会出现很多的菜单化选项，那么这些菜单化选项是否可以更改，当然是可以的，如果你够仔细，就会发现，在vivi真个目录中，有很多的config.in文件，这些文件就存储了这些的菜单选项，只要修改这些文件就可以任意的添加自己的选项了，这里对这些的菜单配置文件做一些简要的说明。 </font></font>
<div>在arch/config.in中的文件内容：</div>
<div>&nbsp;</div>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)">choice 'ARM system type' \<br>&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"SA1100-based&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_ARCH_SA1100 \<br>&nbsp;&nbsp;&nbsp;PXA250/210-based&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_ARCH_PXA250 \<br>&nbsp;&nbsp;&nbsp;S3C2400-based&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_ARCH_S3C2400 \<br>&nbsp;&nbsp;&nbsp;S3C2410-based&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_ARCH_S3C2410"</span><br><br>mainmenu_option next_comment<br>comment 'Implementations'<br>if [ <span style="COLOR: rgb(255,0,255)">"$CONFIG_ARCH_SA1100"</span> = <span style="COLOR: rgb(255,0,255)">"y"</span> ]; then<br>&nbsp;&nbsp;choice 'Platform' \<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,0,255)">"KINGS&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_KINGS \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FORTE&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_FORTE \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUNS&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_SUNS \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUNS_OLD&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_SUNS_OLD \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GILL&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_GILL \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENDA&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_ENDA \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXILIEN102&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_EXILIEN102 \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WISMO&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SA1100_WISMO"</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
这里只截取了一小部分， 这些脚本都是相似的，如果感兴趣可以自己去打开看看，相似的脚本还出现在/driver/mtd&nbsp; driver/mtd/nand driver/mtd/nor driver/mtd/maps&nbsp; driver/serial等文件夹下，这些是和kernel的菜单化配置一样的，都是直接copy过来，给我们一个提示：<br>
<table style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" align=center>
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;<font face=黑体 color=#ff0000 size=3> 学习的第一层是优秀的模仿，学会模仿也是一种学习能力。</font></td>
        </tr>
    </tbody>
</table>
<p>通过上边的操作，我们认为所有的配置已经完成了，应该开始编译工作了，至于编译的流程需要我们看看makefile文件。由于Makefile文件比较长，不方便全部贴在这里。我们分段进行分析。</p>
<table style="BORDER-COLLAPSE: collapse" borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: rgb(0,0,0)"><font color=#0000ff>VERSION = 0<br>PATCHLEVEL = 1<br>SUBLEVEL = 4<br><br>VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)<br><br>ARCH <span style="COLOR: rgb(0,0,204)">:</span><span style="COLOR: rgb(0,0,204)">=</span> arm<br><br>CONFIG_SHELL <span style="COLOR: rgb(0,0,204)">:</span><span style="COLOR: rgb(0,0,204)">=</span> $(shell if [ -x <span style="COLOR: rgb(255,0,255)">"$$BASH"</span> ]; then echo $$BASH; \<br>&nbsp;&nbsp;&nbsp;&nbsp;else if [ -x /bin/bash ]; then echo /bin/bash; \<br>&nbsp;&nbsp;&nbsp;&nbsp;else echo sh; fi ; fi)<br>TOPDIR&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,204)">:</span><span style="COLOR: rgb(0,0,204)">=</span> $(shell /bin/pwd)<br><br>#<br># change this to point to the Linux <span style="COLOR: rgb(0,0,255)">include</span> <span style="COLOR: rgb(0,0,255)">directory</span><br>#<br>LINUX_INCLUDE_DIR&nbsp;&nbsp;&nbsp;&nbsp;= /usr/local/arm/2.95.3/<span style="COLOR: rgb(0,0,255)">include</span><span style="COLOR: rgb(0,0,255)">/</span><br><br><br>VIVIPATH = $(TOPDIR)/<span style="COLOR: rgb(0,0,255)">include</span><br><br>HOSTCC = gcc<br>HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer<br><br>CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-<br>#CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-redhat-linux-<br><br>#<br># <span style="COLOR: rgb(0,0,255)">Include</span> the make variables (CC<span style="COLOR: rgb(0,0,204)">,</span> etc...)<br>#<br><br>AS = $(CROSS_COMPILE)as<br>LD = $(CROSS_COMPILE)ld<br>CC = $(CROSS_COMPILE)gcc<br>CPP = $(CC) -E<br>AR = $(CROSS_COMPILE)ar<br>NM = $(CROSS_COMPILE)nm<br>STRIP = $(CROSS_COMPILE)strip<br>OBJCOPY = $(CROSS_COMPILE)objcopy<br>OBJDUMP = $(CROSS_COMPILE)objdump<br>MAKEFILES = $(TOPDIR)/.config<br>MD5SUM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= md5sum<br>PERL = perl<br>AWK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= awk<br><br>export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONFIG_SHELL TOPDIR VIVIPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \<br>&nbsp;&nbsp;&nbsp;&nbsp;CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES MD5SUM PERL AWK</font></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p># 版本号&nbsp; 在生成的vivi中，开头的版本号就是有这个地方的变量来决定</p>
<p>VERSION = 0<br>PATCHLEVEL = 1<br>SUBLEVEL = 4&nbsp;&nbsp; </p>
<p># VIVI 这里设置输出版本信息的格式。<br>VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)</p>
<p>#&nbsp; "：=" 与"="的区别： &#8221;：=&#8220;为直接展开，&#8221;=&#8220;为递归展开，详细内容看GNU make中文手册6.2.2<br># &#8221;：=&#8220;在此处会定义一个变量，直接对其赋值，对于引用会直接找到引用的源，表示立即展开<br>#&#8221;：&#8220;只是简单的替换，不会直接找到引用的源，在以后，如果引用的源发生变化，此处的变量也会发生变化。表示递归展开<br>#########&nbsp; 举例&nbsp; #########&nbsp; <br>#<br># VAR1=TMP1;<br># TMP=$(VAR1) <br>#&nbsp; VAR1=TMP2<br># TMP1:=$(VAR1) <br>#ECHO $（TMP）&nbsp; ===&gt;显示 TMP2<br>#ECHO $（TMP1）===&gt;显示 TMP1<br>#<br>#ARCH是定义体系结构， VIVI此处的定义是说明该VIVI是针对ARM平台 <br>ARCH := arm</p>
<p><br># 这里一处make函数的调用，该函数为shell，该行语句的主要作用是设置shell命令解释器<br>#这条命令的作用是执行函数把结果给变量<br>#make函数的调用语法为：$()或者${} <br>#shell函数的作用是&#8221;执行命令，把命令的执行结果作为变量的内容&#8220;<br>#COMFIG_SHELL&nbsp; 指定命令解释器<br>CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \<br>&nbsp;else if [ -x /bin/bash ]; then echo /bin/bash; \<br>&nbsp;else echo sh; fi ; fi)<br># 设置当前顶层目录， 该Makefile所在目录&nbsp; shell函数的用法，把命令pwd的结果赋值给TOPDIR<br>TOPDIR&nbsp;:= $(shell /bin/pwd)</p>
<p>#<br># change this to point to the Linux include directory<br>#&nbsp; 指定LINUX内核的INCLUDE目录，在vivi中，没有起作用，可以删除该语句<br>#<br>LINUX_INCLUDE_DIR&nbsp;= /usr/local/arm/2.95.3/include/</p>
<p># 指定vivi的头文件所在目录<br>#<br>VIVIPATH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(TOPDIR)/include</p>
<p># 定义本地的编译器 这里指定编译器为gcc<br>HOSTCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = gcc<br>#定义本地的编译器的编译参数，vivi的编译需用使用arm-linux-gcc（交叉编译器），那么定义gcc有什么作用？<br>#解答： 在一次使用make menuconfig的时候，需要使用gcc编译menuconfig选项程序，只为配置服务。<br>#跳转到scripts/lxdialog <br>#执行该目录下的make all <br># make menuconfig :::----&gt;&gt;<br>###跳转到scripts/lxdialog <br>###执行该目录下的make all <br>###make -C scripts/lxdialog all<br>###make[1]: Entering directory `/tmp/vivi/scripts/lxdialog' # 跳转入目录<br>###make[1]: Leaving directory `/tmp/vivi/scripts/lxdialog'&nbsp; # 编译完后，离开目录<br>###/bin/sh scripts/Menuconfig arch/config.in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #执行Menuconfig arch/config.in&nbsp;&nbsp; <br>###Using defaults found in .config<br>###Preparing scripts: functions, parsing.............done.</p>
<p>HOSTCFLAGS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer</p>
<p><br>#定义交叉编译器的路径，要注意一些公认的定义方法，一般CROSS_COMPILE就是交叉编译器 ARCH就是于体系结构相关的<br>CROSS_COMPILE&nbsp;&nbsp; = /usr/local/arm/2.95.3/bin/arm-linux-<br>#CROSS_COMPILE&nbsp;&nbsp; = /opt/host/armv4l/bin/armv4l-redhat-linux-</p>
<p>#<br># Include the make variables (CC, etc...)<br>#&nbsp; 定义工具链 tools chains <br># <br>AS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)as<br>LD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)ld<br>CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)gcc<br>CPP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CC) -E<br>AR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)ar<br>NM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)nm<br>STRIP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)strip<br>OBJCOPY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)objcopy<br>OBJDUMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(CROSS_COMPILE)objdump<br>MAKEFILES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $(TOPDIR)/.config<br>#MD5&nbsp; <br>MD5SUM&nbsp;&nbsp;= md5sum<br># PERL&nbsp;&nbsp; 脚本<br>PERL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = perl<br>AWK&nbsp;&nbsp;= awk<br># 导出前边定义的变量 主要是因为主makefile需要调用很多子makefile，<br># 这样导出后，就可以让子makefile使用这些以前定义的变量了。<br>export&nbsp; VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONFIG_SHELL TOPDIR VIVIPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \<br>&nbsp;CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES MD5SUM PERL AWK<br># 定义就宣告结束了<br>#下边是具体的编译规则</p>
<img src ="http://www.cppblog.com/tommyyan/aggbug/83350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-19 10:53 <a href="http://www.cppblog.com/tommyyan/articles/83350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式Linux的GDB远程调试的实现</title><link>http://www.cppblog.com/tommyyan/articles/83349.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Tue, 19 May 2009 02:35:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/83349.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/83349.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/83349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/83349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/83349.html</trackback:ping><description><![CDATA[<div><font color=#8b0000>远程调试环境由宿主机GDB和目标机调试stub共同构成，两者通过串口或TCP连接。使用 GDB标准远程串行协议协同工作，实现对目标机上的系统内核和上层应用的监控和调试功能。调试stub是嵌入式系统中的一段代码，作为宿主机GDB和目标机调试程序间的一个媒介而存在。<br>就目前而言，嵌入式Linux系统中，主要有三种远程调试方法，分别适用于不同场合的调试工作：用ROM Monitor调试目标机程序、用KGDB调试系统内核和用gdbserver调试用户空间程序。这三种调试方法的区别主要在于，目标机远程调试stub 的存在形式的不同，而其设计思路和实现方法则是大致相同的。<br>而我们最常用的是调试应用程序。就是采用gdb+gdbserver的方式进行调试。在很多情况下，用户需要对一个应用程序进行反复调试，特别是复杂的程序。采用GDB方法调试，由于嵌入式系统资源有限性，一般不能直接在目标系统上进行调试，通常采用gdb+gdbserver的方式进行调试。Gdbserver在目标系统中运行，gdb则在宿主机上运行。<br>要进行GDB调试，目标系统必须包括gdbserver程序，宿主机也必须安装gdb程序。一般linux发行版中都有一个可以运行的gdb，但开发人员不能直接使用该发行版中的gdb来做远程调试，而要获取gdb的源代码包，针对arm平台作一个简单配置，重新编译得到相应gdb。gdb的源代码包可以从</font><a href="http://ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/"><font color=#8b0000><u>http://ftp.cs.pu.edu.tw/Linux/sourceware/gdb/releases/</u></font></a><font color=#8b0000>下载，最新版本为gdb-6.4。下载到某个目录，笔者下载到自己的用户目录：/home/vicky。<br>下载完后，进入/home/vicky目录，配置编译步骤如下：<br>#tar jxvf gdb-6.8-tar-bz2<br>#cd gdb-6.8<br>#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v<br>#make<br>#make install<br>#export PATH=$PATH:/usr/local/arm-gdb<br>进入gdbserver目录：<br>#./configure --target=arm-linux &#8211;host=arm-linux<br>#make CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc<br>(这一步要指定arm-linux-gcc的位置，可能跟你的不一样,用2.95.3可能有问题)</font>
<p><font color=darkred>没有错误的话就在gdbserver目录下生成gdbserver可执行文件，把它烧写到开发板flash的根文件系统分区，或通过nfs mount的方式都可以。只要保证gdbserver能在开发板上运行就行。<br>下面就可以用gdb+gdbserver调试我们开发板上的程序了。在目标板上运行gdbserver，其实就是在宿主机的SecureCRT下，我的 red hat linux装在vmware下的。我是在minicom下# mount -o nolock 172.20.223.38:/home /tmp后做的，hello和gdbserver都是位于linux根目录下，把主机根目录挂在到开发板的/tmp目录下。<br>要进行gdb调试，首先要在目标系统上启动gdbserver服务。在gdbserver所在目录下输入命令：<br>(minicom下)<br>#cd /tmp<br>#./gdbserver 172.20.223.38:2345 hello<br>172.20.223.38为主机IP，在目标系统的2345端口开启了一个调试进程，hello为要调试的程序。<br>出现提示：<br>Process /tmp/hello created: pid=80<br>Listening on port 2345 <br>(另一个终端下)<br>#cd /<br>#export PATH=$PATH:/usr/local/arm-gdb/bin<br>#arm-linux-gdb hello<br>(gdb) target remote 172.20.223.111:2345<br>（172.20.223.111为开发板IP）<br>出现提示：<br>Remote debugging using 172.20.223.38:2345<br>[New thread 80]<br>[Switching to thread 80]<br>0x40002a90 in ??()<br>同时在minicom下提示：<br>Remote debugging from host 172.20.223.38<br>(gdb)<br>连接成功，这时候就可以输入各种gdb命令如list、run、next、step、break等进行程序调试了。 <br>以上针对通过nfs mount和tftp的方式，只能在主机上调试好后下载到开发板上运行，如果有错误要反复这个过程，繁琐不说，有些程序只能在开发板上调试。所以笔者采用了gdbserver的远程调试方式。</font></p>
</div>
<img src ="http://www.cppblog.com/tommyyan/aggbug/83349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-19 10:35 <a href="http://www.cppblog.com/tommyyan/articles/83349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ARM Linux 上提供SAMBA服务</title><link>http://www.cppblog.com/tommyyan/articles/83347.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Tue, 19 May 2009 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/83347.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/83347.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/83347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/83347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/83347.html</trackback:ping><description><![CDATA[1.获取source code, http://www.samba.org Samba 3.0.25c<br>2.解压<br>3.运行./configure CC=arm-linux-gcc AR=arm-linux-ar LD=arm-linux-ld RANLIB=arm-linux-ranlib \<br>--build=i386-linux-gnu \<br>--host=arm-linux-gnu \<br>--prefix= \<br>--disable-cups \<br>--disable-iprint \<br>--disable-pie \<br>--disable-fam \<br>--with-ads=no \<br>--with-ldap=no \<br>--with-cifsmount=no \<br>--with-logfilebase=/var/log \<br>--with-libdir=/usr/lib&nbsp; \<br>--with-swatdir=/usr/local/swat \<br>--with-rootsbindir=/sbin \<br>--with-lockdir=/var/lock \<br>--with-piddir=/var/lock \<br>--with-privatedir=/etc/samba \<br>--with-configdir=/etc/samba<br><br>3.make<br><br>4.复制source/bin 目录中的nmbd&nbsp; smbd 到arm中的文件系统中<br>5.在arm文件系统中的/etc/samba中创建smb.conf<br>&nbsp; 1 [global]<br>&nbsp; 2 workgroup = MSHOME<br>&nbsp; 3 server string = %h server (Samba, Ubuntu)<br>&nbsp; 4 netbios name = MYNAME<br>&nbsp; 5 max log size = 1000<br>&nbsp; 6 security = share<br>&nbsp; 7 username map = /etc/samba/smbusers<br>&nbsp; 8 encrypt passwords = true<br>&nbsp; 9 [homes]<br>&nbsp;10 path = /tmp&nbsp; #要共享的目录<br>&nbsp;11 available = yes<br>&nbsp;12 browsable = yes<br>&nbsp;13 public = yes<br>&nbsp;14 writable = yes<br>&nbsp;15 guest ok = yes<br><br>6.运行<br>nmbd -D<br>smbd -D<br>
<img src ="http://www.cppblog.com/tommyyan/aggbug/83347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-19 10:27 <a href="http://www.cppblog.com/tommyyan/articles/83347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交叉开发入门</title><link>http://www.cppblog.com/tommyyan/articles/82594.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Mon, 11 May 2009 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/82594.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/82594.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/82594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/82594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/82594.html</trackback:ping><description><![CDATA[<blockquote>当编译器运行在一个为另一系统产生可执行程序的系统上时，就会出现交叉编译——当目标系统没有编译工具的本地设置时，或者当主机系统更快或具有更多资源时，这是一个重要的概念。在这篇 how-to 文章中，Peter Seebach 讨论了交叉编译环境的初始设置（使用 Sharp Zaurus 手持计算机作为焦点），并且介绍了工具的安装、基本编译、在 Sharp Zaurus 手持计算机上安装程序，以及像创建使用 configure 脚本的程序这样的高级问题。</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>通常，程序是在一台计算机上编译，然后再分布到将要使用的其他计算机上。当主机系统（运行编译器的系统）和目标系统（产生的程序将在其上运行的系统）不兼容时，该过程就叫做 <em>交叉编译</em>。 </p>
<p>除了兼容性这个明显的好处之外，交叉编译还由于以下两个原因而非常重要：</p>
<ol>
    <li>当目标系统对其可用的编译工具没有本地设置时。</li>
    <li>当主机系统比目标系统要快得多，或者具有多得多的可用资源时。</li>
</ol>
<p>在这篇文章中，我将使用手持计算机的 Sharp Zaurus 系列作为焦点，讨论交叉编译环境的初始设置。我将介绍工具的安装、基本编译问题、如何在手持计算机上安装程序，以及像创建使用 <code>configure</code> 脚本的程序这样的高级问题。如果按照文章的组织顺序阅读，您将最大地从本文受益，因为本文类似于一个教程，每一步都以逻辑顺序相连。 </p>
<p>首先，我将给出交叉编译的一个简洁的概览。</p>
<p><a name=1><span class=atitle>理解交叉编译</span></a></p>
<p>如果您熟悉交叉编译环境，则可以跳过这一节。但是如果不了解交叉编译，则请继续往下阅读。</p>
<p>我使用的开发系统是 x86 体系结构的 Linux 系统。我在 SuSE Linux 8.2 上测试了这些指令。测试的目标系统是 Sharp Zaurus SL-5600 和 C700。本文假设您具有 Unix 开发实践的工作背景，并使用过命令行。</p>
<p>正如我前面提到的，当编译器运行在一个为另一个系统产生可执行程序的系统上而且两个系统使用不同的操作环境时就会出现交叉编译。另外，当目标系统不具有它自己的编译工具时，或者当开发者可以平衡主机系统潜在更好的性能或更多的资源时，交叉编译是有用的。</p>
<p>当提到交叉编译器时，我不仅仅是指将一种编程语言的代码转换成对象代码的软件，还指其他必要的开发工具：</p>
<ul>
    <li>一个 <em>汇编器</em>，它是编译器工具链后端的一部分。 </li>
    <li>一个 <em>链接器</em>，它是编译器工具链后端的另一部分。 </li>
    <li>用于处理可执行程序和库的一些基本工具，比如strings。</li>
</ul>
<p>例如，strings 实用工具（它输出对象模块的文本字符串）可能是有用的，但是主机环境版本对目标环境二进制系统并不怎么有用。Zaurus 的交叉开发工具中包含 strings。</p>
<p>在 Zaurus 上本地运行编译器是可能的，但是系统的局限性阻碍有效的工作，这也是使交叉编译为开发者带来福音的另一个原因。典型台式机的显示器和键盘非常有利于编辑工作。另外，台式机的内存、处理器和存储容量也更能满足编译的资源需要。</p>
<p>现在，让我们来安装所需的工具。</p>
<table cellSpacing=0 cellPadding=0 width="40%" 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=5 width="100%" border=1>
                <tbody>
                    <tr>
                        <td bgColor=#eeeeee><a name=IDAALAUH><strong>可用的开发工具</strong></a><br>
                        <p>Java 技术。Zaurus 的两个特定于 Java 的开发工具包含一个关于 Zaurus 的 Java 编程和 ZaurusBuilder 的 PDF 指南。ZaurusBuilder 是一个 JBuilder IDE 插件向导，负责将 Java 应用程序打包成一个 IPK 分布文件以进行安装。Zaurus Java FAQ 回答有关使用 Java 进行Zaurus 开发的问题。 </p>
                        <p><strong>Qt/C++。</strong> Qt 是一个 C++ 工具包，用于为 PDA 创建图形用户界面。这里的产品包括一个 Qtopia 的开放源代码 SDK（一个可移动的应用环境）、一个用于设置和使用 Qt/E（嵌入的 C++ 工具包）和 Qtopia 的 PDF 编程指南，以及免费版本的 Qt/E。 </p>
                        <p><strong>Linux。</strong>Zaurus 源代码是 Embedix Plus 和 Qtopia 环境。Embedix Plus 集成了来自 Lineo 的 Embedix Linux（内核 2.4.x）、来自 Trolltech 的 Qt/Embedded GUI 应用框架、来自 Opera 的 Opera Web 浏览器和来自 Insignia 的 Jeode JVM。还有一篇 how-to 文章，向您展示如何设置 Linux 交叉编译器。另外还有 Zaurus 上的 Linux 命令的开放源代码，以及一个到利用 Linux 对 Zaurus 进行开发的参考资料的链接。 </p>
                        <p><strong>OpenZaurus 项目。</strong>OpenZaurus 项目背后的初始目的是创建一个 ROM 映象（内核 + root 文件系统），这更接近于开发者想要的。该项目使用 Sharp ROM 作为基础，然后再进行改造、修复 bug、添加和减少条目，以使软件包更加开放。OpenZaurus 现在是一个从新从源代码创建的基于 debian 的嵌入式分布。 </p>
                        <p><strong>编译器和其他条目。</strong>Zaurus 开发者有许多免费的和商业的编译器和其他 SDK 可用。想要更改 Zaurus 背景、图标和环境的外观吗？请尝试 themes section。 </p>
                        <p><strong>用户组。</strong>是的，一个用户组，加上它的大量有经验的输入，可以成为一个工具。并且还有一个非官方的 Zaurus 开发 FAQ，其中有许多有用的信息。 </p>
                        <p>在 <a href="http://www.ibm.com/developerworks/cn/linux/wireless/wi-zaurus/index.html#resources"><u><font color=#0000ff>参考资料部分</font></u></a>可以找到到这些资源的链接。 </p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<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/wireless/wi-zaurus/index.html#main"><strong><u><font color=#0000ff>回页首</font></u></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=2><span class=atitle>安装工具</span></a></p>
<ol>
    <li>开始，您必须下载几个软件包。可以从 Sharp 的 Web 站点（在 <a href="http://www.ibm.com/developerworks/cn/linux/wireless/wi-zaurus/index.html#resources"><u><font color=#0000ff>参考资料</font></u></a> 部分有到该站点的链接）得到这些软件包,并且必须下载为 RPM。您需要以下主要的软件包：
    <ul>
        <li><a href="http://www.zaurus.com/dev/tools/downloads/tools/gcc-cross-sa1100-2.95.2-0.i386.rpm"><u><font color=#0000ff>交叉编译器</font></u></a>(gcc)。 </li>
        <li>库(glibc)。 </li>
        <li>包含文件(头文件)。 </li>
        <li>&#8220;其他工具&#8221;——一个包含交叉开发环境中常用工具的软件包。 </li>
    </ul>
    </li>
    <li>接下来，安装 RPM。要做这一点，需要 root 权限。建议的安装方法是为每个文件重复 <code>rpm -Uvh filename.rpm</code> 。
    <p>文件安装在 /opt/Embedix 目录中。该目录有一个稍微不寻常的结构——实际的二进制文件安装在 /opt/Embedix/tools/bin 目录中，具有到安装在 /opt/Embedix/tools/arm-linux/bin 目录中的这些二进制文件的符号链接。例如，/opt/Embedix/tools/arm-linux/bin/gcc 是到 /opt/Embedix/tools/bin/arm-linux-gcc 的一个符号链接。二者都可以使用。</p>
    </li>
    <li>编译一个简单的测试程序，快速测试已经正确地安装了工具。我推荐传统的 "Hello, world!" 程序，这易于测试：
    <p><strong>清单 1. 测试正确的安装</strong> </p>
    <table cellSpacing=0 cellPadding=0 width="60%" border=0>
        <tbody>
            <tr>
                <td class=code-outline>
                <pre class=displaycode>#include &lt;stdio.h&gt;
                int main(void) {
                printf("Hello, world!");
                return 0;
                }
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br></li>
    <li>将该测试程序保存在一个叫做 hello.c 的文件中，并编译它。到编译器的两条路径都可以工作——我喜欢使用 <code>/opt/Embedix/tools/arm-linux/bin/gcc。</code> 编译完程序之后，利用 file 命令检查输出文件的类型。 </li>
</ol>
<br><a name=N100F9><strong>清单 2. 使用 file 命令检查输出的类型</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="60%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ /opt/Embedix/tools/arm-linux/bin/gcc -o hello hello.c
            $ file hello
            hello: ELF 32-bit LSB executable, ARM, version 1 (ARM),
            dynamically linked (uses shared libs), not stripped
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>您可能对这一简短的偏离主题感兴趣。还记得我什么时候提到过 strings 程序吗？我们来试一试该程序。</p>
<p>首先， 在您的二进制系统上运行本地 strings 程序：</p>
<br><a name=IDACOAUH><strong>清单 3. 运行本地 strings 程序</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ /usr/bin/strings hello
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>接下来，在相同的二进制系统上运行 ARM 版本：</p>
<br><a name=IDAMOAUH><strong>清单 4. ARM 版本</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ /opt/Embedix/tools/arm-linux/bin/strings hello
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在我的测试系统上，这些产生了稍微不同的结果。特定于 ARM 的 strings 程序发现一个特定于 i386 的版本未发现的新字符串。</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/wireless/wi-zaurus/index.html#main"><strong><u><font color=#0000ff>回页首</font></u></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=3><span class=atitle>在目标系统上安装应用程序</span></a></p>
<p>将文件移动到目标系统有几种方式：</p>
<ul>
    <li>使用标准的 Zaurus sync 软件进行转移。</li>
    <li>复制到介质上。</li>
    <li>通过网络移动。</li>
</ul>
<p>使用无线卡或以太网适配器可能是移动文件最容易的方式。如果这样不行，将文件复制到 CompactFlash 或 SecureDigital 介质上也是相当方便的。不幸的是，在发布本文时，Sharp 还未正式在 Linux 下支持 sync，但是复制到介质随处可用。</p>
<p>根据您的 Zaurus 上的 ROM 版本的不同，系统可能不识别或安装 ext2fs 卡。因此，通过 FAT16 格式化的卡复制文件可能更实用一些。CF 和 SD 卡一般在出厂前已经这样格式化了，所以它们可以开箱即用。</p>
<p>( <strong>简要的术语提示：</strong> <em>ext2fs</em> 卡是为 Linux 文件系统格式化过的存储卡。 <em>FAT16格式化的</em>卡是为老式的 MS-DOS 文件系统格式化过的存储卡。 <em>CF</em> 卡是 CompactFlash，这是一些数码相机使用的一种介质标准。多数 CF 设备是存储设备，但是 CF Ethernet、无线和串行适配器也存在。 <em>SD</em>（或者叫做 Secure Digital）卡是 MultiMediaCard 技术与我们的目的之间的一个联系，SD 卡就像一个永久保存10％空间的 MMC 卡。) </p>
<p>就将您的可执行文件复制到一个已安装的卡。当将该卡移动到 Zaurus 时，它就会自动地安装为 /usr/mnt.rom/cf。现在您就可以从卡运行应用程序了。</p>
<br><a name=IDASPAUH><strong>清单 5. 从卡运行应用程序</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>$ /usr/mnt.rom/cf/hello
            Hello, world!
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>现在您已经尝试了该程序，不过您可能更喜欢 Zaurus 的 ipkg 二进制软件包格式。ipkg 文件只是一个包含三个其他文件的 tar 文件：</p>
<ul>
    <li>第一个文件，即 data.tar.gz，是一个压缩的 tar 文件，其中包含将被安装到正确目录结构中的多个文件。</li>
    <li>第二个文件，即 control.tar.gz，是一个压缩的 tar 文件，其中包含安装脚本和信息。</li>
    <li>第三个文件，即 debian-binary，是一个纯文本文件，其中包含字符串&#8220;2.0&#8221;。该文件目前不真正做任何事情，但是一些工具期望该文件可用。</li>
</ul>
<p>尽管有一个方便的脚本可为您做这项工作，但是您也可以手动创建 ipkg 文件。为防万一您确实想要手动创建一个 ipkg 文件，所以我将简要讨论这种软件包的格式。利用您将使用的标准软件安装器，该软件包将正确地安装 "hello" 程序。</p>
<ol>
    <li>创建一个名叫 h 的新目录用于保存文件。名称并不一定要叫 h，但是因为后面老要键入它，所以使用一个简短的名称。 </li>
    <li>创建一个名叫 h/opt/QtPalmtop/bin 的子目录，并将您的 "hello" 可执行文件复制到该目录。这对于显示所安装的程序是一个好目录。</li>
    <li>创建一个名叫 h/CONTROL 的目录。该目录形成 control.tar.gz 文件的内容；h 中的其他东西都放入 data.tar.gz 文件中。在该目录中，您只需要一个文件，叫做 control。将以下数据放入该文件中：
    <p><strong>清单 6. 将要放入 control 文件中的信息</strong> </p>
    <table cellSpacing=0 cellPadding=0 width="100%" border=0>
        <tbody>
            <tr>
                <td class=code-outline>
                <pre class=displaycode>Package: hello
                Priority: optional
                Section: Misc
                Version: 1.0
                Architecture: arm
                Maintainer: Your name (your.address@example.com)
                Depends: libc6
                Description: Just as stores have greeters, so to do PDAs have greeters.
                This is a longer description, separate from the first one, which
                can be multiple lines long, with each line indented by a single space.
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br>
    <p>还有其他可以放入到 CONTROL 目录中的文件，但是您并不需要这些文件。请参考 <a href="http://www.ibm.com/developerworks/cn/linux/wireless/wi-zaurus/index.html#resources"><u><font color=#0000ff>参考资料</font></u></a>，在 Zaurus 开发者文档中了解该主题的附加信息。 </p>
    </li>
    <li>运行 <code>ipkg_build.sh h。</code> 如果前面所做的每一件事情都正确，您应该得到一个名叫 hello_1.0_arm.ipk 的文件。将该文件复制到您的 Zaurus ——不管如何复制都无所谓——并在 Zaurus 上运行 Add/Remove Software 程序。 </li>
    <li>安装 hello，即您应该在软件包列表中看到的版本 1.0 文件。现在就可以从命令行运行它了；它已经被复制到 /opt/QtPalmtop/bin 目录中了。如果您将它安装到一个介质插槽中而不是内部闪存中，它将在该卡上的 QtPalmtop/bin 目录中。例如，如果安装到 SD，它将被安装为 /usr/mnt.rom/card/QtPalmtop/bin/hello。 </li>
</ol>
<p><code>ipkg_build.sh</code> shell 脚本对产生错误消息比较有效，但是它们可能会有些容易混淆。实际上，如果您在 control 文件中放入注释（我就是这样做的！），# 字符就会被解释为一个字段名称，从而产生以下错误消息： </p>
<br><a name=IDADZAUH><strong>清单 5. 啊呀！请不要在 control 文件中放入注释</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>*** Error: The following fields in CONTROL/control are missing a ':'
            ###
            ipkg-build: This may be due to a missing initial space for a multi-line field value
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<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/wireless/wi-zaurus/index.html#main"><strong><u><font color=#0000ff>回页首</font></u></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=4><span class=atitle>复杂编译</span></a></p>
<p>一旦您让编译器创建了在目标系统上正确运行的可执行程序，您就会开始遇到令人激动的问题了。</p>
<p>使用 <code>autoconf</code> 的程序可能不支持交叉创建。当已编译的二进制文件被使用在创建过程中时，就会出现惟一真正固定不变的情况。不幸的是，对于使用 <code>autoconf</code> 的程序，这是一种相当常见的情况。 </p>
<p>对于一个相当标准的没有太多依赖性的程序，您可能只是忽略选择 C 编译器。FIGlet 是一个程序，用于从平常的文本制造出大字母，如图 1 所示，通过更改 makefile 中的 <code>CC=...</code> 行可以创建该程序。但是，安装稍微有些有趣。 </p>
<br><a name=IDAH0AUH><strong>图 1. 文本 "like this" 的 FIGlet 输出样例</strong></a><br><img height=97 alt="Figure 1. Sample FIGlet output for text 'like this'" src="http://www.ibm.com/developerworks/cn/linux/wireless/wi-zaurus/figlet.gif" width=242> <br>
<p>FIGlet 想要找到一些数据文件，所以您必须安装数据文件和程序。makefile 文件中对应的行是 <code>DEFAULTFONTDIR = /usr/local/share/figlet。</code> （注意，有两行设置 <code>DEFAULTFONTDIR；</code> 在设置时请确保只使用其中一行。） </p>
<p>一旦利用更改的 makefile 创建了 <code>figlet</code> ，就可以创建它的一个软件包了。创建一个新的目录（这里叫做 f）。 </p>
<p>这时，创建一个二进制目录和一个数据目录。二进制目录是 f/opt/QtPalmtop/bin，而数据目录是 f/usr/local/share/figlet。将 figlet、chkfont 和 showfigfonts 复制到 f/QtPalmtop/bin 中；然后将 fonts/* 复制到 f/usr/local/share/figlet 中。从上一个项目复制到 CONTROL 目录，并编辑 control 文件以给出软件包的名称和版本。同样， <code>build-ipkg.sh</code> 可以为您完成这份苦差使。 </p>
<p>有些程序可能需要更多的技巧。例如，要创建 <code>pdksh，</code> 您使用 <code>CC=/opt/Embedix/tools/bin/arm-linux-gcc sh configure。</code> 该创建过程犯了一个小小的错误——它将两个宏 <code>SIZEOF_INT</code> 和 <code>SIZEOF_LONG</code> 都定义为 0。它们应该是 4。 </p>
<p>这些宏是通过试图编译和运行输出 <code>sizeof(int) </code>的测试程序而定义的，但是当然，arm-processor 程序不运行在 x86 主机上，所以这些测试失败。在这种情况下，您可以只是编辑 confdefs.h 文件，更改宏，然后继续。只要知道出了什么错就不难纠正，但是出了什么错并不是那么明显。当它确定一个类型的大小为 0 时，让配置脚本以重大错误异常终止可能还要好一些。 </p>
<p>使用一个聪明的 hack， <code>autoconf</code> 的一些最近版本可以解决该问题。只是在 configure.in 文件上重新运行一个当前的 <code>autoconf</code> 就可以帮助解决一些问题，尤其是当软件包过期时， 但是在老的 configure.in 文件中有时会有一些腐旧的东西。 </p>
<p>在比较一般的情况下，您可能只是要手动编辑配置脚本或设置程序，以迫使它们获得正确的结果。在极端的情况下，可能有必要试图进行费事的程序&#8220;挖口&#8221;，比如在一台安装了本地开发工具的 Zaurus 上本地运行配置脚本，然后将所有文件移回桌面开发系统 ，更改编译路径，并从这里启动。</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/wireless/wi-zaurus/index.html#main"><strong><u><font color=#0000ff>回页首</font></u></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=5><span class=atitle>结束语</span></a></p>
<p>很多开发者还在犹豫是否尝试交叉编译，因为它听起来比实际要难得多。本文通过给出交叉编译的一个概览，帮助您开始了解交叉编译技术。本文提供了一些例子，讲述设置一个系统以实现交叉编译的程序。本文还提供了一些参考资料，以帮助您设置一个为 Sharp Zaurus 手持计算机进行开发的系统。</p>
<br><br>
<p><a name=resources><span class=atitle>参考资料 </span></a></p>
<ul>
    <li>David Mertz 和 Andrew Blais 所写的" <a href="http://www.ibm.com/developerworks/cn/linux/embed/palmos2/index.html"><u><font color=#0000ff>基于 PalmOS 的编程语言</font></u></a>" 一文( <em>developerWorks</em>, 2001年8月)，介绍了可在手持计算机上直接工作的开发环境，不再需要在桌面环境中开发之后再进行交叉编译。 <br><br><br><br></li>
    <li>Cameron Laird所写的 " <a href="http://www.ibm.com/developerworks/cn/linux/l-sc10/index.html"><u><font color=#0000ff>用于交叉生成应用程序的 Xmingwin</font></u></a>" 一文( <em>developerWorks</em>, 2003年1月)，通过从 Linux 服务器生成 Windows 程序，提供了交叉编译的一个实际例子。 <br><br><br><br></li>
    <li>Markus Neifer 所写的 " <a href="http://www.ibm.com/developerworks/cn/linux/sdk/python/wxwin/index.html"><u><font color=#0000ff>细述 wxWindows </font></u></a>" 一文( <em>developerWorks</em>, 2001年2月)，介绍了 wxWindows（这是一种可移植的 C++ 和 Python GUI 工具包），还讨论了如何处理多平台文件处理。 <br><br><br><br></li>
    <li>该 <a href="http://publib-b.boulder.ibm.com/Redbooks.nsf/9445fa5b416f6e32852569ae006bb65f/f9167047a364feb085256bdb006d91e0?OpenDocument&amp;Highlight=0,linux,zseries"><u><font color=#0000ff>Redbook tip</font></u></a> 详细讲述了如何在 Linux 上配置 gcc 充当一个交叉编译器。 <br><br><br><br></li>
    <li><a href="http://www.zaurus.com/dev/"><u><font color=#0000ff>Zaurus 开发者站点</font></u></a>是开发者参考资料的汇总。 <br><br><br><br></li>
    <li><a href="http://www.figlet.org/"><u><font color=#0000ff>FIGlet</font></u></a> 站点提供了本文作为例子提到的文本转换软件的代码。 <br><br><br><br></li>
    <li><a href="http://adorphuye.com/zaurus/java/faq.jsp"><u><font color=#0000ff>Zaurus Java FAQ</font></u></a> 回答有关利用 Java 对 Zaurus 进行开发的一些问题。 <br><br><br><br></li>
    <li><a href="http://www.zaurususergroup.com/"><u><font color=#0000ff>ZUG (Zaurus User Group)</font></u></a>为开发者提供了大量有经验的输入。 <br><br><br><br></li>
    <li>该非官方的 <a href="http://www.newbreedsoftware.com/zaurus-faq/"><u><font color=#0000ff>Zaurus 开发 FAQ</font></u></a> 提供了许多非常有用的信息。 <br><br><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>&#160;</p>
            </td>
            <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
            <td width="100%">
            <p>Peter Seebach 是一位自由作家。他喜欢收集一些有趣的新鲜玩艺儿，而 Zaurus 似乎很自然地成为其中的一件。在他能够游刃有余地谈论这个东西之前，他已经花了很长的时间捣鼓编译器工具链和导出程序。通过 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#119;&#119;&#105;&#114;&#101;&#108;&#101;&#115;&#115;&#64;&#115;&#101;&#101;&#98;&#115;&#46;&#112;&#108;&#101;&#116;&#104;&#111;&#114;&#97;&#46;&#110;&#101;&#116;"><u><font color=#0000ff>dwwireless@seebs.plethora.net</font></u></a>可以与他联系。 </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/tommyyan/aggbug/82594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-11 17:39 <a href="http://www.cppblog.com/tommyyan/articles/82594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WEB SERVER boa的使用及配置</title><link>http://www.cppblog.com/tommyyan/articles/82437.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Sat, 09 May 2009 17:02:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/82437.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/82437.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/82437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/82437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/82437.html</trackback:ping><description><![CDATA[1)、对于uClinux-dist而言，就是make menuconfig在应用程序选单中，在network application下面选择boa，然后到uClinux-dist目录下执行make编译即可。
<p>对于有MMU的平台，如armlinux和ppclinux，都是到网上下载一个boa的tar包，随便找个主流的可用的版本即可，不要最新的也不要最旧的。下载到REDHAT宿主机上后，解压到任意目录，然后修改boa/src/Makefile里面的编译器，就只要加入两三行即可，例如：</p>
<p>CC = /LinuxPPC/CDK/bin/powerpc-linux-gcc -DHHTECH_PPC<br>CPP = /LinuxPPC/CDK/bin/powerpc-linux-g++<br>然后直接在boa/src目录下执行make即可生成boa可执行文件，将其复制到ramdisk加载mount的目录的bin里面，然后等一同加入后面的配置文件和HTML/CGI文件后，重做ramdisk即可。</p>
<p>(2)、编制配置文件boa.conf</p>
<p>LINUX下的应用程序的配置都是以配置文件的形式提供的，一般的都是放在目标板/etc/目录下或者/etc/config目录下，但boa的配置文件boa.conf一般都放置在目标板/home/httpd/目录下。</p>
<p>例如一个典型的boa.conf文件格式如下：</p>
<p><font color=#ff0000><strong>ServerName HHCF5272-R1<br>DocumentRoot /home/httpd/html<br>ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/<br>ScriptAlias /index.html /home/httpd/html/index.html</strong></font><br>它指定了HTML页面（例如index.html必须放到/home/httpd/html目录下，cgi可执行文件必须放到/home/httpd/cgi-bin目录下）</p>
<p>(3)、编译uClinux-dist后或者重做ramdisk后，烧写后在一台WINDOWS的PC机上就可以用IE访问板子上的webserver，例如输入板子IP地址http://192.168.2.111，即可看到你用dreamweaver做的网页index.html了。但这里只能做到对静态页面的支持，若要支持FORM表单处理和动态页面，就必须用C代码编制CGI代码，uClinux-dist/user/cgi-generic目录下提供了样板代码，或者可以从华恒公司购买。注意：这个CGI的可执行文件必须放置到板子的/home/httpd/cgi-bin目录下。</p>
<p>建议阅读文章： </p>
<p><a href="http://www.51eda.com/Article/embed_system/rtos/200405/806.html"><font color=#0000ff><u>http://www.51eda.com/Article/embed_system/rtos/200405/806.html</u></font></a></p>
<p><a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;Board=embedded&amp;Number=432851&amp;page=0&amp;view=collapsed&amp;sb=5&amp;o=&amp;fpart="><u><font color=#0000ff>关于auth选项</font></u></a></p>
<p><br><strong>8.关于PPP拨号</strong></p>
<p>(1)、首先是根据板子的串口2的信号定义制作串口线接MODEM，例如HHCF5249/5272系列平台就要将接MODEM的串口线2、3交换，7、8交换。做好线之后，可用tip软件进行与MODEM通信的测试：</p>
<p>tip -l /dev/ttyS1 -s 19200</p>
<p>显示connected后，用户就可以输入AT命令直接与MODEM对话了，这样做的目的是测试串口线。</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>(2)、配置内核支持PPP，并编译拨号用相关应用程序：pppd/chat。关于内核支持，就是make menuconfig在内核配置的Network device support ---&gt; 中选择PPP/SLIP/CSLIP等，具体细节选项可任选，其实全部选中就可以了。关于应用程序的做法，和上面boa的做法完全类似。</p>
<p>(3)、编译拨号脚本和相关配置文件。做拨号必须先在REDHAT上手工拨号成功（不要用图像界面），然后才能到板子上做测试。而且，这只是第一步，简单的拨号上去并没有任何意思，因为产品过程中，还要涉及许多的应用细节，例如断线重拨检测，开机自动拨号，无流量自动断开，有流量自动拨号等，都是非常麻烦的细节，需要做长时间大量的稳定性可靠性测试。华恒提供经过全球各大城市测试稳定应用的拨号软件（GPRS/ADSL），可大大节省用户产品的上市时间。</p>
我用了uclinux下的boa服务器，写了些cgi程序，用printf（）能输出英文显示在windows浏览器上，但中文无法显示，怎么能显示中文啊？ <br>可以把静态页面的中文显示出来，但不能把cgi程序中的中文显示出来， <br>main() <br>{ <br>input inputs[10]; <br>int len; <br>int ch; <br>FILE *fp; <br>int s[100]; <br>char p[100]; <br>char accounts[20],password[20]; <br>int i=0,j=0,k=0; <br><br>printf("Content-type:text/html\n\n"); <br>len=atoi(getenv("CONTENT_LENGTH")); <br>for(i=0;len&amp;&amp;(!feof(stdin));i++) <br>{ <br>inputs[i].val=ReadStdin(stdin,'&amp;',&amp;len); <br>AddToSpace(inputs[i].val); <br>Convert(inputs[i].val); <br>inputs[i].name=ReadData(inputs[i].val,'='); <br>} <br>fp=fopen("/tmp/register","w+"); <br>if(fp==NULL) <br>exit(1); <br>if(strcmp(inputs[1].val,inputs[2].val)==0) <br>{ <br>fp=fopen("/tmp/register","w+"); <br>fwrite(inputs[0].val,strlen(inputs[0].val),1,fp); <br>fputc('=',fp); <br>fwrite(inputs[1].val,strlen(inputs[1].val),1,fp); <br>fclose(fp); <br>fp=fopen("/home/web/html/change_success.html","r"); <br>//chang_success.html中的中文能显示出来 <br>if(fp==NULL) <br>exit(1); <br>while(!feof(fp)) <br>{ <br>ch=fgetc(fp); <br>putchar(ch); <br>} <br>fclose(fp); <br>} <br>else <br>{ <br>printf("出了问题"）；//这里的中文无法输出 <br>} <br>} <br><br><br><br>显示的是Invalid multibyte format string， <br>不知道怎么解决？？？？ <br>my email <br>soq916@sina.com
<img src ="http://www.cppblog.com/tommyyan/aggbug/82437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-10 01:02 <a href="http://www.cppblog.com/tommyyan/articles/82437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>移植ssh到arm</title><link>http://www.cppblog.com/tommyyan/articles/82433.html</link><dc:creator>星仁</dc:creator><author>星仁</author><pubDate>Sat, 09 May 2009 15:15:00 GMT</pubDate><guid>http://www.cppblog.com/tommyyan/articles/82433.html</guid><wfw:comment>http://www.cppblog.com/tommyyan/comments/82433.html</wfw:comment><comments>http://www.cppblog.com/tommyyan/articles/82433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tommyyan/comments/commentRss/82433.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tommyyan/services/trackbacks/82433.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Verdana">1. 下载需要的源码:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; mkdir -p ~/arm/fs ;mkdir -p ~/arm/source</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 下载zlib:&nbsp; wget -c http://www.zlib.net/zlib-1.2.3.tar.gz</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 下载ssl:&nbsp; wget -c http://www.openssl.org/source/openssl-0.9.8d.tar.gz</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 下载ssh: wget -c http://mirror.mcs.anl.gov/openssh/portable/openssh-4.6p1.tar.gz</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">2.&nbsp; 编译:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; cd ~/arm/source</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; (1) 编译zlib:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; tar zxvf zlib-1.2.3.tar.gz -C .</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; cd zlib-1.2.3/</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; ./configure --prefix=/home/itlanger/arm/fs/zlib-1.2.3</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 修改Makefile:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">CC<span style="COLOR: rgb(0,0,204)">=</span>gcc 改为:&nbsp;</span></code><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; </span><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"></span>&nbsp;&nbsp; CROSS<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">/</span>usr<span style="COLOR: rgb(0,0,204)">/</span>local<span style="COLOR: rgb(0,0,204)">/</span>arm<span style="COLOR: rgb(0,0,204)">/</span>3<span style="COLOR: rgb(0,0,204)">.</span>4<span style="COLOR: rgb(0,0,204)">.</span>1<span style="COLOR: rgb(0,0,204)">/</span>bin<span style="COLOR: rgb(0,0,204)">/</span>arm<span style="COLOR: rgb(0,0,204)">-</span>linux<span style="COLOR: rgb(0,0,204)">-<br>&nbsp; </span></span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"></span>&nbsp;&nbsp; &nbsp; CC<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">$</span><span style="COLOR: rgb(0,0,204)">(</span>CROSS<span style="COLOR: rgb(0,0,204)">)</span>gcc</span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"> <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span></span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"></span>LDSHARED<span style="COLOR: rgb(0,0,204)">=</span>gcc 改为: </span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">LDSHARED<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">$</span><span style="COLOR: rgb(0,0,204)">(</span>CROSS<span style="COLOR: rgb(0,0,204)">)</span>gcc<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">CPP<span style="COLOR: rgb(0,0,204)">=</span>gcc <span style="COLOR: rgb(0,0,204)">-</span>E&nbsp;&nbsp; 改为</span></code><span style="FONT-FAMILY: Verdana">:&nbsp; </span><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">CPP<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">$</span><span style="COLOR: rgb(0,0,204)">(</span>CROSS<span style="COLOR: rgb(0,0,204)">)</span>gcc <span style="COLOR: rgb(0,0,204)">-</span>E<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">AR<span style="COLOR: rgb(0,0,204)">=</span>ar rc&nbsp;&nbsp;&nbsp;&nbsp; 改为: </span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">AR<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">$</span><span style="COLOR: rgb(0,0,204)">(</span>CROSS<span style="COLOR: rgb(0,0,204)">)</span>ar rc<br>&nbsp; 开始编译: make;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; make install<br><br>&nbsp;&nbsp; </span></code><span style="FONT-FAMILY: Verdana">(2)&nbsp; 编译openssl:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; tar zxvf </span><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)"></span>openssl<span style="COLOR: rgb(0,0,204)">-</span>0<span style="COLOR: rgb(0,0,204)">.</span>9<span style="COLOR: rgb(0,0,204)">.</span>8d.tar.gz</span></code><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp; </span><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,204)">.</span><span style="COLOR: rgb(0,0,204)">/</span>configure <span style="COLOR: rgb(0,0,204)">-</span><span style="COLOR: rgb(0,0,204)">-</span>prefix<span style="COLOR: rgb(0,0,204)">=</span><span style="COLOR: rgb(0,0,204)">/</span>home<span style="COLOR: rgb(0,0,204)">/itlanger</span><span style="COLOR: rgb(0,0,204)">/</span>arm/fs<span style="COLOR: rgb(0,0,204)">/</span>openssl<span style="COLOR: rgb(0,0,204)">-</span>0<span style="COLOR: rgb(0,0,204)">.</span>9<span style="COLOR: rgb(0,0,204)">.</span>8d<br>&nbsp;&nbsp;&nbsp;&nbsp; os<span style="COLOR: rgb(0,0,204)">/</span>compiler<span style="COLOR: rgb(0,0,204)">:</span><span style="COLOR: rgb(0,0,204)">/</span>usr<span style="COLOR: rgb(0,0,204)">/</span>local<span style="COLOR: rgb(0,0,204)">/</span>arm<span style="COLOR: rgb(0,0,204)">/</span>3<span style="COLOR: rgb(0,0,204)">.</span>4<span style="COLOR: rgb(0,0,204)">.</span>1<span style="COLOR: rgb(0,0,204)">/</span>bin<span style="COLOR: rgb(0,0,204)">/</span>arm<span style="COLOR: rgb(0,0,204)">-</span>linux<span style="COLOR: rgb(0,0,204)">-</span>gcc<br>&nbsp;&nbsp;&nbsp; make<br>&nbsp;&nbsp;&nbsp; make install<br><br></span></code><code style="FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,0,0)">&nbsp;&nbsp; (3) </span></code><span style="FONT-FAMILY: Verdana">编译openssh:</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp; tar zxvf openssh-4.6p1.tar.gz</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp; cd openssh-4.6p1/</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp; ./configure --host=arm-linux --with-libs --with-zlib=/home/itlanger/arm/fs/zlib-1.2.3</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; --with-ssl-dir=/home/itlanger/arm/fs/openssl-0.9.8d --disable-etc-default-login &nbsp;&nbsp;&nbsp; </span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc AR=/usr/local/arm/3.4.1/bin/arm-linux-ar</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; make</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp; ##不要make install</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">3. 安装</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; </span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; (1) 将 openssh-4.6p1目录下的 <span style="COLOR: rgb(255,1,2)">sshd</span> 拷贝到 目标板的/usr/sbin目录下</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; (2) 再copy <span style="COLOR: rgb(255,1,2)">scp</span>&nbsp;&nbsp;sftp&nbsp;&nbsp;<span style="COLOR: rgb(255,1,2)">ssh</span>&nbsp;&nbsp;ssh-add&nbsp;&nbsp;ssh-agent&nbsp;&nbsp;ssh-keygen&nbsp;&nbsp;ssh-keyscan&nbsp; 到目标板<span style="COLOR: rgb(255,1,2)">/usr/local/bin</span>目录下<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; copy </span>sftp-server&nbsp;&nbsp;ssh-keysign<span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 到/usr/local/libexec<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="COLOR: rgb(255,1,2)"><span style="COLOR: rgb(0,1,2)"></span></span><br>&nbsp;&nbsp;&nbsp; (3) 在目标板下：</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mkdir -p /usr/local/etc/&nbsp; </span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 然后将openssh下的<span style="COLOR: rgb(255,1,2)">sshd_config</span>,</span>ssh_config<span style="FONT-FAMILY: Verdana"> 拷贝到该目录下</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,1,2)"> mkdir -p /var/run; mkdir -p /var/empty/sshd </span></span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="COLOR: rgb(255,1,2)">chmod 755 /var/empty </span>&nbsp;&nbsp;&nbsp; </span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; （4）在主机上：</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<span style="COLOR: rgb(255,1,2)">&nbsp; </span></span><code style="COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">ssh-keygen -t rsa1 -f ssh_host_key -N ""<br>&nbsp;&nbsp;&nbsp;&nbsp; </code><code style="COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; ssh-keygen -t rsa -f ssh_host_rsa_key -N ""<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; </code><code><span style="COLOR: rgb(0,0,0)"><font face=新宋体><span style="COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">ssh-keygen -t dsa -f ssh_host_dsa_key -N </span><span style="COLOR: rgb(255,0,255)"><span style="COLOR: rgb(255,1,2); FONT-FAMILY: Verdana">""</span><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp; 将生存的 ssh_host_* 4个文件copy到目标板的 /usr/local/etc/目录下</span><br style="COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp; (5) 添加用户:</span><br style="COLOR: rgb(0,1,2); FONT-FAMILY: Verdana"><span style="COLOR: rgb(0,1,2); FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(255,1,2)"> 将主机上 /etc/目下的 passwd, shadow, group 三个文件copy到目标板的 /etc目录下， 同时记得将passwd的最后 /bin/bash 该为 /bin/sh </span><br>&nbsp;&nbsp;&nbsp; &nbsp; 其实可以删除不需要的一些用户。<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>4.测试<br>&nbsp; &nbsp;&nbsp; 目标板启动sshd:&nbsp; #<span style="COLOR: rgb(255,1,2)"> /usr/sbin/sshd</span><br>&nbsp;&nbsp;&nbsp;&nbsp; 主机: $&nbsp; ssh root@192.168.0.34<br><br>ps: 红色的那些代表让arm做ssh server时必须的</span></span></font></span></code>
<img src ="http://www.cppblog.com/tommyyan/aggbug/82433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tommyyan/" target="_blank">星仁</a> 2009-05-09 23:15 <a href="http://www.cppblog.com/tommyyan/articles/82433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>