【正文】
printf(OPTIONCOM 1)。 } if (getvars) { for(i=0。\039。 39。 char **pairlist。)) { *eqpos = 39。) getinput[i] = 39。 } return form_method。 for(n=0, k=0。 0xdf) 39。 postvars = getPOSTvars()。最后,還要感謝我的父母,在我漫長的求學(xué)路上給予我的無聲的關(guān)懷和支持。在服務(wù)器下,Linux環(huán)境變量、命令執(zhí)行參數(shù)和標(biāo)準(zhǔn)輸入輸出文件都可用于Web服務(wù)器與CGI程序之間的通訊。Boa的功能實(shí)現(xiàn)也是通過建立連接、綁定端口、進(jìn)行偵聽、請求處理等來實(shí)現(xiàn)的。接下來套接口軟件使用TCP協(xié)議向Web服務(wù)器發(fā)出包含GET命令的字節(jié)流和位流,TCP將數(shù)據(jù)分段并將各獨(dú)立段傳到IP模塊,該模塊將數(shù)據(jù)段轉(zhuǎn)換成數(shù)據(jù)報(bào)并發(fā)送給Web服務(wù)器。這些數(shù)據(jù)通常以格式固定、含有文本和圖片的頁面出現(xiàn)在用戶端瀏覽器。++n, ++k) {if((url[n] = url[k]) == 39。) + 10 : (hex[0] 39。每當(dāng)找到字符amp。2) 在HTML中參數(shù) action 用以指明該 CGI 程式的位置,這樣此表單所填的資料才能正確傳給 CGI 作處理。 exit(0)。本文中采用的是GET方法。將調(diào)試信息剝?nèi)?,得到的最后程序只有約60KB大小。5) init:含一些啟動(dòng)kernel所需做的所有初始化動(dòng)作,針對kernel做初始化動(dòng)作、設(shè)置一些參數(shù)等,并對外圍設(shè)備初始化。 使用DNW燒寫uboot 通過USB的方式,首先需要安裝USB驅(qū)動(dòng) 使用HJtag燒寫uboot 通過并行口的方式燒寫,需要安裝HJtag軟件 Linux內(nèi)核的移植可以分為板級(jí)移植和片級(jí)移植?,F(xiàn)在它廣泛應(yīng)用于PDA、移動(dòng)通信、路由器、工業(yè)控制等領(lǐng)域[3] 。這是最吸引人的。Linux對廠商不偏不倚而且成本極低,能夠很快成為用于各種設(shè)備的操作系統(tǒng)。所以如何設(shè)計(jì)這種特別的Web服務(wù)器,如何在嵌入式設(shè)備中安裝Web服務(wù)器,就成了嵌入式Web服務(wù)器的發(fā)展和研究方向。本人完全意識(shí)到本聲明應(yīng)承擔(dān)的責(zé)任。關(guān)鍵詞:ARM;Linux;嵌入式Web服務(wù)器;CGIAbstractThis paper has mainly developed the software hardware design and realization of the embedded Web server Boa based on ARM. And the core of the hardware part is S3C2440 microprocessor produced by Samsung . The final achievement is the embedded webserver which can remote visit. Boa is a singletasking HTTP server. That means that unlike traditional webservers, it does not fork for each ining connection, nor does it fork many copies of itself to handle multiple connections. It internally multiplexes all of the ongoing HTTP connections. And forks only for CGI programs, this is very important to embedded system. At the same time, it also has the function of automatic directory generation、automatic file gunzipping and so on. So Boa is of highly value in the embedded system application. Keywords: ARM;Linux;Embedded Web server;CGI第一章 引言 6第二章 課題背景 7 嵌入式系統(tǒng)簡介 8 嵌入式系統(tǒng)和Linux 8 ARM9硬件平臺(tái) 9 ARM簡介 9 mini2440嵌入式開發(fā)板 9第三章 建立嵌入式系統(tǒng)開發(fā)環(huán)境 10 11 虛擬機(jī)的配置 12 安裝配置tftp服務(wù)器 12 配置NFS服務(wù)器 13 交叉編譯器的配置 13第四章 系統(tǒng)移植 14 Uboot移植 14 14 uboot的功能 14 使用DNW燒寫uboot 14 使用HJtag燒寫uboot 15 15 Linux kernel 的下載 16 Linux內(nèi)核的配置和編譯 16 文件系統(tǒng)的移植 17 加載Linux內(nèi)核映像 17 Boa Web服務(wù)器的移植 18 Boa Web服務(wù)器的建立 18 Linux下動(dòng)態(tài)Web頁面的實(shí)現(xiàn) 19 CGI程序分析 19 Form輸入的分析和解碼 21第五章 嵌入式Web服務(wù)器 22 概述 22 Web服務(wù)器原理 23 嵌入式Web服務(wù)器實(shí)現(xiàn)原理 23 TCP/IP協(xié)議 23 嵌入式Web服務(wù)器Boa 24 Boa概述 24 Boa的功能實(shí)現(xiàn) 24第六章 CGI技術(shù) 25 CGI概述 25 CGI工作原理 26第七章 系統(tǒng)功能的測試 28 測試Web服務(wù)器 28 動(dòng)態(tài)Web頁面測試 29結(jié)束語 32致謝 33參考文獻(xiàn) 34附錄 35第一章 引言隨著計(jì)算機(jī)技術(shù)的發(fā)展,嵌入式系統(tǒng)已成為計(jì)算機(jī)領(lǐng)域的一格重要組成部分。盡管從八十年代末開始,陸續(xù)出現(xiàn)了一些嵌入式操作系統(tǒng),比較著名的有Vxwork、pSOS、Nucleus和Windows CE。其強(qiáng)大的語言編譯器gcc、g++等也可以很容易得到。下面介紹該微處理器的特點(diǎn)及其應(yīng)用領(lǐng)域。 虛擬機(jī)的配置 安裝配置tftp服務(wù)器安裝相關(guān)軟件包aptget install tftpd (服務(wù)端)aptget install tftp (客戶端)aptget install xinetd建立配置文件cd /etc/vi tftp輸入service tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/server_args = s /tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4}存盤退出建立tftp服務(wù)文件目錄mkdir /tftpboot重新啟動(dòng)服務(wù)/etc/安裝完成!測試方法:在/tftpboot 目錄下隨便放個(gè)文件abc然后 運(yùn)行tftp 進(jìn)入tftp命令行輸入get abc 看看是不是能把文件下下來,如果可以就可以了,也可以put 文件上去。針對ARM的Linux,有一個(gè)子目錄和它對應(yīng)—arm。 2. 將mini2440上電,正常情況下將在終端DNW中看到bootloader菜單界面。用戶可以根據(jù)自己需要,不然Boa就不能正常工作。} else if(form_method == GET) {getvars = getGETvars()。} 3) POST和GET方式處理表單的程序見附錄,如果請求方法 REQUEST—METHOD的值為GET,CGI程序讀入環(huán)境變量QUESTRY—STRING;如果請求方法為POST,CGI程序就可確定數(shù)據(jù)來自標(biāo)準(zhǔn)輸入stdin,根據(jù)CONTENT—LENGTH的值確定從stdin讀入的數(shù)據(jù)流大小。name3=value3amp。下面是CGI中對Form數(shù)據(jù)進(jìn)行分析并將結(jié)果回送給Web服務(wù)器的程序的分析。) + 10 : (hex[1] 39。隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,使得B/S(客戶端/服務(wù)器)應(yīng)用方式已成為一種潮流。在接受端,一個(gè)TCP軟件包收集信封,抽出數(shù)據(jù),按發(fā)送前的順序還原,并加以校驗(yàn),若發(fā)現(xiàn)差錯(cuò),TCP將會(huì)要求重發(fā)。除此之外,Boa與其他Web服務(wù)器相比主要有以下幾個(gè)優(yōu)點(diǎn):① 對CGI程序無需設(shè)置REMOTE HOST環(huán)境變量,在REMOTEADDR變量中已經(jīng)提供了IP 地址,可以直接使用gethostbyaddr函數(shù)或變量,從而使Boa較其他Web服務(wù)器更易于使用;② 在Boa中對Server2side模塊可以剪裁,以提高系統(tǒng)運(yùn)行速度,其內(nèi)部的“字節(jié)流執(zhí)行引擎”采用了非完全的圖靈機(jī)方式實(shí)現(xiàn);③ 不存在訪問控制特征,采用符號(hào)連接方式進(jìn)行控制,可以對任何可以讀取的文件提供服務(wù),因此速度更快。使用它使得信息在瀏覽器或服務(wù)器與外部程序之間流動(dòng),外部程序在處理之后將處理結(jié)果送回用戶端瀏覽器。這樣就可以在主機(jī)上對etc目錄下的各種配置文件進(jìn)行修改而立刻在目標(biāo)系統(tǒng)上生效。以信息家電為中心和嵌入式Internet為潮流的嵌入式系統(tǒng)正得到蓬勃的發(fā)展。endif /* !_HTMLLIB_H*//* */int template_page(char **postvars, int form_method)。}/* include include include include char hex2char(char *hex)。 0xdf) 39。}/* getRequestMethod * retn: from_method (GET or POST) on success, * 1 on failure. */int getRequestMethod() { char *request_method。 if (getinput) getinput = strdup(getinput)。)。 free(pairlist)。 postinput[content_length] = 39。 } pairlist[paircount] = 0。 free(postinput)。}/* */include include include define DEBUG 1int template_page(char **postvars, int form_method) { int i。 return 0。}void htmlFooter() { printf(/BODY/HTML)。i++) free(pairlist[i])。 nvpair = strtok(NULL, amp。 if(!(postinput = (char *) malloc(content_length+1))) exit(1)。pairlist[i]。 if(!(paircount%256)) pairlist = (char **) realloc(pairlist,(paircount+256)*sizeof(char **))。 char *eqpos。 } } url[n] = 39。A39。 fflush(stdout)。void htmlFooter()。所有的內(nèi)容對我以后的工作都有很大的幫助。本課題中將采用NFS方式來進(jìn)行測試工作。如果一個(gè)Web服務(wù)器的功能只限于提供靜態(tài)頁面的花,那么與之通信的Web瀏覽器就只能顯示在頁面請求和顯示過程之間文檔內(nèi)容不變化的頁面。Boa與Apache等高性能的Web服務(wù)器主要的區(qū)別在于它們是單進(jìn)程服務(wù)器,只有在完成一個(gè)用戶請求后才能響應(yīng)另一個(gè)用戶的請求,而無法并發(fā)響應(yīng),但這在嵌入式設(shè)備