goAhead 2.5嵌入式web伺服器移植到arm9 2440 + linux中

來源:互聯網
上載者:User
文章目錄
  • 1. GoAhead Web伺服器介紹
  • 2. 擷取Goahead源碼包
  • 3. goAhead源碼結構
  • 4. goAhead內建協助文檔
  • 5. GoAhead Web伺服器移植到arm-linux步驟
  • 6. 參考資料

本文內容概要:詳細描述了移植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檔案開頭添加如下資訊:

view plain
  1. CROSS_COMPILE   =/usr/local/arm-uclibc/bin/arm-uclibc-  
  2. AS      = $(CROSS_COMPILE)as  
  3. LD      = $(CROSS_COMPILE)ld  
  4. CC      = $(CROSS_COMPILE)gcc  
  5. CPP     = $(CC) -E  
  6. AR      = $(CROSS_COMPILE)ar  
  7. NM      = $(CROSS_COMPILE)nm  
  8. STRIP   = $(CROSS_COMPILE)strip  
  9. OBJCOPY = $(CROSS_COMPILE)objcopy  
  10. OBJDUMP = $(CROSS_COMPILE)objdump  

同時把Makefile中的語句:

view plain
  1. 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地址。

修改如下:

view plain
  1. /* 
  2.  *  Define the local Ip address, host name, default home page and the 
  3.  *  root web directory. 
  4.  */  
  5.  /* del by gyr 2011.09.17 
  6.     if (gethostname(host, sizeof(host)) < 0) { 
  7.         error(E_L, E_LOG, T("Can't get hostname")); 
  8.         printf("initWebs::Can't get hostname.\n");      // added by gyr 2011.09.17 
  9.         return -1; 
  10.     } 
  11.     if ((hp = gethostbyname(host)) == NULL) { 
  12.         error(E_L, E_LOG, T("Can't get host address")); 
  13.         printf("initWebs::Can't get hostname...\n");    // added by gyr 2011.09.17 
  14.         return -1; 
  15.     } 
  16.     memcpy((char *) &intaddr, (char *) hp->h_addr_list[0], 
  17.         (size_t) hp->h_length); 
  18. */  
  19.     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執行檔案依賴的庫檔案:

view plain
  1. /usr/local/arm-uclibc/bin/arm-uclibc-readelf -d webs  

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

得到如下資訊:

view plain
  1. Dynamic segment at offset 0xf638 contains 18 entries:  
  2.   Tag        Type                         Name/Value  
  3.  0x00000001 (NEEDED)                     Shared library: [libfloat.so.1]  
  4.  0x00000001 (NEEDED)                     Shared library: [libc.so.0]  
  5.  0x0000000c (INIT)                       0x8e2c  
  6.  0x0000000d (FINI)                       0x15aa0  
  7.  0x00000004 (HASH)                       0x8130  
  8.  0x00000005 (STRTAB)                     0x8924  
  9.  0x00000006 (SYMTAB)                     0x83a4  
  10.  0x0000000a (STRSZ)                      712 (bytes)  
  11.  0x0000000b (SYMENT)                     16 (bytes)  
  12.  0x00000015 (DEBUG)                      0x0  
  13.  0x00000003 (PLTGOT)                     0x1f704  
  14.  0x00000002 (PLTRELSZ)                   552 (bytes)  
  15.  0x00000014 (PLTREL)                     REL  
  16.  0x00000017 (JMPREL)                     0x8c04  
  17.  0x00000011 (REL)                        0x8bec  
  18.  0x00000012 (RELSZ)                      24 (bytes)  
  19.  0x00000013 (RELENT)                     8 (bytes)  
  20.  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()函數中,這個函數是處理預設網頁的。

具體程式碼片段如下:

view plain
  1. /* 
  2.  *  We do whitelist validation in addition to standard URL validation. 
  3.  *  The whitelist should really catch anything invalid first. 
  4.  *  If the whitelist check fails, rebuild the list and try again. 
  5.  *  Also validate if we are not on a secure connection, but the whitelist 
  6.  *  entry has the SSL flag set, do not serve the page. 
  7.  */  
  8. #ifdef WEBS_WHITELIST_SUPPORT  
  9.     if ((rc = websWhitelistCheck(wp->url)) < 0) {  
  10.         websBuildWhitelist();  
  11.         if ((rc = websWhitelistCheck(wp->url)) < 0) {  
  12.             websError(wp, 404, T("Cannot open URL"));  
  13.             return 1;  
  14.         }  
  15.     }  
  16.     if (!(flags & WEBS_SECURE) && (rc & WHITELIST_SSL)) {  
  17.         websError(wp, 500, T("HTTPS access required"));  
  18.         return 1;  
  19.     }  
  20. #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
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.