關鍵詞: ARM uClinux web伺服器 1 引言 隨著互連網在全球的飛速發展,網路技術廣泛應用於各種企業和工業系統,越來越多的資訊化產品需要能夠接入互連網通過web頁面進 行遠端存取和控制。嵌入式web伺服器是當今研究嵌入式[1]的應用熱點,可廣泛的應用到工業裝置,自動化農業,資訊化家電,遠程監控警示系統等。目前正 在開發的嵌入式系統中,將近一半的項目都選用Linux作為嵌入式操 作系統,而uClinux是一個經過對標準Linux核心改動,高度最佳化、代碼緊湊的嵌入式Linux[2]它保留了Linux的大多數優點,具有良好的 移植性、優秀的網路功能。目前,基於三星S3C4510b與uClinux下web伺服器已經實現,而基於S3C44B0與uClinux下web伺服器 的實現尚不多見。本文通過網口控制晶片RTL8109AS與S3C44B0的串連,實現了硬體設計,採用uClinux原始碼和boa伺服器原始碼的編譯 以及CGI網關介面程式的編寫實現了軟體設計,在自行設計的S3C44B0開發板上實現了基於uClinux下的boa伺服器和動態網頁CGI網關介面程 序,通過瀏覽器輸入開發板的IP地址就可以動態地訪問開發板上的網頁。 2 硬體方案實現 本文設計的ARM開發板的核心是三星(Samsung)S3C44B0微處理器,是基於ARM7TDMI[3]的 RISC型CPU,是性價比較高的嵌入式32位處理器之一。S3C44B0晶片包含一個使用了66MHz和單周期精簡指令處理器(ARM7TDMI),內 建8k快取器,2通道通用DMA、2通道外設DMA並具有外部請求引腳、2通道UART帶有握手協議、11通道SIO、1通道多主IIC-BUS控制 器、5個PWM定時器、71個通用I/O口等等並且能夠與常用的外圍裝置實現無縫串連,從而簡化了外圍電路設計,降低了產品成本、體積和功耗。本文自行設 計的開發板使用16MSDRAM和2Mflash的記憶體構架。其中Flash型號是SST39VF160,主要用於存放BIOS程式、uClinux核心 映象以及ROMFS檔案系統。SDRAM則採用兩片HY57V641620,共同組成16M、32位寬的系統主儲存空間。外設方面,採用CS4334晶片進 行音頻擴充,採用PDIUSBD12晶片擴充了一個USB介面,串口控制晶片採用常見的MAX232,網口控制晶片採用Realtek公司的 RTL8109AS擴充1個10/100M的網卡裝置。開發板架構1所示: 圖1 開發板整體架構圖 3 軟體設計 3.1 uClinux在S3C44B0上的移植 本開發板採用 uClinux作為作業系統,uClinux是專門針對沒有MMU的CPU,適合嵌入式系統小型化應用。uClinux經過對標準Linux核心的改動, 形成了一個高度最佳化、代碼緊湊的嵌入式Linux,uClinux保留了Linux的大多數優點:穩定,良好的移植性,優秀的網路功能,完備的對各種檔案 系統的支援,以及標準豐富的API。而且在uClinux系統上開發的應用程式可移植性很好,系統升級也非常容易,所以本文選用uClinux作為嵌入式 作業系統。在S3C44B0上對uClinux核心進行的移植過程為: 首先對其原始碼進行編譯,從網上下載一個uClinux原始碼,一般是壓縮格式(tar.gz)的,將其解壓,在目前的目錄下產生一個uClinux-dist目錄,進入uClinux-dist目錄,然後依次鍵入 (1) make menuconfig 進入菜單化的原始碼配 置工具 (2) make clean 清除所有的編譯結果 (3) make dep 設定檔案依賴關係 (4) make lib_only 編譯庫檔案 (5) make user_only 編譯應用程式 (6) make romfs 編譯檔案系統 (7) make image 產生映象檔案 (8) make 完成整個編譯過程 編 譯完成後,在image下產生三個檔案,image.ram,image.rom,romfs.img。將image.rom通過網口用tftp工具下載 到系統板的flash中0x0處,上電鍵入BIOS提供的命令,uClinux便從SDRAM啟動,完成移植過程[4-5]。 3.2 基於uClinux的web技術實現 (1) web伺服器的工作原理[6-7] 網頁伺服器作為一個資料載體,可以將本地的資訊和資料通過網路傳遞給遠端發出請求的客戶,這在遠程監控的實現有很大的意義。web伺服器監聽使用者端的服務請 求,根據使用者請求的類型提供相應的服務。使用者端使用web瀏覽器和web伺服器進行通訊。web伺服器在接收到使用者端的請求後,處理使用者請求並返回需要的 資料。一個完整的HTTP事務一般由以下四個階段組成: l 客戶與伺服器建立TCP串連; l 客戶向服器發送請求; l 如果請求被接受,則由伺服器發送應答,在應答中包括狀態代碼和所要的檔案; l 客戶與伺服器關閉串連。 (2) uClinux下web伺服器的實現 從本質上講,web伺服器是在電腦幕後啟動並執行程式,等待發自web瀏覽器的各種請求。當接受到請求時,它用被請求的文檔或錯誤訊息進行回覆。大多數的web伺服器都提供後端技術,就象CGI,能夠使web伺服器和已有的應用程式相連,從而提供互動式活動和資訊檢索。 uClinux 下,主要有三個web伺服器:httpd,thttpd和boa。Httpd[9]是最簡單的一個web伺服器,功能也最弱,不支援認證、CGI。 thttpd web伺服器和boa web伺服器都支援認證、CGI等,功能都比較全。本開發板選用適合於嵌入式應用的boa web伺服器。boa是一個單任務的http伺服器,原始碼開放、效能高。它和傳統伺服器的主要區別是:它是單進程的,在接到新的httpd請求時並不 FORK出一個新的進程來響應,不能對每個到來的串連處理,而且也不能將自己拷貝很多份來處理多串連。它在內部處理所有進行中的http串連請求,只對 單獨的CGI程式、自動檔案的產生、自動檔案的解壓等請求FORK出新進程。它的優點是代碼簡單、速度快、適合於嵌入式應用。對於嵌入式系統來說,實現 web伺服器主要是為了使用www瀏覽器,最終讓使用者通過區域網路或廣域網路訪問和控制嵌入式系統裝置。編寫不同的HTML頁面並結合CGI技術可以完成各種 靈活、友好的互動功能。在uClinux下實現boa,本文具體對boa.conf和mime.types檔案進行了幾項修改: (1) 由於根檔案系統是唯讀,不能用mkdir來建立目錄,所以在編譯核心前建好要用到的目錄,在此把web伺服器的根目錄設在/home/下,將伺服器文檔 根目錄設在/home/httpd/目錄下,把實現動態web網頁功能的CGI程式放在/home/httpd/cgi-bin/ 目錄下。這幾個目錄的建立通過修改開發平台的makefile來實現。在ROMFS_DIRS=bin dev etc home lib mnt proc usr var 增加home/httpd home/httpd/cgi-bin。這樣修改後,通過上面的編譯核心步驟編譯後,根檔案系統中就包含這些建立的目錄。 (2) 指定web伺服器的根目錄路徑,進入uClinux-dist/user/boa/src/目錄下,通過修改define.h檔案中 #define SERVER_ROOT/home語句來指定SERVER_ROOT。修改boa.conf檔案,在uClinux- dist/user/boa/src/boa.conf裡將User nobody,Group nogroup改為User 0,Group 0,Document Root/var/www改為DocumentRoot/home/httpd,定義預設首頁和CGI程式所在的目錄,即: DirectoryIndex index.html,ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/mini.type不需要修改。Boa.conf和mini.types必須放到web伺服器根目錄下,把修改 後的boa.conf和mini.types複製到uClinux-dist/romfs/home下,然後對uClinux- dist/Vendors/Samsung/4510b/inittab修改,在inet:unknow/bin/inetd後加入boa: unknown/bin/boa c/home。這樣配置好後,此時web伺服器的根目錄為/home/httpd,httpd目錄下放的是web伺服器可以訪問的檔案,包括html網 頁,JPG圖片等。/home/httpd目錄下放置的檔案和網站檔案類型完全一樣,其中index.html為遠程瀏覽客戶訪問web伺服器所看到的默 認首頁值,通過超級連結可以連結到/romfs/home/httpd目錄以及其所有子目錄下的所有靜態網頁。如果要實現動態網頁,只能採用CGI,因為 目前uClinux還不支援ASP,PHP等技術。CGI即通用閘道介面,它是一個WWW伺服器主機對外服務的標準介面,一般來說一個CGI介面的功能就 是在超文本和伺服器主應用程式間傳遞資訊。目前最為流行的CGI[10]程式語言有四種:C,Shell,Perl和Visual Basic。CGI程式屬於一個外部程式,需要編譯成為可執行檔,才能在服務端運行,其應用程式流程程圖2所示: 圖2 CGI程式流程圖 圖3 uClinux下內嵌網頁 圖4 LED示範程式介面 瀏覽器將使用者輸入的資料送到web伺服器,web伺服器將資料使用stdin送給CGI程式,在執行CGI程式後,可能會訪問儲存資料的一些文檔,最後使用stdout輸出html形式的結果檔案,經過web伺服器送回瀏覽器顯示給使用者。 本 文通過c語言來編寫CGI程式,編譯成二進位檔案放在/cgi-bin/目錄下,由於前面配置了boa伺服器的CGI目錄, ScriptAlias/cgi-bin//home/httpd/cgi-bin/, 所以/cgi-bin/目錄下的CGI程式就能被正確執行。配置完成後,重新編譯核心,編譯時間選中boa選項將編譯好的核心下載到開發板,啟動 uClinux完成IP配置,啟動boa web伺服器之後就可以通過瀏覽器瀏覽網頁了,如果想啟動uClinux時自動啟動boa web伺服器,可以修改rc檔案,進入uClinux-dist/vendors/Samsung/4510b,在運行指令碼中加入boa c/home/&修改後重新編譯核心,再下載到開發板運行,運行uClinux後即可訪問網頁了。下面結合一個例子來說明如何?uClinux 下的動態網頁技術。先用HTML語言編寫web內嵌網頁(3),然後點擊內嵌首頁上的LED DEMO示範程式超級連結,進入到網頁的下一介面(4),由ACTION屬性來指定要用到用到的CGI程式,即ACTION=/cgi- bin/led.cgi,由METHOD屬性來指明所用的提交方法,即METHOD =POST。 選中LED複選框,然後點擊SET,就能控制開發板上的發光二級管。說明uClinux下boa伺服器已經運行成功。 4 結束語 本 文通過硬體方案的實現、軟體設計、以及uClinux下web技術的實現,實現了基於S3C44B0與uClinux下的 boa伺服器。通過啟動開發板上的boa伺服器,在PC機上的瀏覽器鍵入開發板上的IP地址,就能訪問開發板中內嵌的靜態網頁,通過CGI程式的實現,實 現了網頁的動態顯示,並用一個控燈的例子對boa伺服器的運行進行了實驗驗證。本文所實現的嵌入式web伺服器通用性比較強,能夠在嵌入式開發平台上高效 率地運行,應用前景非常看好。 |