历史上的今天
返回首页

历史上的今天

今天是:2025年02月26日(星期三)

正在发生

2020年02月26日 | goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中

2020-02-26 来源:eefocus

本文内容概要:详细描述了移植goAhead 2.5到S3C2440的linux系统的过程、步骤、遇到的问题及其解决方法。


开发环境:


        宿    主   机:window XP;


        虚    拟   机:ubuntu9.10;


        交叉编译器:arm-uclibc-gcc(arm-linux-gcc-4.3.2可以顺利编译通过)

———————————————————————————————————————————————————————————————————

1. GoAhead Web服务器介绍

goAhead Web服务器,小巧、精致,提供了值得称道的性能,特别适合于嵌入式系统,因此,在很多嵌入式产品如路由器中都用到了goAhead作为嵌入式web服务器。


goAhead Web服务器,具有如下特点:


支持ASP;

嵌入式的JavaScript,即Ejscript;

支持内存中的CGI处理;

快速响应,每秒中可处理超过65个请求;

符合HTTP1.0/HTTP1.1标准;

拥有众多扩展API,方便用户开发;

支持SSL3.0(Secure Sockets Layer),如MatrixSSL(最新版本为:MatrixSSL 3-2);

支持用户群组管理;

支持DAA访问认证;

占用很小内存,如果不包含SSL,仅要求60K内存;包含SSL,要求500K内存;

Web页面可存在于ROM或文件系统中;

支持多种操作系统,如linux、wince、vxworks等等;

当前最新版本为:WebServer 2.5,本次移植即是这个版本。


2. 获取Goahead源码包

地址为:http://www.goahead.com/products/webserver/Download.aspx,当前最新版本为:WebServer 2.5 


注:当前下载源码包,需要填写一些个人资料才能下载。


下载后,解压压缩包:


#tar -xzvf webs-2-5.tar.gz


#cd webs-2-5/


3. goAhead源码结构

进入goAhead的源码目录webs-2-5/,很容易了解其源码结构。


webs-2-5/


        | 各种OS移植子目录,分别有:CE、ECOS、LINUX、LYNX、MACOSX、NW、QNX4、VXWORKS、WIN


        | utils:当前只有webcomp.c,即网页编译器 


        | www:存放web网页


        | wwwdemo:goAhead带的demo网页,里面包含了goAhead的一些文档


        | goAhead服务器源程序文件(C程序文件)


从上面可以看到,goAhead支持window系统的,有兴趣的可以在PC机上移植试试。


得到源码后,建议用source insight等工具建一个goAhead工程,便于代码的阅读或者查询API函数等。


4. goAhead自带帮助文档

进入goAhead的wwwdemo目录,找到Webs25GettingStarted.pdf文件,这就是goAhead带的帮助文档,移植前,建议先看下。


5. GoAhead Web服务器移植到arm-linux步骤

在获取源码包并解压后,现在把goAhead移植到arm-linux中,arm指S3C2440,linux-2.6.30.4。


移植步骤很简单,基本上在编译阶段不会出现什么问题,而且这几个步骤在网上诸多博客中都有说明。但在测试服务器的时候,遇到了问题,在浏览器死活都打不开网页,不过,最终还是解决了,请看下面说明。


5.1 修改Makefile文件

进入goAhead源码下的LINUX目录,用UE打开Makefile文件。


Makefile文件默认是虚拟机的本身的GCC编译器,因此,指定其交叉编译器,注意,交叉编译器的版本应与你的文件系统用的交叉编译器一致。


在Makefile文件开头添加如下信息:


CROSS_COMPILE   =/usr/local/arm-uclibc/bin/arm-uclibc-  

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  


同时把Makefile中的语句:


matrixsslDir:=$(shell ls -d ../matrixssl-3-1*/)  


屏蔽掉。这一句是用来启动SSL matrixssl的,具体参考Webs25GettingStarted.pdf文档中的说明(Page8)。


5.2 修改LINUX/main.c文件:initWebs()函数中指定IP地址

由于LINUX/main.c文件:initWebs()函数中原程序无法正确获得服务器IP;因此置服务器一个静态IP地址。


修改如下:

/* 

 *  Define the local Ip address, host name, default home page and the 

 *  root web directory. 

 */  

 /* del by gyr 2011.09.17 

    if (gethostname(host, sizeof(host)) < 0) { 

        error(E_L, E_LOG, T("Can't get hostname")); 

        printf("initWebs::Can't get hostname.n");      // added by gyr 2011.09.17 

        return -1; 

    } 

    if ((hp = gethostbyname(host)) == NULL) { 

        error(E_L, E_LOG, T("Can't get host address")); 

        printf("initWebs::Can't get hostname...n");    // added by gyr 2011.09.17 

        return -1; 

    } 

    memcpy((char *) &intaddr, (char *) hp->h_addr_list[0], 

        (size_t) hp->h_length); 

*/  

    intaddr.s_addr = inet_addr(T("192.168.1.168"));     // added by gyr 2011.09.17  

5.3 编译:make clean;make

在shell中进入LINUX目录下,执行命令make clean;make即可编译通过。


编译通过后,在LINUX目录下,得到两文件,分别为:libwebs.a和webs可执行文件。用如下命令查看webs执行文件依赖的库文件:


/usr/local/arm-uclibc/bin/arm-uclibc-readelf -d webs  

其中,arm-uclibc-依你用的交叉编译器而定。


得到如下信息:

Dynamic segment at offset 0xf638 contains 18 entries:  

  Tag        Type                         Name/Value  

 0x00000001 (NEEDED)                     Shared library: [libfloat.so.1]  

 0x00000001 (NEEDED)                     Shared library: [libc.so.0]  

 0x0000000c (INIT)                       0x8e2c  

 0x0000000d (FINI)                       0x15aa0  

 0x00000004 (HASH)                       0x8130  

 0x00000005 (STRTAB)                     0x8924  

 0x00000006 (SYMTAB)                     0x83a4  

 0x0000000a (STRSZ)                      712 (bytes)  

 0x0000000b (SYMENT)                     16 (bytes)  

 0x00000015 (DEBUG)                      0x0  

 0x00000003 (PLTGOT)                     0x1f704  

 0x00000002 (PLTRELSZ)                   552 (bytes)  

 0x00000014 (PLTREL)                     REL  

 0x00000017 (JMPREL)                     0x8c04  

 0x00000011 (REL)                        0x8bec  

 0x00000012 (RELSZ)                      24 (bytes)  

 0x00000013 (RELENT)                     8 (bytes)  

 0x00000000 (NULL)                       0x0  


从上面可看到,webs依赖libc.so.0和libfloat.so.1两动态文件,查看文件系统中lib目录下是否包含了这两动态文件,如果没有,则需从交叉编译器安装路径中获取这两个动态库文件到文件系统lib目录中。


5.4 测试webs服务器

用FTP把webs执行文件传到目标板中,本人把其放到了/mnt/webs/目录中。


需要注意的是,在goAhead2.5版本中,web网页的根目录是在webs程序的../www或../wwwdemo(webs执行时带 -demo参数)中,这一点可查看LINUX/main.c文件中190行处代码和注释。因此,把goAhead源码目录下的www和wwwdemo两文 件夹传用FTP传到/mnt/目录下。


在PC机用IE浏览器浏览goAhead服务器的网页,输入http://192.168.1.168:8080/


192.168.1.168是目标板的IP地址即goAhead服务器的地址,8080是goAhead用的端口号,这是默认的端口号,定义在webs.h文件。


5.4.1 测试问题

用浏览器死活不管怎样,都打不开home.htm网页的,提示是404错误,意思是:


Access Error: Site or Page Not Found


Cannot open URL


5.4.2 不能打开网页的原因和解决方法

折腾许久,决定从源代码着手。最后定位在default.c文件中websDefaultHandler()函数中,这个函数是处理默认网页的。


具体代码段如下:

/* 

 *  We do whitelist validation in addition to standard URL validation. 

 *  The whitelist should really catch anything invalid first. 

 *  If the whitelist check fails, rebuild the list and try again. 

 *  Also validate if we are not on a secure connection, but the whitelist 

 *  entry has the SSL flag set, do not serve the page. 

 */  

#ifdef WEBS_WHITELIST_SUPPORT  

    if ((rc = websWhitelistCheck(wp->url)) < 0) {  

        websBuildWhitelist();  

        if ((rc = websWhitelistCheck(wp->url)) < 0) {  

            websError(wp, 404, T("Cannot open URL"));  

            return 1;  

        }  

    }  

    if (!(flags & WEBS_SECURE) && (rc & WHITELIST_SSL)) {  

        websError(wp, 500, T("HTTPS access required"));  

        return 1;  

    }  

#endif /* WEBS_WHITELIST_SUPPORT */  

问题就出现在上面这个代码中,我的理解是goAhead关于网页安全方面功能,即网页白名单(WHITELIST)功能支持。


把宏WEBS_WHITELIST_SUPPORT关闭,重新编译,再测试,OK了,可以打开网页了。


上述只是简单的移植测试,然我们最终的目的是要把goAhead移植到我们的应用程序中的,在大多数的应用中,它也只是应用程序中的一个模块,因此,后面的工作量还是蛮多的,包括SSL的移植等等。


6. 参考资料

http://www.docin.com/p-67202641.html

http://www.cnitblog.com/zouzheng/archive/2008/01/04/38464.html

http://www.dzjs.net/html/qianrushixitong/2009/0812/3890.html

http://blog.csdn.net/zyboy2000/article/details/6191266

http://www.bianceng.cn/webkf/aspx/201103/25071.htm

http://blog.chinaunix.net/space.php?uid=22982394&do=blog&id=116136

推荐阅读

史海拾趣

Crocus Technology公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

Avery Dennison公司的发展小趣事

Avery Dennison一直致力于技术创新和产品开发。例如,公司在水胶技术方面取得了显著进展,成功开发出环保且高效的水性乳液聚合物粘胶剂,成为第一家大规模供应这类产品的标签制造商。此外,公司还推出了具有智能功能的RFID标签产品组合,为零售、食品、物流、医疗等行业提供了数字化解决方案。这些创新产品不仅提升了公司的竞争力,也为客户创造了更大的价值。

长园维安(CYGWAYON)公司的发展小趣事

长园维安一直注重产品质量管理。公司建立了完善的质量管理体系,通过ISO9001、TS16949等认证,确保产品质量的稳定性和可靠性。此外,长园维安还积极推行6Sigma等质量管理方法,不断提高产品质量和客户满意度。这些措施使长园维安赢得了客户的信赖和好评。

CNC Tech公司的发展小趣事

CNC Tech公司深知,在竞争激烈的电子行业中,品质是赢得客户信任和市场口碑的关键。因此,公司始终坚持品质至上的原则,从原材料采购到生产制造的每一个环节都严格把控品质。CNC Tech还建立了完善的品质管理体系,通过严格的质量检测和持续的技术改进,确保每一台出厂的设备都能达到客户的期望和要求。正是凭借这种对品质的执着追求,CNC Tech赢得了广大客户的信赖和好评。

Elpac公司的发展小趣事

在电子行业的激烈竞争中,Elpac公司凭借其在电源管理领域的技术革新,逐渐崭露头角。公司创始人李明在创办之初就坚信,只有不断创新才能在市场中立足。他带领团队深入研究市场需求,不断推出具有创新性的电源管理产品。其中,一款高效节能的电源转换器在市场上引起了广泛关注,其出色的性能和稳定性赢得了客户的青睐。随着产品的热销,Elpac公司逐渐在电子行业中建立了自己的品牌地位。

Gigavac LLC公司的发展小趣事

在电子产品同质化日益严重的今天,Elpac公司始终坚持品质至上的原则。公司严格把控产品质量,从原材料采购到生产流程再到售后服务,每一个环节都力求做到最好。正是这种对品质的执着追求,让Elpac公司的产品在市场上脱颖而出。许多客户在体验过Elpac公司的产品后,都对其赞不绝口,成为了公司的忠实用户。

问答坊 | AI 解惑

利用光纤收发器实现长距离组网

在以前的工程施工中使用了大量光纤收发器进行组网,祥子对于这一类设备还是比较了解的,因此结合这次组网(也有以前组网)的经验,向大家介绍一下光纤收发器在网络组建过程中的使用。 最近这一个月以来一直在忙一个大工程,即市至县的数字电视传输 ...…

查看全部问答>

怎么才能入门ARM

我原先做51的,现在手头没项目,也比较空,在很多人都在疯狂的学习arm也也买了一块abcARM s3c2410a的开发板,原先说的好好的什么技术支持啊,点对点帮助啊,再付了钱之后便无影无中了,希望在这儿能找到一些跟我一样对ARM有着强烈兴趣但却苦于不知 ...…

查看全部问答>

MSCAN相关编程资料求助!!感激不尽!!

毕设在做一个用freescale的DSP56F8037做的CAN多点通信协议(主要内容就是收发程序加上上层网络协议),但是外网半天找不到可以参考的程序(太久没有写程序,完全SB了),就把官网上的DSP用户手册下下来看了半天 不知道这里有没有好心人指点下哪里 ...…

查看全部问答>

自学嵌入式,请教一些问题。

初中起,开始学电脑。 到现在为止,一直是自学。 高二时,觉得实在受不了学校里颓废的气氛,就退学了。到一个小公司打工,几乎现学现用的做了个ASP.NET的交通物流的站。那站是模块设计,在管理后台可以任意删减页面模块。感觉做的还不错。 然后 ...…

查看全部问答>

关于S3C2410的UART接收中断

我所做的是用S3C2410驱动ZLG500B读卡模块 以实现读卡功能 之间为UART通信 问: 在wince下 用 EVC 4 如何用C编写 arm的中断初始化 以及uart接收中断服务程序…

查看全部问答>

捕获按键

现在打开了2个Dialog,一个是CMain,一直打开不会关闭,还有一个CXXX窗体,是在CMain上方,这个是不确定的。当CXXX打开的时候,如何捕获硬键(上下左右这四个键)的消息呢?…

查看全部问答>

ucos ii 下GPRS模块通过拨号方式进行tcp连接,不知如何下手?

    现在mcu是stm32 芯片,gprs模块是华为gtm900 ,通过查找资料如果不用模块内部的协议栈的话,自己得在ucos ii上实现ppp协议与tcp/ip协议栈,现在在网上下载了ucip1-0-3,里面就是src 目录下,有相关代码,里面还有makefile,似乎应该在li ...…

查看全部问答>

STM32FLASH读保护测试,片子挂了,高手帮忙请进!

int main(void){   ....   FLASH_ReadOutProtection(ENABLE);   while(1)   {    ....   }}现在通过J-Link下载不了程序了。Debug  ...…

查看全部问答>

我在做一个并口单片机下载线出现不能对芯片“写”

       我今天做了一个并口的51单片机下载线但是只能读不能写,会出现下面这种情况,电路我是按照给的资料画的,然后对着给的电路图把板子走了一遍就是没找到原因,还希望大侠们帮帮我,不胜感激!!,还有我画的原理图,画的 ...…

查看全部问答>

MB9B506之CAN初探笔记

MB9B506之CAN初探笔记 见FM3 32-BIT MICROCONTROLLER MB9Axxx / MB9Bxxx SeriesPERIPHERAL MANUAL CAN Prescaler CAN分频器 哪里来的:   For PLL: PLL output            ...…

查看全部问答>