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