﻿<?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>IT博客-YGB.Grushy-文章分类-嵌入式学习</title><link>http://www.cnitblog.com/ygb/category/1633.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 14:22:45 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 14:22:45 GMT</pubDate><ttl>60</ttl><item><title>嵌入式linux开发相关网站</title><link>http://www.cnitblog.com/ygb/articles/7464.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Fri, 10 Mar 2006 09:42:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/7464.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/7464.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/7464.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/7464.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/7464.html</trackback:ping><description><![CDATA[<P>以下网站提供交叉编译所需的源码<BR>blob网站（引导程序）<BR><A href="http://www.lart.tudelft.nl/lartware/blob/">http://www.lart.tudelft.nl/lartware/blob/</A></P>
<P>提供内核<BR><A href="http://www.arm.linux.org.uk/">http://www.arm.linux.org.uk/</A></P>
<P>提供busybox源码<BR><A href="http://busybox.net/">http://busybox.net/</A></P>
<P>mp3播放程序<BR><A href="http://www.mpg123.de/">http://www.mpg123.de/</A></P>
<P>Qt embed/opopia<BR><A href="http://www.trolltech.com/">http://www.trolltech.com/</A><BR>中文参考文档<BR><A href="http://www.qiliang.net/qt/index.html">http://www.qiliang.net/qt/index.html</A></P>
<P>音量调整程序aumix<BR><A href="http://jpj.net/~trevor/aumix.html">http://jpj.net/~trevor/aumix.html</A></P>
<P>console下的鼠标程序<BR><A href="http://lfs.linuxsir.org/htdocs/blfscvs/general/gpm.html">http://lfs.linuxsir.org/htdocs/blfscvs/general/gpm.html</A></P><img src ="http://www.cnitblog.com/ygb/aggbug/7464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2006-03-10 17:42 <a href="http://www.cnitblog.com/ygb/articles/7464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>skyeye的启动命令</title><link>http://www.cnitblog.com/ygb/articles/5509.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sat, 17 Dec 2005 08:10:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/5509.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/5509.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/5509.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/5509.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/5509.html</trackback:ping><description><![CDATA[<span class="postbody">按照REAME文件里面的说明
<br>
在终端里面使用SKYEYE命令，格式如下：
<br>
SKYEYE -E ELF格式文件 －C 配置文件
<br>
一般是skyeye -e vmlinux -c skyeye.conf执行ELF格式文件vmlinux
<br>
如果要skyeye运行的文件是bin格式，就不用-e 指定文件格式了
<br>
bin文件一般直接在skyeye.conf文件中用file＝指定，ksyeye会自动加在文件到指定地址空间，使用boot=yes参数可以让skyeye加载完文件后从指定地址空间执行
<br>
和以前的一样，如果没有指定配置文件，skyeye会在当前目录下面搜索skyeye.conf例如：
<br>
＃skyeye.conf文件
<br>
cpu: pxa25x
<br>
mach: pxa_lubbock
<br>
mem_bank: map=M, type=RW, addr=0xa0000000, size=0x01000000,file=zImage,boot=yes
<br>
mem_bank: map=M, type=RW, addr=0xa1000000, size=0x01000000,file=./ramdisk.img
<br>
mem_bank: map=M, type=RW, addr=0xa2000000, size=0x02000000
<br>
mem_bank: map=I, type=RW, addr=0x40000000, size=0x0c000000
<br>
lcd:state=on,type=pxa,mod=gtk
<br>
在终端上
<br>
root@ubuntu:~/rootfs # skyeye 
<br>
------------------------- SkyEye -V1.0 ---------------------------
<br>
Usage: SkyEye [options] program [program args]
<br>
Default mode is STANDALONE mode
<br>
------------------------------------------------------------------
<br>
Options:
<br>
-e exec-file the (ELF executable format)kernel file name.
<br>
-d in GDB Server mode (can be connected by GDB).
<br>
-c config-file the skyeye configure file name.
<br>
-h This Help Display
<br>
------------------------------------------------------------------
<br>
debugmode= 0, filename = skyeye.conf, server TCP port is 12345
<br>
cpu info: xscale, pxa25x, 69052100, fffffff0, 2
<br>
mach info: name pxa_lubbock, mach_init addr 0x808d470
<br>
lcd_mod:0
<br>
dbct info: turn off dbct!
<br>
"dbct" option parameter error!
<br>
SKYEYE: use xscale mmu ops
<br>
Loaded RAM zImage
<br>
Loaded RAM ./initrd_minigui.img
<br>
Uncompressing Linux.............................................................. done, booting the kernel.
<br>
`Linux version 2.6.10 (root@ubuntu) (gcc version 3.4.1) #1 Tue Sep 20 22:47:03 CST 2005</span><img src ="http://www.cnitblog.com/ygb/aggbug/5509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2005-12-17 16:10 <a href="http://www.cnitblog.com/ygb/articles/5509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装完成SkyEye后，下一步将做什么？[转帖]</title><link>http://www.cnitblog.com/ygb/articles/5504.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sat, 17 Dec 2005 03:41:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/5504.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/5504.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/5504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/5504.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/5504.html</trackback:ping><description><![CDATA[1、对于嵌入式操作系统的初学者和入门者和入门的学生而言，他们可以先看一些有关操作系统和嵌入式操作系统方面的教材和书籍，如与<br>
<br>
uC/OS、Minix、uClinux、Linux相关的书籍等。然后可以在Skyeye上开发一些简单的应用程序例子(如进程间通信、进程优先级、死锁情况、网<br>
<br>
络应用等)，对某些操作系统功能(如进程调度、内存管理、网络子系统、文件子系统等)进行简单的修改和扩展，并通过Skyeye进行运行和调试<br>
<br>
，看看会发生什么情况。<br>
<br>
2、对于有一定经验的软件工程师而言，在SkyEye上完成一定的应用系统原型开发是值得一做的事情。比如移植或开发一个文件子系统或网络子<br>
<br>
系统到一个特定的操作系统中，相信比在一个真实的开发板上开发要容易一些。在Skyeye上进行一些操作系统的移植和开发(如移植RTLinux、<br>
<br>
RTAI等其它操作系统到Skyeye上)也是很有挑战性的工作。<br>
<br>
3、对于硬件工程师而言，对Skyeye进行扩充，设计新的硬件仿真(如USB、IDE硬盘等)使得Skyeye的硬件仿真功能更加强大，支持更多功能的软<br>
<br>
件，是很有意义的事情。<br>
<br>
参考：<br>
SkyEye项目站点里的一篇中文文档；<br>
陈渝《SkyEye 
            Project 
            FAQ》；<br>
skyeye-0.7.0中的README文档。<br>
<br>
后记：<br>
为了让大家能快速上手，进行实际的开发工作，我赶凑了一篇文档，很粗糙。但我坚信随着更多的有经验的人的加入；随着我们自己水平的提<br>
<br>
高，一定会出现更多、更好的文章来。就让我们快点行动起来吧！<br>
<br>
最后，我再次建议大家看一下《嵌入式Linux技术与应用》这本书。<br>
<br>
可以到<a href="http://www.skyeye.org/document.htm" target="_blank">http://www.skyeye.org/document.htm</a>或是<br>
<a href="ftp://166.111.68.183/pub/embed/skyeye/document/" target="_blank">ftp://166.111.68.183/pub/embed/skyeye/document/</a>或是<br>
<a href="http://www.huihoo.org/mirrors/skyeye/" target="_blank">http://www.huihoo.org/mirrors/skyeye/</a><br>
下载文档，可以获得更多有关skyeye和嵌入式Linux开发的知识和经验。<img src ="http://www.cnitblog.com/ygb/aggbug/5504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2005-12-17 11:41 <a href="http://www.cnitblog.com/ygb/articles/5504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SkyEye仿真[转贴]</title><link>http://www.cnitblog.com/ygb/articles/5503.html</link><dc:creator>YGB.Grushy</dc:creator><author>YGB.Grushy</author><pubDate>Sat, 17 Dec 2005 03:39:00 GMT</pubDate><guid>http://www.cnitblog.com/ygb/articles/5503.html</guid><wfw:comment>http://www.cnitblog.com/ygb/comments/5503.html</wfw:comment><comments>http://www.cnitblog.com/ygb/articles/5503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/ygb/comments/commentRss/5503.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/ygb/services/trackbacks/5503.html</trackback:ping><description><![CDATA[SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具，这样就可以在没有硬件条件下来进行嵌入式系统的开发。<br>
<br>
以下操作均在Fedora 
            Core 1.0里通过。<br>
<br>
<font color="red"><font size="3"><b>Skyeye项目资源列表</b></font></font><br>
<a href="http://gro.clinux.org/projects/skyeye/" target="_blank">http://gro.clinux.org/projects/skyeye/</a><br>
<br>
<br>
<font color="blue"><b>文档摘要：</b></font><br>
1、什么是SkyEye？<br>
2、SkyEye可以做什么事情？<br>
3、安装SkyEye<br>
4、安装arm-elf交叉编译器<br>
5、测试你的arm-elf-gcc编译器<br>
6、执行你的hello程序<br>
7、一个应用程序的开发实例<br>
8、编译并运行uClinux-dist-20030909.tar.gz<br>
9、加入网络功能<br>
10、安装完成SkyEye后，下一步将做什么？<br>
<br>
<br>
<font color="blue"><b>1、什么是SkyEye？</b></font><br>
<br>
SkyEye是开源软件的一个项目，SkyEye的目标是在Linux和Windows操作系统里提供一个完全的仿真环境。SkyEye仿真环境相当于一个嵌入式计<br>
<br>
算机系统，你可以在SkyEye里运行一些嵌入式Linux操作系统，如ARMLinux，uClinux，uc/OS-II(ucos-ii)等，并能分析和调试它们的源代码。<br>
<br>
如果你想知道关于SkyEye和嵌入式系统更详细的信息，请访问下面的站点：<br>
<a href="http://www.skyeye.org/" target="_blank">http://www.skyeye.org/</a><br>
<a href="http://www.skyeye.org/index_cn.html" target="_blank">http://www.skyeye.org/index_cn.html</a><br>
<br>
通过SkyEye能仿真下面的硬件：<br>
CPU核心：ARM7TDMI, 
            ARM720T, ARM9, StrongARM, XScale<br>
CPU: Atmel AT91/X40, Cirrus 
            CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, 
            CS89712, samsung 4510B, <br>
<br>
samsung 44B0(还不全)<br>
内存: RAM, ROM, 
            Flash<br>
周边设备: Timer, UART, ne2k网络芯片, LCD, 
            触摸屏等<br>
<br>
目前能在SkyEye上运行下面的操作系统和系统软件：<br>
uC/OSII-2.5.x(支持网络)<br>
uClinux(基于Linux2.4.x内核, 
            支持网络)<br>
ARM Linux 2.4.x/2.6.x<br>
lwIP on uC/OSII<br>
基于uC/OSII, 
            uClinux, ARM Linux的应用程序<br>
<br>
<br>
<font color="blue"><b>2.SkyEye可以做什么事情？</b></font><br>
1. 
            通过SkyEye可以帮助促进嵌入式系统的学习，在不需要额外硬件的情况下学习和分析uclinux操作系统和其它嵌入式操作系统，如ucosII等<br>
<br>
。<br>
2. 
            SkyEye可用于嵌入式系统的教学。<br>
3. 
            希望通过skyeye促进操作系统的研究，如ucosII，uclinux+RTAI，uclinux2.5.x等。<br>
4. 
            可以基于SkyEye进行仿真特定硬件模块的研究。<br>
5. 
            SkyEye可以作为嵌入式集成开发环境开发嵌入式系统（当然需要对SkyEye做大量的工作）。<br>
注：引自陈渝《SkyEye 
            Project FAQ》<br>
<br>
<br>
<font color="blue"><b>3、安装SkyEye</b></font><br>
<br>
到<a href="http://gro.clinux.org/projects/skyeye/" target="_blank">http://gro.clinux.org/projects/skyeye/</a>下载skyeye-0.7.0.tar.bz2包：<br>
<br>
tar 
            jxvf 
            skyeye-v0.7.0.tar.bz2<br>
<br>
进入解压后的skyeye目录，如果SkyEye的版本低于0.6.0,则运行下面的命令：<br>
<br>
./configure 
            --target=arm-elf --prefix=/usr/local --without-gtk-prefix 
            --without-gtk-exec-prefix 
            --disable-gtktest<br>
<br>
如果SkyEye的版本高于0.6.0,则运行下面的命令：<br>
<br>
./configure 
            --target=arm-elf 
            --prefix=/usr/local<br>
<br>
接下来执行：<br>
<br>
make<br>
make 
            install<br>
<br>
安装完成后执行skyeye<br>
<br>
注意：<br>
a.如果你使用的是Mandrake 
            Linux发行版,那么你在编译SkyEye时遇到错误，并且错误与readline, ncurse, 
            termcap等有关，你可以试试下面<br>
<br>
的方法：<br>
<br>
ln -s 
            /usr/include/ncurses/termcap.h 
            /usr/local/include/termcap.h<br>
<br>
接着再make和make 
            install看能否成功！<br>
b.如果你的Linux发行版是Debian Linux,那么不要使用gcc 2.95或是gcc 
            3.0，请使用gcc 
            3.2+<br>
c.gcc的版本要在2.96或以上<br>
d.如果SkyEye的版本大于0.6.0,那么使用LCD仿真需要在Linux系统里安装GTK软件。<br>
<br>
<br>
<font color="blue"><b>4、安装arm-elf交叉编译器</b></font><br>
<br>
下载arm-elf-tools-20030314.sh<br>
<a href="ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm" target="_blank">ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm</a><br>
或到<br>
<a href="ftp://166.111.8.229/OS/Embeded" target="_blank">ftp://166.111.8.229/OS/Embeded</a><br>
<br>
执行：<br>
chmod 
            a+x 
            arm-elf-tools-20030314.sh<br>
然后：<br>
./arm-elf-tools-20030314.sh<br>
<br>
ls 
            /usr/local/bin/<br>
<br>
你应能看到以arm-elf开头的可执行文件，其中arm-elf-gcc就是用来编译你目标平台的编译器的，当然还有一些小工具，后面将一一讲来。<br>
<br>
<br>
<font color="blue"><b>5、测试你的arm-elf-gcc编译器</b></font><br>
<br>
先写一个小程序hello.c<br>

            
<div style="margin: 5px 20px 20px;">
            <div class="smallfont" style="margin-bottom: 2px;">PHP 代码:</div>
            <div class="alt2" style="border: 1px inset ; margin: 0px; padding: 4px; overflow: auto; width: 640px; height: 258px;"><code style="white-space: nowrap;">
            </code><div style="text-align: left;" dir="ltr"><!-- php buffer start --><code><font color="#000000"><font color="#ff8000">#include &lt;stdio.h&gt; <br><br></font><font color="#0000bb">int main</font><font color="#007700">(</font><font color="#0000bb">void</font><font color="#007700">) <br>{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">int 
            i</font><font color="#007700">; 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;for(</font><font color="#0000bb">i 
            </font><font color="#007700">= </font><font color="#0000bb">0</font><font color="#007700">; </font><font color="#0000bb">i </font><font color="#007700">&lt; </font><font color="#0000bb">6</font><font color="#007700">; </font><font color="#0000bb">i</font><font color="#007700">++){ 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">printf</font><font color="#007700">(</font><font color="#dd0000">"i = %d&nbsp;&nbsp;"</font><font color="#007700">,</font><font color="#0000bb">i</font><font color="#007700">); 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">printf</font><font color="#007700">(</font><font color="#dd0000">"Hello, embedded linux!\n"</font><font color="#007700">); <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;return </font><font color="#0000bb">0</font><font color="#007700">; <br>} <br></font></font></code><!-- php buffer end --></div></div></div>
然后执行：<br>
<br>
arm-elf-gcc 
            -Wl,-elf2flt -o hello 
            hello.c<br>
<br>
-elf2flt参数是将elf文件格式转为flat文件格式，这个工具是在你安装交叉编译器产生的。<br>
<br>
或者你可以写个Makefile文件，执行：<br>
<br>
make<br>
<br>
这里是我的Makefile文件，仅供参考：<br>

            
<div style="margin: 5px 20px 20px;">
            <div class="smallfont" style="margin-bottom: 2px;">PHP 代码:</div>
            <div class="alt2" style="border: 1px inset ; margin: 0px; padding: 4px; overflow: auto; width: 640px; height: 322px;"><code style="white-space: nowrap;">
            </code><div style="text-align: left;" dir="ltr"><!-- php buffer start --><code><font color="#000000"><font color="#ff8000"># begin 
            <br><br></font><font color="#0000bb">CC </font><font color="#007700">= 
            </font><font color="#0000bb">arm</font><font color="#007700">-</font><font color="#0000bb">elf</font><font color="#007700">-</font><font color="#0000bb">gcc <br><br>CFLAGS 
            </font><font color="#007700">= -</font><font color="#0000bb">D__PIC__ 
            </font><font color="#007700">-</font><font color="#0000bb">fpic 
            </font><font color="#007700">-</font><font color="#0000bb">msingle</font><font color="#007700">-</font><font color="#0000bb">pic</font><font color="#007700">-</font><font color="#0000bb">base </font><font color="#007700">-</font><font color="#0000bb">O2 </font><font color="#007700">-</font><font color="#0000bb">pipe </font><font color="#007700">-</font><font color="#0000bb">Wall </font><font color="#007700">-</font><font color="#0000bb">g <br>LDFLAGS </font><font color="#007700">= 
            -</font><font color="#0000bb">Wl</font><font color="#007700">,-</font><font color="#0000bb">elf2flt <br><br>LIBS 
            </font><font color="#007700">= <br></font><font color="#0000bb">OBJS 
            </font><font color="#007700">= </font><font color="#0000bb">hello</font><font color="#007700">.</font><font color="#0000bb">o <br><br>all</font><font color="#007700">:&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">hello <br><br>hello</font><font color="#007700">:&nbsp;&nbsp;$(</font><font color="#0000bb">OBJS</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(</font><font color="#0000bb">CC</font><font color="#007700">) $(</font><font color="#0000bb">CFLAGS</font><font color="#007700">) $(</font><font color="#0000bb">LDFLAGS</font><font color="#007700">) -</font><font color="#0000bb">o hello </font><font color="#007700">$(</font><font color="#0000bb">OBJS</font><font color="#007700">) $(</font><font color="#0000bb">LIBS</font><font color="#007700">) <br><br></font><font color="#0000bb">clean</font><font color="#007700">: 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">rm </font><font color="#007700">-</font><font color="#0000bb">rf </font><font color="#007700">*.</font><font color="#0000bb">o </font><font color="#007700">*.</font><font color="#0000bb">elf </font><font color="#007700">*.</font><font color="#0000bb">gdb hello <br><br></font><font color="#ff8000"># end 
            <br></font></font></code><!-- php buffer end --></div></div></div>
如果编译通过，就会产生hello可执行文件。用下面的命令：<br>
<br>
file 
            hello<br>
<br>
你会发现，它是BFLT(binary 
            FLAT)，你目标平台所支持的文件格式。<br>
<br>
<br>
<font color="blue"><b>6、执行你的hello程序</b></font><br>
<br>
这里，我们将借助genromfs这个小工具来完成测试，这个工具就是你在安装交叉编译器时产生的，你可以直接使用它。<br>
<br>
到<a href="http://gro.clinux.org/projects/skyeye/%E4%B8%8B%E8%BD%BDskyeye-binary-testutils-1.0.4.tar.bz2" target="_blank">http://gro.clinux.org/projects/skyeye/下载skyeye-binary-testutils-1.0.4.tar.bz2</a>包：<br>
<br>
tar 
            jxvf skyeye-binary-testutils-1.0.4.tar.bz2<br>
<br>
cd 
            testsuits/at91/uclinux2(当然你还可以用别的)<br>
<br>
mkdir 
            romfs(建一个目录，后面用)<br>
<br>
mount -o loop boot.rom /mnt/xxx<br>
<br>
cp -r 
            /mnt/xxx/* 
            romfs<br>
<br>
另外，把你编译好的可执行程序拷贝到/romfs/bin目录里，这里就是hello了！<br>
<br>
genromfs 
            -f boot.rom -d romfs/<br>
<br>
注：可以用genromfs 
            -h来获得帮助！<br>
<br>
OK！执行下面的命令：<br>
<br>
skyeye 
            linux<br>
<br>
(skyeye)target 
            sim<br>
<br>
(skyeye)load<br>
<br>
(skyeye)run<br>
<br>
kernel 
            start.....<br>
<br>
很熟悉了吧。。。<br>
<br>
cd 
            /bin<br>
<br>
hello<br>
<br>
可以看到结果了吗？<br>
<br>
其实到了这一步，你就可以开发自己的程序了！<br>
<br>
<br>
<font color="blue"><b>7、一个应用程序的开发实例</b></font><br>
<br>
下面介绍的程序主要是完成一个网络应用，网络应用的标准模型是客户机-服务器模型，它的主要执行过程如下:<br>
(1)系统启动服务器执行。服务器完成一些初始化操作，然后进入睡眠状态，等待客户机请求;<br>
(2)在网络的某台机器上，用户执行客户机程序;<br>
(3)客户机进程与服务器进程建立一条连接;<br>
(4)连接建立之后，客户机通过网络向服务器发出请求，请求某种服务;<br>
(5)服务器接收到客户机请求后，根据客户机请求的内容进行相应的处理，然后将处理结果返回;<br>
(6)服务器断开与客户机的连接，继续睡眠，等待其他客户机的请求;<br>
<br>
Linux系统中的很多服务器是在系统初启时启动的，如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器<br>
<br>
进程处于睡眠状态，等待客户机的请求。<br>
<br>
下面这两个客户机-服务器程序比较简单，主要是对网络客户机-服务器模型的实际运行有大致印象。这个客户机-服务器的操作过程非常简单：<br>
<br>
客户机与服务器建立连接之后，服务器向客户机返回一条消息。<br>
<br>
服务器程序的源代码如下：<br>

            
<div style="margin: 5px 20px 20px;">
            <div class="smallfont" style="margin-bottom: 2px;">PHP 代码:</div>
            <div class="alt2" style="border: 1px inset ; margin: 0px; padding: 4px; overflow: auto; width: 640px; height: 498px;"><code style="white-space: nowrap;">
            </code><div style="text-align: left;" dir="ltr"><!-- php buffer start --><code><font color="#000000"><font color="#ff8000">/* 
            tcpserver.c */ <br>#include &lt;stdlib.h&gt; <br>#include 
            &lt;stdio.h&gt; <br>#include &lt;errno.h&gt; <br>#include 
            &lt;string.h&gt; <br>#include &lt;netdb.h&gt; <br>#include 
            &lt;sys/types.h&gt; <br>#include &lt;netinet/in.h&gt; <br>#include 
            &lt;sys/socket.h&gt; <br><br>#define WAITBUF 10 <br><br></font><font color="#0000bb">int main</font><font color="#007700">(</font><font color="#0000bb">int argc</font><font color="#007700">, </font><font color="#0000bb">char </font><font color="#007700">*</font><font color="#0000bb">argv</font><font color="#007700">[]) <br>{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">int 
            sockfd</font><font color="#007700">, </font><font color="#0000bb">new_fd</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">struct 
            sockaddr_in server_addr</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">struct 
            sockaddr_in client_addr</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">unsigned int 
            sin_size</font><font color="#007700">, </font><font color="#0000bb">portnumber</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">char 
            hello</font><font color="#007700">[]=</font><font color="#dd0000">"Hello! Socket communication world!\n"</font><font color="#007700">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">argc </font><font color="#007700">!= </font><font color="#0000bb">2</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Usage:%s portnumber\a\n"</font><font color="#007700">, 
            </font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">0</font><font color="#007700">]); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">portnumber </font><font color="#007700">= </font><font color="#0000bb">atoi</font><font color="#007700">(</font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">1</font><font color="#007700">])) &lt; </font><font color="#0000bb">0</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Usage: %s portnumber error\a\n"</font><font color="#007700">, </font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">0</font><font color="#007700">]); <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">sockfd </font><font color="#007700">= </font><font color="#0000bb">socket</font><font color="#007700">(</font><font color="#0000bb">AF_INET</font><font color="#007700">, </font><font color="#0000bb">SOCK_STREAM</font><font color="#007700">, </font><font color="#0000bb">0</font><font color="#007700">)) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Socket error:%s\n\a"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">bzero</font><font color="#007700">(&amp;</font><font color="#0000bb">server_addr</font><font color="#007700">, </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">struct sockaddr_in</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_family </font><font color="#007700">= </font><font color="#0000bb">AF_INET</font><font color="#007700">; 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_addr</font><font color="#007700">.</font><font color="#0000bb">s_addr </font><font color="#007700">= </font><font color="#0000bb">htonl</font><font color="#007700">(</font><font color="#0000bb">INADDR_ANY</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_port </font><font color="#007700">= </font><font color="#0000bb">portnumber</font><font color="#007700">; 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">bind</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">,(</font><font color="#0000bb">struct sockaddr </font><font color="#007700">*)(&amp;</font><font color="#0000bb">server_addr</font><font color="#007700">), </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">struct sockaddr</font><font color="#007700">)) == 
            -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Bind error:%s\n\a"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">listen</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">, </font><font color="#0000bb">WAITBUF</font><font color="#007700">) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Listen error:%s\n\a"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;while(</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">sin_size </font><font color="#007700">= </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">struct sockaddr_in</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">new_fd </font><font color="#007700">= </font><font color="#0000bb">accept</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">, (</font><font color="#0000bb">struct sockaddr </font><font color="#007700">*)(&amp;</font><font color="#0000bb">client_addr</font><font color="#007700">), 
            &amp;</font><font color="#0000bb">sin_size</font><font color="#007700">)) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">( </font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Accept error:%s\n\a"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Server get connection from %s\n"</font><font color="#007700">, </font><font color="#0000bb">inet_ntoa</font><font color="#007700">(</font><font color="#0000bb">client_addr</font><font color="#007700">.</font><font color="#0000bb">sin_addr</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">send</font><font color="#007700">(</font><font color="#0000bb">new_fd</font><font color="#007700">, </font><font color="#0000bb">hello</font><font color="#007700">, </font><font color="#0000bb">strlen</font><font color="#007700">(</font><font color="#0000bb">hello</font><font color="#007700">), </font><font color="#0000bb">0</font><font color="#007700">) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Write Error:%s\n"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">close</font><font color="#007700">(</font><font color="#0000bb">new_fd</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">close</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">0</font><font color="#007700">); <br>} <br></font></font></code><!-- php buffer end --></div></div></div>
<br>
给服务器程序写一个Makefile文件，如下：<br>

            
<div style="margin: 5px 20px 20px;">
            <div class="smallfont" style="margin-bottom: 2px;">PHP 代码:</div>
            <div class="alt2" style="border: 1px inset ; margin: 0px; padding: 4px; overflow: auto; width: 640px; height: 322px;"><code style="white-space: nowrap;">
            </code><div style="text-align: left;" dir="ltr"><!-- php buffer start --><code><font color="#000000"><font color="#ff8000"># start 
            <br><br></font><font color="#0000bb">CC </font><font color="#007700">= 
            </font><font color="#0000bb">arm</font><font color="#007700">-</font><font color="#0000bb">elf</font><font color="#007700">-</font><font color="#0000bb">gcc <br><br>CFLAGS 
            </font><font color="#007700">= -</font><font color="#0000bb">D__PIC__ 
            </font><font color="#007700">-</font><font color="#0000bb">fpic 
            </font><font color="#007700">-</font><font color="#0000bb">msingle</font><font color="#007700">-</font><font color="#0000bb">pic</font><font color="#007700">-</font><font color="#0000bb">base </font><font color="#007700">-</font><font color="#0000bb">O2 </font><font color="#007700">-</font><font color="#0000bb">pipe </font><font color="#007700">-</font><font color="#0000bb">Wall </font><font color="#007700">-</font><font color="#0000bb">g <br>LDFLAGS </font><font color="#007700">= 
            -</font><font color="#0000bb">Wl</font><font color="#007700">,-</font><font color="#0000bb">elf2flt <br><br>LIBS 
            </font><font color="#007700">= <br></font><font color="#0000bb">OBJS 
            </font><font color="#007700">= </font><font color="#0000bb">tcpserver</font><font color="#007700">.</font><font color="#0000bb">o <br><br>all</font><font color="#007700">:&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">tcpserver <br><br>tcpser</font><font color="#007700">:&nbsp;&nbsp;$(</font><font color="#0000bb">OBJS</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;$(</font><font color="#0000bb">CC</font><font color="#007700">) $(</font><font color="#0000bb">CFLAGS</font><font color="#007700">) $(</font><font color="#0000bb">LDFLAGS</font><font color="#007700">) -</font><font color="#0000bb">o tcpserver </font><font color="#007700">$(</font><font color="#0000bb">OBJS</font><font color="#007700">) $(</font><font color="#0000bb">LIBS</font><font color="#007700">) <br><br></font><font color="#0000bb">clean</font><font color="#007700">: 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">rm 
            </font><font color="#007700">-</font><font color="#0000bb">rf 
            </font><font color="#007700">*.</font><font color="#0000bb">o 
            </font><font color="#007700">*.</font><font color="#0000bb">elf 
            </font><font color="#007700">*.</font><font color="#0000bb">gdb hello 
            <br><br></font><font color="#ff8000"># end <br></font></font></code><!-- php buffer end --></div></div></div>
<br>
客户机程序的源代码如下：<br>

            
<div style="margin: 5px 20px 20px;">
            <div class="smallfont" style="margin-bottom: 2px;">PHP 代码:</div>
            <div class="alt2" style="border: 1px inset ; margin: 0px; padding: 4px; overflow: auto; width: 640px; height: 498px;"><code style="white-space: nowrap;">
            </code><div style="text-align: left;" dir="ltr"><!-- php buffer start --><code><font color="#000000"><font color="#ff8000">/* 
            tcpclient.c */ <br>#include &lt;stdlib.h&gt; <br>#include 
            &lt;stdio.h&gt; <br>#include &lt;errno.h&gt; <br>#include 
            &lt;string.h&gt; <br>#include &lt;netdb.h&gt; <br>#include 
            &lt;sys/types.h&gt; <br>#include &lt;netinet/in.h&gt; <br>#include 
            &lt;sys/socket.h&gt; <br><br>#define RECVBUFSIZE 1024 
            <br><br></font><font color="#0000bb">int main</font><font color="#007700">(</font><font color="#0000bb">int argc</font><font color="#007700">, </font><font color="#0000bb">char </font><font color="#007700">*</font><font color="#0000bb">argv</font><font color="#007700">[]) <br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">int sockfd</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">char 
            buffer</font><font color="#007700">[</font><font color="#0000bb">RECVBUFSIZE</font><font color="#007700">]; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">struct 
            sockaddr_in server_addr</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">int 
            portnumber</font><font color="#007700">, </font><font color="#0000bb">nbytes</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">argc 
            </font><font color="#007700">!= </font><font color="#0000bb">3</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Usage:%s hostname portnumber\a\n"</font><font color="#007700">, </font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">0</font><font color="#007700">]); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br><br>&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">portnumber</font><font color="#007700">=</font><font color="#0000bb">atoi</font><font color="#007700">(</font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">2</font><font color="#007700">])) &lt; </font><font color="#0000bb">0</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">,</font><font color="#dd0000">"Usage:%s hostname portnumber\a\n"</font><font color="#007700">, </font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">0</font><font color="#007700">]); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">sockfd 
            </font><font color="#007700">= </font><font color="#0000bb">socket</font><font color="#007700">(</font><font color="#0000bb">AF_INET</font><font color="#007700">, </font><font color="#0000bb">SOCK_STREAM</font><font color="#007700">, </font><font color="#0000bb">0</font><font color="#007700">)) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Socket Error:%s\a\n"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">bzero</font><font color="#007700">(&amp;</font><font color="#0000bb">server_addr</font><font color="#007700">, </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">server_addr</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_family </font><font color="#007700">= </font><font color="#0000bb">AF_INET</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_port </font><font color="#007700">= </font><font color="#0000bb">portnumber</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">server_addr</font><font color="#007700">.</font><font color="#0000bb">sin_addr</font><font color="#007700">.</font><font color="#0000bb">s_addr </font><font color="#007700">= </font><font color="#0000bb">inet_addr</font><font color="#007700">(</font><font color="#0000bb">argv</font><font color="#007700">[</font><font color="#0000bb">1</font><font color="#007700">]); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;if(</font><font color="#0000bb">connect</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">, (</font><font color="#0000bb">struct sockaddr </font><font color="#007700">*)(&amp;</font><font color="#0000bb">server_addr</font><font color="#007700">), </font><font color="#0000bb">sizeof</font><font color="#007700">(</font><font color="#0000bb">struct sockaddr</font><font color="#007700">)) == 
            -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Connect Error:%s\a\n"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;if((</font><font color="#0000bb">nbytes 
            </font><font color="#007700">= </font><font color="#0000bb">recv</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">, </font><font color="#0000bb">buffer</font><font color="#007700">, </font><font color="#0000bb">RECVBUFSIZE</font><font color="#007700">, </font><font color="#0000bb">0</font><font color="#007700">)) == -</font><font color="#0000bb">1</font><font color="#007700">) 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;{ 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">fprintf</font><font color="#007700">(</font><font color="#0000bb">stderr</font><font color="#007700">, </font><font color="#dd0000">"Read Error:%s\n"</font><font color="#007700">, 
            </font><font color="#0000bb">strerror</font><font color="#007700">(</font><font color="#0000bb">errno</font><font color="#007700">)); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">1</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;} 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">buffer</font><font color="#007700">[</font><font color="#0000bb">nbytes</font><font color="#007700">]=</font><font color="#dd0000">'\0'</font><font color="#007700">; 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">printf</font><font color="#007700">(</font><font color="#dd0000">"I have received:%s\n"</font><font color="#007700">, 
            </font><font color="#0000bb">buffer </font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000bb">close</font><font color="#007700">(</font><font color="#0000bb">sockfd</font><font color="#007700">); 
            <br>&nbsp;&nbsp;&nbsp;&nbsp;exit(</font><font color="#0000bb">0</font><font color="#007700">); <br>} <br></font></font></code><!-- php buffer end --></div></div></div>
<br>
最后，skyeye-binary-testutils-1.1.0.tar.bz2/at91x40/uclinux1包里提取boot.rom，用步聚6中的方法，把tcpserver程序放在boot.rom的<br>
<br>
bin目录中<br>
<br>
在目标板上运行tcpserver 
            2000<br>
<br>
在主机上运行./tcpclient 10.0.0.2 2000<br>
<br>
看看结果! 
            <br>
<br>
程序的源码的注释因篇幅不在这给出，大家可以参考一些Linux网络编程的书籍，我也会在我的主页上更新一些资料，有需要的朋友可以去下载<br>
<br>
！<br>
<br>
<br>
<font color="blue"><b>8、编译并运行uClinux-dist-20030909.tar.gz</b></font><br>
<br>
到<a href="ftp://166.111.68.183/pub/embed/uclinux/soft/" target="_blank">ftp://166.111.68.183/pub/embed/uclinux/soft/</a><br>
或到<a href="ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist" target="_blank">ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist</a>下载<br>
uClinux-dist-20030909.tar.gz<br>
<br>
假设把它下载到/usr/src/目录下，然后依次执行下面的命令：<br>
<br>
tar 
            zxvf uClinux-dist-20030909.tar.gz<br>
cd 
            uClinux-dist/<br>
<br>
在图形方式下可用命令make xconfig<br>
或<br>
在命令行方式下用命令make 
            menuconfig<br>
<br>
vendor/product中选择GDB/ARMulator<br>
kernel版本选择2.4<br>
然后save 
            and exit<br>
<br>
运行下面这两条命：<br>
make 
            dep<br>
make<br>
<br>
此时在/usr/src/uClinux-dist/linux-2.4.x目录下会生成可执行文件linux<br>
在/usr/src/uClinux-dist/images/会生成romfs.img等文件<br>
<br>
在uClinux-dist目录下建立仿真AT91的skyeye配置文件skyeye.conf,内容如下：<br>
cpu: 
            arm7tdmi<br>
mach: at91<br>
mem_bank: map=M, type=RW, addr=0x00000000, 
            size=0x00004000<br>
mem_bank: map=M, type=RW, addr=0x01000000, 
            size=0x00400000<br>
mem_bank: map=M, type=R, addr=0x01400000, 
            size=0x00400000, file=images/romfs.img<br>
mem_bank: map=M, type=RW, 
            addr=0x02000000, size=0x00400000<br>
mem_bank: map=M, type=RW, 
            addr=0x02400000, size=0x00008000<br>
mem_bank: map=M, type=RW, 
            addr=0x04000000, size=0x00400000<br>
mem_bank: map=I, type=RW, 
            addr=0xf0000000, 
            size=0x10000000<br>
<br>
<br>
这个时候就可以用skyeye来调试运行kernel了，在/usr/src/uClinux-dist执行如下命令：<br>
<br>
skyeye 
            linux-2.4.x/linux<br>
<br>
(skyeye)target 
            sim<br>
<br>
(skyeye)load<br>
<br>
(skyeye)run<br>
<br>
kernel 
            start.....<br>
<br>
注意:<br>
要在skyeye.conf所在目录下执行skyeye 
            linux-2.4.x/linux<br>
<br>
<br>
<font color="blue"><b>9、加入网络功能</b></font><br>
a.用root用户进行操作。<br>
b.你要看你的/lib/modules/'uname 
            -r'/kernel/drivers/net/目录里有没有tun.o<br>
如果没有的话你就需要编译你的linux内核来获得tun.o了。<br>
c.(1)运行tun设备模块：<br>
<br>
#insmod 
            /lib/modules/'uname 
            -r'/kernel/drivers/net/tun.o<br>
<br>
如果你没有该设备，那你就要用下面的命令来创建它：<br>
<br>
#mkdir 
            /dev/net<br>
#mknod /dev/net/tun c 10 
            200<br>
<br>
(2)运行vnet(虚拟集线器)设备模块(这一步不是必需的)：<br>
获取vnet的源码，然后创建设备：<br>
<br>
#mknod 
            /dev/net/vnet c 10 201<br>
#chmod 666 
            /dev/net/vnet<br>
<br>
创建vnet.o<br>
#make 
            vnet.o<br>
<br>
插入模块vnet.o<br>
#insmod 
            vnet.o<br>
<br>
进入test目录，用test来测度vnet.o<br>
#cd 
            test<br>
#make<br>
#./testvnet1<br>
<br>
d.配置skyeye.conf文件<br>
<br>
cpu: 
            arm7tdmi<br>
mach: at91<br>
mem_bank: map=M, type=RW, addr=0x00000000, 
            size=0x00004000<br>
mem_bank: map=M, type=RW, addr=0x01000000, 
            size=0x00400000<br>
mem_bank: map=M, type=R, addr=0x01400000, 
            size=0x00400000, file=images/romfs.img<br>
mem_bank: map=M, type=RW, 
            addr=0x02000000, size=0x00400000<br>
mem_bank: map=M, type=RW, 
            addr=0x02400000, size=0x00008000<br>
mem_bank: map=M, type=RW, 
            addr=0x04000000, size=0x00400000<br>
mem_bank: map=I, type=RW, 
            addr=0xf0000000, size=0x10000000<br>
# format: state=on/off 
            mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd<br>
net: 
            state=on, mac=0:4:3:2:1:f, ethmod=tun, 
            hostip=10.0.0.1<br>
<br>
<br>
下面将对上面的一些参数作下说明：<br>
state=on/off意思是仿真的NIC(网络接口板)是有线的还是无线的；<br>
mac=仿真适配器的MAC地址；<br>
ethmod=tuntap/vnet在主机环境里使用的虚拟设备；<br>
hostip=意思是主机环境与keyeye交互用的IP<br>
格式: 
            state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet 
            hostip=dd.dd.dd.dd<br>
<br>
For example:<br>
#set nic info state=on/off 
            mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd<br>
net: 
            state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1<br>
或<br>
net: 
            state=on, mac=0:4:3:2:1:f, ethmod=vnet, 
            hostip=10.0.0.1<br>
<br>
注意：<br>
如果你想在同一时刻运行两个或更多的skyeye,那么请为每一个skyeye使用不同的skyeye.conf<br>
<br>
e.运行skyeye 
            linux-2.4.x/linux<img src ="http://www.cnitblog.com/ygb/aggbug/5503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/ygb/" target="_blank">YGB.Grushy</a> 2005-12-17 11:39 <a href="http://www.cnitblog.com/ygb/articles/5503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>