[ZLG-ARM] Goahead在ucLinux下的移植

[复制链接]
 楼主| tmake 发表于 2009-7-7 13:18 | 显示全部楼层 |阅读模式
GoAhead&nbsp;WebServer采用开放源代码方式,任何人都可以下载、评估并修改代码,目的是为了使GoAhead&nbsp;WebServer成为市场上最领先的嵌入式Web服务器.<br /><br />重要特性:<br />---支持虚拟服务器&nbsp;<br />---可使用SNMP代理&nbsp;<br />---支持SSL&nbsp;v3&nbsp;<br />---具有搜索引擎&nbsp;<br />---支持ASP、JavaScript、CGI、DHTML&nbsp;<br />---容易移植和系统集成&nbsp;<br />---可不使用文件系统&nbsp;<br /><br />GoAhead&nbsp;Web&nbsp;服务器是一款主要面向嵌入式系统的WEB服务器,它的目标也许不在于目前的WEB服务器市场,而是面向当嵌入式系统深入我们的工作与生活的明天,那时,它也许会成为使用最广泛的WEB服务器。<br /><br />  GoAhead&nbsp;Web服务器是GoAhead公司的Embedded&nbsp;Management&nbsp;Framework产品的一部分,这个软件包主要用于解决未来嵌入式系统开发的相关问题。这款WEB服务器非常小巧,它的WIN&nbsp;CE版本编译后的大小还不到60k,它的输出通常也是面向一些小屏幕设备。在性能方面,使用一颗24MH&nbsp;z的68040处理器,它的响应速度为20次/秒,使用266MHz的Pentium处理器可以达到50次/秒的响应速度。<br /><br />  仅管它的体积非常小巧,GoAhead&nbsp;WEB服务器提供了不少的服务特性。它支持ASP,嵌入的JAVASCRPT与内存CGI处理。不过有人也许会置疑对嵌入式系统而言,对ASP的支持有否有这个必要。而嵌入的JAVASCRIPT解释引擎则是不得不然的选择,因为得用它创建动态服务器内容,而且ASP也要用到它。<br /><br />  到目前为止,GoAhead的源码完全免费,使用它无需交纳版税或者许可证费用。对一些硬件开发者而言,这种做法比较普遍,例如SUN旗下的众多开源系统。这样作的主要原因是GoAhead公司希望它成力未来嵌入式环境下的WEB服务器标准平台并看好日益增长的更智能化嵌入式设备的市场。<br /><br />  因为GoAhead发行包中包含C语言的源码和makefile,理论上,你可以在非嵌入式环境下很好的使用GoAhead&nbsp;Web服务器(正如我写这篇**时所做的)。它的参考平台有Windows&nbsp;CE,&nbsp;Wind&nbsp;River&nbsp;VxWorks,&nbsp;Linux,&nbsp;Lynx,&nbsp;QNX,与Windows&nbsp;95/98/NT。它基本上属于一个HTTP1.0标准的WEB服务器,对一些HTTP1.1的特性如(持久连接)也提供了支持。<br /><br />  无可否认,GoAhead WEB服务器是一款面向特定细分市场的产品,也许目前对于这个市场外的大多数人来说很难对它投以太多的专注。但众多的分析家和计算机产业领导者(包括LINUX之父Linus&nbsp;Torvalds)都相信在未来的计算机世界,智能化嵌入式系统将会扮演一个极在重要的角色,当这个市场成熟起来的时候,就是GoAhead大展站拳脚之时。<br /><br />  优点:免费,体积小巧,支持多平台,完全针对嵌入式系统设计,嵌入的JavaScript与动态数据页支持。<br /><br />  缺点:对ASP的支持意味着要依靠微软平台,很少的安全方面的考虑。<br />&nbsp;<br /> &nbsp;&nbsp;<br />下面我们打算在uclinux上移植Goahead的web服务器,现在先在uclinux下面要稍微改动一下代码.<br />源码改动的地方基本上是:<br /><br />1.把fork改为vfork<br />2.把gethostbyname函数替换掉.<br /><br />改动Goahead自带的makefile使其采用arm-elf-gcc编译并转换应用程序elf格式为flt就差不多了.下面是我的移植过程中记录的详细步骤:<br />首先到&nbsp;http://www.Goahead.com/webserver/webserver.htm&nbsp;下Goahead源码包,看一下web目录下的usr/doc等说明文件,修改Goahead/LINUX/makefile文件<br /><br />==================================================================<br />1.&nbsp;makefile&nbsp;中&nbsp;加了一个&nbsp;宏:<br /><br /><br />CFLAGS&nbsp;=&nbsp;-DWEBS&nbsp;-DUEMF&nbsp;-DOS='LINUX'&nbsp;-DLINUX&nbsp;$(UMSW)&nbsp;$(DASW)&nbsp;$(SSLSW)<br />$(IFMODSW)&nbsp;-D__NO_PACK<br />-D__NO_PACK&nbsp;是我自己加的。<br />__NO_PACK&nbsp;屏蔽Goahead编译是产生的#program&nbsp;警告,不加这个宏也没关系。<br /><br />2.&nbsp;修改Goahead/LINUX/Makefile<br /><br />LDFLAGS&nbsp;+=&nbsp;$(SSLLIB)&nbsp;$(IFMODLIB)&nbsp;-Wl,-elf2flt<br />-Wl,-elf2flt&nbsp;与“+”&nbsp;是自己加的。<br />CFLAGS&nbsp;添加&nbsp;-Wall&nbsp;-O2选项。(优化代码size与速度)<br />如下:<br />CFLAGS&nbsp;+=&nbsp;-Wall&nbsp;-O2&nbsp;-DWEBS&nbsp;-DUEMF&nbsp;-DOS='LINUX'&nbsp;-DLINUX&nbsp;$(UMSW)&nbsp;$(DASW)<br />$(SSLSW)&nbsp;$(IFMODSW)&nbsp;-D__NO_PACK<br /><br />3.&nbsp;修改ucLinux下makefile文件,使其支持&nbsp;add&nbsp;costume&nbsp;vender/user&nbsp;application.<br />可以略过这一步,直接在Goahead,LINUX目录下make&nbsp;clean;make&nbsp;然后把webs.exe文件<br />copy到&nbsp;romfs目录下。<br />(在romfs下建立home\web\&nbsp;目录)<br />详见&nbsp;12.编译过程。<br /><br /><br />在uclinux下make&nbsp;clean操作会清空romfs目录,所以最好在Goahead的makefile里加入如下几段(在make&nbsp;romfs时会自动拷贝到/home/web/目录下。)<br />romfs:&nbsp;$(ROMFSINST)&nbsp;/home/web/$(NAME)<br />同时在uclinux/venders/samsung/44b0/makefile里ROMFS_DIRS&nbsp;=&nbsp;bin&nbsp;dev&nbsp;etc&nbsp;home&nbsp;lib&nbsp;mnt&nbsp;proc&nbsp;usr&nbsp;var&nbsp;home/httpd&nbsp;home/web<br />/home/httpd&nbsp;home/web&nbsp;是自己添加的。<br /><br />4.在&nbsp;Goahead/LINUX/makefile&nbsp;开头添加<br />#####################################################################<br />CROSS_COMPILE&nbsp;=&nbsp;arm-elf-<br />AS&nbsp;=&nbsp;$(CROSS_COMPILE)as<br />LD&nbsp;=&nbsp;$(CROSS_COMPILE)ld<br />CC&nbsp;=&nbsp;$(CROSS_COMPILE)gcc<br />CPP&nbsp;=&nbsp;$(CC)&nbsp;-E<br />AR&nbsp;=&nbsp;$(CROSS_COMPILE)ar<br />NM&nbsp;=&nbsp;$(CROSS_COMPILE)nm<br />STRIP&nbsp;=&nbsp;$(CROSS_COMPILE)strip<br />OBJCOPY&nbsp;=&nbsp;$(CROSS_COMPILE)objcopy<br />OBJDUMP&nbsp;=&nbsp;$(CROSS_COMPILE)objdump<br />####################################################################<br />同时把&nbsp;DEBUG&nbsp;=&nbsp;-g&nbsp;-Wall&nbsp;改为<br />DEBUG&nbsp;=&nbsp;-Wall<br />很明显,这里是修改为gcc为arm-elf-gcc编译,同时去掉debug信息。<br />或者你可以直接把几个&nbsp;$(cc)&nbsp;直接修改为&nbsp;arm-elf-gcc&nbsp;.<br />修改Goahead源码部分:<br />==================================================================<br /><br />5.&nbsp;uclinux&nbsp;采用&nbsp;uClib-c&nbsp;(我得lib是用uClib-c的,用uClibc没有试过)<br /><br />6.&nbsp;修改所有arm-elf-gcc&nbsp;不认识的宏。把这些宏改写成一行就可以了。一般就是因为'\'等.<br /><br />7.&nbsp;fork&nbsp;改为&nbsp;vfork&nbsp;(main.c&nbsp;(LINUX)&nbsp;)<br /><br />8.&nbsp;webs.c&nbsp;Line&nbsp;1434<br />fmtAlloc(&msgbuf,&nbsp;WEBS_MAX_URL&nbsp;+&nbsp;80,<br />T('\r<br />\<br />T('This&nbsp;document&nbsp;has&nbsp;moved&nbsp;to&nbsp;a&nbsp;new&nbsp;location.\r<br />\<br />T('Please&nbsp;update&nbsp;your&nbsp;documents&nbsp;to&nbsp;reflect&nbsp;the&nbsp;new&nbsp;location.\r<br />\<br /><br />T('\r<br />'),&nbsp;url);<br />arm-elf-gcc似乎不认识&nbsp;“\”这个符合,只能把fmtAlloc语句写成一行。<br /><br />9.&nbsp;uemf.h&nbsp;文件&nbsp;LINE&nbsp;242<br />去除&nbsp;timeval的定义,在uclinux下重复定义了。<br />#if&nbsp;(defined&nbsp;(LINUX)&nbsp;&&&nbsp;!defined&nbsp;(_STRUCT_TIMEVAL))<br />struct&nbsp;timeval<br />{<br />time_t&nbsp;tv_sec;&nbsp;/*&nbsp;Seconds.&nbsp;*/<br />time_t&nbsp;tv_usec;&nbsp;/*&nbsp;Microseconds.&nbsp;*/<br />};<br />#define&nbsp;_STRUCT_TIMEVAL&nbsp;1<br />#endif<br /><br />10.&nbsp;main.c&nbsp;(LINUX)&nbsp;中<br />websGetCgiCommName(..)函数中<br />把pname1&nbsp;=&nbsp;tempnam(NULL,&nbsp;T('cgi'));&nbsp;改为<br />pname1&nbsp;=&nbsp;(char_t*)mkstemp(&nbsp;T('cgi'));&nbsp;(估计不改tempnam&nbsp;也无什么大碍)<br /><br />11.<br />main.c(linux)&nbsp;文件<br /><br /><br />initwebs(...)&nbsp;函数中:<br />/*<br />if&nbsp;((hp&nbsp;=&nbsp;gethostbyname(host))&nbsp;==&nbsp;NULL)&nbsp;{<br />error(E_L,&nbsp;E_LOG,&nbsp;T('Can't&nbsp;get&nbsp;host&nbsp;address'));<br />fprintf(stderr,'initWebs:&nbsp;host&nbsp;name&nbsp;%s\r<br />',host);<br />return&nbsp;-1;<br />}<br />memcpy((char&nbsp;*)&nbsp;&intaddr,&nbsp;(char&nbsp;*)&nbsp;hp-&gth_addr_list[0],<br />(size_t)&nbsp;hp-&gth_length);<br />*/<br />intaddr.s_addr&nbsp;=&nbsp;inet_addr('192.168.0.128');&nbsp;//&nbsp;44B0的网卡IP<br />gethostbyname函数在此处无效,我屏蔽了这段,不得已只能直接写入IP地址给<br />intaddr了。<br />在不能调试的情况下,gethostbyname这一段实在是花了我大半的时间。<br />最要命的是,我的44b0板子里的tftp&nbsp;死活不工作,没办法只好一边一边的编译内核,<br />下载到板子上运行查看串口的数据。<br />不然可以用tftp把webs&nbsp;通过网络下载到板子运行,就不用编译内核了。<br /><br />12.&nbsp;编译过程:<br />&gtcd&nbsp;uclinux目录下<br />&gtmake&nbsp;config;make&nbsp;clean;<br />&gtmake&nbsp;lib_only;make&nbsp;user_only<br />&gtmake&nbsp;romfs<br />&gtcd&nbsp;进入Goahead/LINUX目录<br />&gtmake&nbsp;clean<br />&gtmake<br />&gtcp&nbsp;-i&nbsp;webs.exe&nbsp;/romfs/home/web/webs.exe&nbsp;(&nbsp;webs.exe程序编译后大概&nbsp;80k左<br />右吧。)<br />&gtcd&nbsp;到uclinux目录下<br />&gtmake&nbsp;image<br />&gtmake<br /><br />13.&nbsp;要关闭IE的代理。<br />先ping一下&nbsp;目标板,看网络通不通,或者在目标板子上ping一下pc机。<br />IP地址就是&nbsp;第11步中&nbsp;指定的IP&nbsp;。<br />然后<br />&gt&nbsp;cd&nbsp;/home/web/<br />&gt&nbsp;./webs<br />启动&nbsp;Goahead。&nbsp;网页可以放在与webs.exe&nbsp;同一级的web目录下。&nbsp;web目录是Goahead源<br /><br /><br />在Goahead运行中,有网页请求的时候,我的超级终端中会出现如下东东:<br />“&gt&nbsp;skput:&nbsp;over:&nbsp;0c071aa4:272&nbsp;put:272&nbsp;dev:eth0&lt2&gtkernel&nbsp;BUG&nbsp;at&nbsp;skbuff.c:92!”<br />不知道什么意思。<br /><br />14.&nbsp;Goahead/web&nbsp;下有详细的文档说明。关于&nbsp;configure&nbsp;跟install的一定要看。<br />
postcode 发表于 2009-7-7 13:21 | 显示全部楼层

好帖,顶

  
chun1chun 发表于 2009-7-7 13:41 | 显示全部楼层

不错的,写的

  
armqt 发表于 2009-7-7 13:49 | 显示全部楼层

拜读了

  
 楼主| tmake 发表于 2009-7-9 13:24 | 显示全部楼层

强……

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

179

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

40

主题

179

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部