寬帶上網已經不是什麼新鮮事情,人們對相關的網絡器件已經不再陌生,比如說常見的路由器。對于一般的網絡使用者,他們能知道怎樣使用路由器來上網、玩遊戲等就已經感到很滿足了,通常情況下對路由器的深層技術很少去過問研究,但做為興趣廣泛的技術愛好者,對這方面的知識是非常感興趣的。但限于各種條件的制約,這些愛好者都非開發者,很大程度上無法深入了解真正的技術實作過程以及相關的核心内幕。正是基于此點,筆者憑借自身的知識沉澱,盡最大努力為愛好技術的讀者架設一坐能通向深層核心的橋梁,為大家揭開路由器的神秘面紗,剖開其核心内髒。為使讀者能清晰明白的了解掌握,筆者盡量将專業的技術内容轉化為容易接受的知識講解,其中可能有不足偏頗之處,還請大家多見諒。
概述
什麼是路由器?

網際網路是依靠路由器連接配接起來的,路由器是網際網路或者說IP網絡的核心裝置。寬帶接入的不斷增長,帶動了路由器的需求不斷增加。
路由器究竟是什麼樣的技術産物?
談到路由器的開發,我們就不免要談到“嵌入式”裝置的開發,沒錯,通俗的說,路由器就是一種嵌入式産品。那麼究竟什麼是嵌入式裝置呢?
其實就目前而言,嵌入式裝置已經不斷深入我們的日常生活方方面面。通俗的講,嵌入式裝置是指具有計算機功能,但又不稱為計算機的裝置或器材,它幾乎包括了我們周圍的所有電器裝置 PDA、手機、機頂盒、汽車、微波爐、電梯、安全系統、自動售貨機、醫療儀器、立體音響、自動取款機等。
用較為專業的話來表述的話,嵌入式裝置就是使用微處理器或微控制器晶片(MCU)加上外圍電路再加上内部的程式部分來實作特定功能的嵌入裝置。比如8位的單片機、32的ARM以及DSP晶片等都屬于嵌入式核心晶片的範疇。8位MCU市場已逐漸趨向穩定,32位MPU代表着嵌入式技術的發展方向,正在加速發展。在32位嵌入式微處理器市場上,基于ARM核心的微處理器在市場上處于絕對的上司地位,是以追蹤ARM技術的發展趨勢顯得尤為重要。
路由器的開發通常都是基于32位處理器的,就通常的中低端路由器而言,在開發的配置上有多種選擇,比如有ARM9核心晶片+Wince作業系統、ARM7核心晶片+uClinux作業系統、DSP晶片+Vxworks作業系統等等各種各樣的選擇。本文針對常用的SOHO路由器來介紹,選擇ARM7核心晶片+uClinux作業系統開發模式,以完×××象的執行個體為大家清晰講解路由器的技術實作過程。
我們為什麼以SOHO路由器為介紹對象呢?什麼是SOHO路由器?前很多家庭中有不止一台電腦,需要上網擷取資訊、收發郵件等。這些小型公司和家庭網絡使用者計算機的數目一般不多,網絡結構不複雜。功能和帶寬的要求不高。出于提高網絡性能、共享有限IP位址或節省上網費用等原因,這些使用者迫切需要具有較高成本效益的小型路由器。我們把這種小型路由器稱為SOHO路由器。目前市場上已經充斥了大量的這類低端路由器.由于ARM7系列晶片價格便宜,非常适合嵌入式系統使用。目前市場上的SOHO路由器大多采用ARM7系列處理器。不過由于技術的發展,ARM9系列的專用路由晶片的路由器也逐漸普及。
第2章:路由器宏觀介紹
我們可以形象的把嵌入式裝置的開發簡單的了解成三層模式,最底層的是微控制器晶片加外圍器件組成的硬體系統,比如我們介紹的開發小型SOHO路由器所使用的ARM7TDMI晶片等硬體環境,它是裝置功能實作的硬體基礎,要實作上層的應用肯定離不開最底層硬體的支援。中間層是作業系統,比如我們所選擇的uClinux作業系統,它是銜接硬體部分和應用程式的過渡層,它既可以完成對底層硬體的基本操作,又能為上層應用程式提供運作環境支援。最上層自然就是應用程式層了,它是實作針對性應用的程式代碼部分,比如路由設定等功能程式部分。
那對與SOHO路由器來說,它當然也脫離不了這樣的技術架構,它的更為具體的實作過程簡單的彙總的話,莫過于如下内容:
首先先要知道SOHO實作的網絡功能,典型路由器應該具備以下功能:
支援PPPoE,固定IP上網;
DHCP動态主機配置協定;
網絡位址轉換(NAT)技術;
根據TCP,UDP的端口号(port number),IP 的(協定号)protocol number,對IP位址進行簡單過濾的防火牆;
虛拟服務主機/端口映射(Port Forwarding)技術;
支援一定數量的特殊應用程式;
然後針對于上邊的功能要求,相應地要通過硬體和軟體的構造來實作:
硬體方面:
1、要明确家用小型路由器(一個WAN接口,四個LAN接口)的硬體原理。
2、實作硬體電路闆設計,完成電路布線設計,并對元件焊接,通過硬體闆的調試。
軟體方面:
1、在分析 uClinux核心源代碼的基礎上,對uClinux作業系統的核心裁剪。
2、完成BoaWeb伺服器的配置,并對CGI腳本進行設計,完成動态網頁的功能。
3、對PPPOE的撥号進行配置實作。
4、針對Linux核心防火牆部分,運用IPtable工具進行防火牆規則操作。
通過如上的基本構造,一個路由器就基本成型了。說起來簡單,但其中包含了很多很多的技術細節,要有大量的實踐經驗才能真正實作。做為門外觀奇的好學讀者,現在肯定有些不耐煩了吧,想要了解更多的更詳細的構造内容吧?那好,現在就可以開始我們真正的技術之旅了。
第3章:路由器工作原理
1、基本原理
要實 現 網 絡中通信節點彼此之間的通信,首先必須給每個節點配置設定一個唯一的IP位址。路由器應該至少有兩個網絡端口,分别連接配接LAN或者WAN子網上,每個端口必須具有一個唯一的IP位址,并且要求與所連接配接IP子網的網絡号相同。不同的端口有不同的網絡号,對應不同的IP子網,這樣各子網中的主機才能通過自己子網的IP位址把要求發出去的IP資料報送到路由器上。
當路由器收到一份IP資料報後,首先要對該封包進行判斷,然後根據判斷的結果做進一步的處理。如果資料報是有效或正确的,路由器就根據資料報的目的IP位址轉發該封包:否則就把封包丢棄。如果這個資料報的目的IP位址與路由器直接相連的一個子網上,路由器會通過相應的接口把封包轉發到目的子網上去;否則會把它轉發到下一跳(Hop)路由器。為了完成上述的操作,每台路由器必須維護一個路由表。把對應不同目的地的最佳路徑存放在路由表中,這就是路由政策(Routing Policy)問題。路由表反映網絡的拓撲結構,一般一條表項應該包含資料報的目的IP位址(通常是目的主機所在網絡的位址)、下一跳路由器的位址和相應的網絡接口等,在網絡拓撲發生變化的時候,路由表也應該做相應的變動。是以路由器必須能夠生成并更新路由表。
選路機制實際上就是如何查找路由表,通過查詢路由表來決定向哪個方向轉發資料。一般來說,路由器首先搜尋比對的主機位址:如果沒有,再搜尋比對的網絡位址:最後搜尋預設路由。一旦查到比對的表項,路由器就會把資料從相應的接口發送出去。
路由器具備了上述各要素後,就可以完成資料轉發任務了。另外,路由器不僅負責對IP包的轉發,還要負責與别的路由器進行聯絡,共同确定網際網路的路由選擇和路由表的更新維護。
2、SOHO路由器原理
當内部計算機要與外部Internet網絡進行通信時,各内部間通過私有IP位址進行通信的計算機必須把私有IP位址轉換成合法IP。這種網絡位址轉換技術稱為NAT(Network Address Translation,網絡位址轉換)。在一個實際的私有網絡中,NAT功能通常内建在路由器、防火牆或獨立的NAT裝置之上,網絡中的主機将這些裝置作為自己的預設網關。通過這樣的配置,每一台内部主機發送往Internet的資料報就會送到具有NAT功能的裝置中進行轉換。NAT是SOHO路由器的必備功能,它是為解決IPv4位址不夠配置設定的沖突而産生的一個簡單高效的解決方案。它能将任何兩個位址域的位址進行轉換,使私有網絡中多台主機共享一個合法IP位址通路Internet。
第4章:嵌入式路由器硬體系統介紹
1、硬體系統總體結構
硬體結構是非常重要的部分,因為我們拆開一個路由器後首先看到的、所能看到的也就是硬體結構,我們就舉例簡單介紹一下硬體設計的各個部位的細節内容。
為了宏觀檢視,我們給出交換式寬帶路由器的硬體設計執行個體圖一張。圖中主要分為兩部分:
ARM4510B部分和交換晶片RTL8305部分,前者主要見上半圖,後者為下半圖。還有電源及各自的複位電路。
ARM4510B部分中,中央處理晶片為帶有網絡接口的S3C4510B--16/32位RISC微控制器,根據嵌入式作業系統的運作需要,擴充了SDRAM存儲器和Flash存儲器。SDRAM存儲器由兩片4X1MX16位的HY57V641620HGT
組成,作為嵌入式作業系統核心及應該程式運作的記憶體空間。Flash存儲器由一片1MX16位的SS139VF160組成,作為核心映像的存儲,并在嵌入式作業系統啟動時加載系統核心及程式。根據調試程式及燒寫Flash存儲器的需要,引出JTAG接口。根據顯示調試和運作資訊的需要,提供了RS232接口。交換晶片 RTL8305部分中,提供4個LAN口(PORTO--PORT3)通過一四口的網絡隔離變壓器連接配接一個四口RJ45口,每個口可連接配接到10/10013aseT以太網,各端口之間有交換功能:還有一個WAN接口(CPO RT4)通過一單口的隔離變壓器連接配接RJ45口。根據顯示連接配接速度、狀态和電源等需要,接出LED燈進行顯示。根據交換晶片的管理需要,提供一串行EEPROM 24C01電路接口。根據交換晶片的主電源為2.5V.提供一個3.3V到2.5V的轉換器。
中央處理晶片通過MR(獨立媒體接口)接口與交換晶片RTL8035SB的PORT4的Mil接口相聯,将交換晶片的PORT4配置為實體層接收器。
當各部分電路設計完成後,形成硬體連接配接圖,進而焊接之後,就可以作為開發用的實驗硬體闆了。下面就簡要介紹一下個硬體電路部分。
2、硬體系統的簡要設計介紹
⑴ARM處理器系統設計介紹
①S304510B概述
Samsung公司的S34510B是基于以太網應用系統的高成本效益的16/32位RISC微控制器,内含一個由ARM公司設計的16/32位的ARM7TDMI RISC處理器核。ARM7TDMI為低功耗,高性能的16/32位核。
除了ARM7TDMI外,該晶片還有一些片内外圍功能子產品,主要為: 内部RAM (8Kbyte unified cache/SRAM),I2 C接口電路(I2C interface)、以太網控件器(Ethernetco ntroller),HDLC,GDMA、序列槽(UART),時鐘(Timers)、可程式設計1/O口(Programmable I/O ports)及中斷控件器(Interrupt controller)等。
S3C4510B結構框圖所示。在實際運作過程中最主要用到的部分為:以太網接口及序列槽部分,前者用于收發以太包,後者主要作為作業系統調試接口。
②ARM 處理器系統電源電路和複位電路
主要是實作供電和複位功能,電路部分不做詳細講解,有深入研究需要的愛好者可以檢視相關的電子相關參考資料進行深入學習。為使文章通俗易懂,以下各電路部分也是做一宏觀介紹,細節部分包括電路布線等不再深入講解。
③ARM處理器與Flash存儲器接口電路
讀者隻要知道這部分的電路連接配接是為實作能在Flash存儲器編寫程式即可。
④ARM處理器與SDRAM接口電路設計介紹
與 Flash存儲器相比,SDRAM不具有掉電保持資料的特性,但其存儲速度大大高于Flash存儲器,且具有讀/寫屬性。是以SDRAM在系統中主要用于程式的運于空間、資料及堆棧。當系統啟動時,CPU首先從複位位址0x0片讀取啟動代碼,在完成系統的初始化後,程式代碼調入SDRAM中運作,以提高系統的運作速度。
SDRAM 具有機關空間存儲量大和價格便宜的特點,廣泛用于各種嵌入式系統中。SDRAM 的存儲單元可以了解為一個電容,總是傾向于放電,為了避免資料丢失,必須定時重新整理(充電)。是以,在系統中使用SDRAM,就要求微處理器有重新整理的控制邏輯或者在系統中另外加重新整理控制邏輯電路。S3C4510B在片内具有獨立的SDRAM重新整理控制邏輯,可以友善的與SDRAM接口。
⑤ARM處理器串行接口電路設計介紹
幾乎所有的微控件器、PC都提供串行接口,使用美國電子工業協會(EIA)推薦的RS-232-C接口标準,這是一個很常用的串行資料傳輸總線接口标準。早期被用于計算機和終端通過電話線和MODEM進行遠距離的資料傳輸,随着微型計算機和微控制器的發展,不僅在遠距離,近距離也采用了該通信方式。在近距離的通信中不采用電話線和MODEM,而是直接進行端到端的連接配接。
RS-232-C标準采用的是9芯或是25芯的D型插頭。
⑥ARM處理器JTAG接口電路設計介紹
JTAG(JointTe stAc tionG roup,聯合測試行動小組)是一種國際标準測試協定,主要用于晶片内部測試及系統進行仿真、調試。JTAG是一種嵌入式調試技術,它在晶片内部封裝了TAP(Test Access Port,測試通路接口),通過專用的JTAG測試工具對内部節點進行測試.标準的JTAG接口是四線:TMS、TCK、TDI、TDO,分别為測試模式選擇、測試時鐘、測試資料輸入、測試資料輸出。JTAG測試允許多個器件通過JTAG接口串聯在一起,形成一個JTAG鍊,能實作以各個器件分别測試。JTAG接口還常用于ISP(In System Programmable)功能,如對Flash器件進行程式設計。
⑵以太網交換電路設計介紹
以太網交換電路主要是采用五×××換晶片RTL8305SB來實作。RTL8305SB是一個內建了片記憶體儲器,五個MAC層接口,五個實體層(PHY)接口的l0M/l00M自适應的五×××換晶片,該內建晶片具有低功耗,可靈活配置為五口小型辦公及家用(SOHO)交換機,家用網關,xDSL路由器及其它智能應用。要實作必要的網絡功能,這部分的電路是關鍵中的關鍵。
第5章:作業系統介紹
1、Linux
Linux是一個誕生于網絡,成長于網絡且成熟于網絡的奇特的作業系統。1991年,芬蘭大學生Linus Torvalds萌發開發了一個自由的UNIX作業系統的想法,并将Linux通過Internet進行釋出。從此一大批程式設計人員加入到開發過程中來,Linux逐漸成長起來。Linux一開始要求所有的源代碼必須公開,後來轉向GPL( GNUG eneral Public Licence),成為GUN的陣營的主要一員。隻要遵守GPL的規定,就可以免費獲得複制,是以Linux是一個免費軟體。同樣,Linux下遵循GPL規定的C, C++, Java等一系列的工具開發包,從功能的角度上看并不亞于商用的開發包,但卻可以極大的降低開發成本,這一優勢是其它商用作業系統無法比拟的。
Linux 作業系統最突出的是網絡部分,基本上所有的網絡協定和網絡接口都可以在Linux上找到,Linux的核心比标準的UNIX處理網絡協定更加高效,系統的網絡吞吐性能更好,這也是Linux網絡伺服器市場上占據較大的市場分額的重要原因。對于一般的小型的SOHO路由器,Linux的網絡技術無疑是其開發運作的最佳選擇,Linux完全能對給其提供全方位的網絡技術支援。Linux作為網際網路的産物,許多關于Linux的文檔可以在Internet上下載下傳到。
2、uClinux作業系統[/color]
uclinux是嵌入式Linux的一個分支,在uClinux這個英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,是以uclinux就是Micro-Control-Linux,字面上的了解就是“針對微控制領域而設計的Linux系統”。同标準的Linux相比,由于uClinux自身不支援MMU,多任務的實作就需要技巧了。但是,在uClinux上運作的絕大多數的使用者程式并不需要多任務。另外,針對uclinux核心的二進制代碼和源代碼都是經過了重新編寫,以緊縮和裁剪基本的代碼。這就使得uClinux的核心同标準的Linux核心相比非常之小,但是它仍保持了Linux作業系統的主要的優點,如穩定性、強大的網絡功能和出色的檔案系統支援等。uclinux包含Linux常用的API、小于512K的核心和相關的工具。作業系統所有的代碼加起來小于900KB。
uClinux簡介:
在PC機上開發應用程式的使用者都會有這樣的感覺,PC機有完善的作業系統并提供應用程式接口(API),開發好的應用程式可以直接在作業系統上運作。雖然嵌入式系統的應用程式完全可以在裸闆上運作,但為了使系統具有任務管理、定時器管理、存儲器管理、資源管理、事件管理、系統管理、消息管理、隊列管理和中斷處理的能力,提供多任務處理,更好的配置設定系統資源的功能,使用者就需要針對自己的硬體平台和實際應用選擇适當的嵌入式作業系統(Embedded Operating System,以下簡稱EOS)。由于本文執行個體中的硬體平台是以不含MMU (Memory Management Unit,記憶體管理單)的S3C4510B為核心的,是以采用不帶MMU的ARM 微處理器的嵌入式作業系統uclinux。uclinux 是一個完全符合GNUIGPL公約的作業系統,完全開放代碼,現在由Line。公司支援維護。uClinux從Linux 2.0(2.4核心派生而來,沿襲了主流Linux的絕大部分特性。它是專門針對沒有MMU的CPU,并且為嵌入式系統做了許多小型化的工作.适用于沒有虛拟記憶體或記憶體管理單元(MMU )的處理器,例如ARM7TDMI。它通常用于具有很少記憶體或Flash的嵌入式系統。uclinux是為了支援沒有MMU的處理器而對标準Linux作出的修正。它保留了作業系統的所有特性,為硬體平台更好的運作各種程式提供了保證。在GNU通用公共許可證(GNU GPL)的保證下,運作uClinux作業系統的使用者可以使用幾乎所有的Linux API函數,不會因為沒有MMU而受到影響。由于uClinux在标準的Linux基礎上進行了适當的裁剪和優化,形成了一個高度優化的、代碼緊湊的嵌入式Linux,雖然它的體積很小,uClinux仍然保留了Linux的大多數的優點:穩定、良好的裁剪性、優秀的網絡功能、完備的對各種檔案系統的支援、以及标準豐富的API等。
BootLoader:負責uCLinux核心的啟動,它用于初始化系統資源,包括SDRAM。這部分代碼用于建立uCLinux核心運作環境和從Flash中裝載初始化核心鏡象。
核心初始化:uCLinux核心的入口點是start kernel() 函數。它初始化核心的其他部分,包括捕獲,IRQ通道,排程,裝置驅動,标定延遲循環,最重要的是能夠fork "init"程序,以啟動整個多任務環境。
系統調用函數/捕獲函數:在執行完“init”程式後,核心對程式流不再有直接的控制權,此後,它的作用僅僅是處理異步事件(例如硬體中斷)和為系統調用提供程序。
裝置驅動 :裝置驅動占據了uCLinux核心很大部分。同其他作業系統一樣,裝置驅動為它們所控制的硬體裝置和作業系統提供接口。
檔案系統 :uCLinux最重要的特性之一就是對多種檔案系統的支援。這種特性使得uCLinux很容易地同其他作業系統共存。檔案系統的概念使得使用者能夠檢視儲存設備上的檔案和路徑而無須考慮實際實體裝置的檔案系統類型。ucLinux透明的支援許多不同的檔案系統,将各種安裝的檔案和檔案系統以一個完整的虛拟檔案系統的形式呈現給使用者。uClinux帶有一個完整的TCP/IP協定,同時它還支援許多其他網絡協定。uclinux對于嵌入式系統來說是一個網絡完備的作業系統。
3、uClinux開發環境
⑴GNU開發套件
GNU軟體包括C編譯器GCC,C ++編譯器G++,彙編器AS,連結器LD,二進制轉換工具(OBJCOPY,OBJDUMP),調試工具(GDB.GD BSERVER,KGDB)和基于不同硬體平台的開發庫。在GNU GCC支援下使用者可以使用流行的C/C++語言開發應用程式,滿足生成高效率運作代碼、易掌握的程式設計語言的使用者需求,這些工具都是按GPL版權聲明釋出,任何人可以從網上擷取全部的源代碼,無需任何費用。關于GNU和公共許可證協定的詳細資料,讀者可以參看GNU網站的介紹,[url]http://www[/url],gnu.oTgfhDmc.html。GNU開發套件作為通用的Linux開放套件,包括一系列的開發調試工具。GNU開發工具都是采用指令行的方式,使用者掌握起來相對比較困難,不如基于Windows系統的開發工具好用,但是GNU工具的複雜性是由于它更貼近編譯器和作業系統的底層,并提供了更大的靈活性。一旦學習和掌握了相關工具後,就了解了系統設計的基礎知識。運作于Linux作業系統下的自由軟體GNU gcc編譯器,不僅可以編譯Llnux作業系統下運作的應用程式,還可以編譯Linux核心本身,甚至可以作交叉編譯,編譯運作于其它CPU上的程式。是以,在進行嵌入式系統應用程式開發時,這些工具得到了日益廣泛的應用。
⑵uCIinux的列印終端
通常情況下,uClinux的預設終端是序列槽,核心在啟動時所有的資訊都列印到序列槽終端(使用printk函數列印),同時也可以通過序列槽終端與系統互動。uClinux在啟動時啟動了telnetd(遠端登入服務),操作者可以遠端登入上系統,進而控制系統的運作。至于是否允許遠端登入可以通過燒寫romfs檔案系統時由使用者決定是否啟動遠端登入服務。
⑶交叉編譯調試工具
支援一種新的處理器,必須具備一些編譯,彙編工具,使用這些工具可以形成可運作于這種處理器的二進制檔案。對于核心使用的編譯工具同應用程式使用的有所不同。
[color=crimson]第6章:路由器軟體系統的設計過程
uClinux 作業系統提供了嵌入式Web伺服器、PPPOE拔号軟體、基于IPTable過濾防火牆等功能子產品的源代碼。路由器軟體系統的設計包括uClinux作業系統的裁剪、基于uClinux作業系統提供的以上功能子產品源代碼下的修改和設計,進而實作本路由器的嵌入式Web伺服器、PPPOE拔号軟體、基于IPTable過濾防火牆。
1、uClinux作業系統裁剪
⑴裁剪前準備
uclinux的裁剪牽涉到對目标的硬體支援問題。要讓uClinux支援一個新硬體體系,要做的第一件事情就是收集和建構代碼的工具。然後就可以裁減和編譯核心。一旦核心支援基本的處理器功能,它就可以運作了,但是如果缺乏驅動程式的支援,就起不了多大作用。典型的驅動程式集合中包括了諸如控制台終端、基本串行裝置和一個可能包含了根檔案系統的塊裝置的驅動等。
在這裡主要介紹針對我們剛才介紹的執行個體系統采用的uClinux裁剪方法。本執行個體中的主控端上裝redhat9作業系統,因為redhat9具備安裝uClinux交叉編譯工具時所需要的庫。
首先必須在redhat9下建立uclinux開發環境,建立uclinux開發環境的方法有很多,而且也十分友善。可以從[url]http://www.uClinux.org[/url]處下載下傳最新的uClinux的源代碼、最新的gcc3的工具鍊,不過針對于不同的工具鍊在不同的作業系統下,以及目标闆的MCU的不一樣,可能在編譯核心時會産生錯誤,在這裡,我講解執行個體所使用的不是最新版本的。同樣的,針對不同的硬體開發環境要對uClinux源代碼進行不同的适當修改,修改部分通常是以代碼更新檔形式實作的,一般網絡上會有各種通用模式的更新檔提供使用。好了,切入正題,有了齊全的軟體包後,安裝過程如下:
(1) 下載下傳核心和工具包
核心包 : uClinux-disc-200408.tar.gz
更新檔檔案:uClinux-disc-200408.patch
uclinux的源代碼和檔案系統的源代碼,軟體包後的數字代表完成的日期。
工具鍊 : arm-elf-gcc-200403.sh
(2) 安裝工具包
sh arm -elf-gcc-200403.sh
(3) 解壓縮核心
tar -xzvfuClinux-dist-200408.tar.gz,生成uClinux-disk目錄。
(4)安裝更新檔:
将更新檔檔案複制到uClinux-disk目錄下,進入該目錄,在Shell指令中使用如下指令:
patch -pl-f
⑵核心的編譯和生成
執行以下指令可以進行uClinux編譯:
make xconfig。具體的編譯選項配置過程本文不做詳細介紹。但在此給出編譯的一些基本思想:
ucLinux作為一個自由軟體,在廣大愛好者的支援下,核心版本不斷更新。新的核心修訂了舊核心的bug,并增加了許多新的特性。如果使用者想要使用這些新特性,或想根據自己的系統度身定制一個更高效,更穩定的核心,就需要重新編譯核心。
為了正确的合理地設定核心編譯配置選項,進而隻編譯系統需要的功能的代碼,一般主要有下面四個考慮:
自己定制編譯的核心運作更快(具有更少的代碼)。
系統将擁有更多的記憶體(核心部分将不會被交換到虛拟記憶體中)。
不需要的功能編譯進入核心可能會增加被系統攻擊者利用的漏洞。
将某種功能編譯為子產品方式會比編譯到核心内的方式速度要慢一些。
在此需要補充說明的是核心編譯的目的是為了建立一個能夠放置在flash上支援flash讀取的完成要求功能的核心,同時也是flash讀取步驟其中一步。對uCLinux的核心進行配置和建立要對uCLinux核心的版本進行選擇:uCLinux核心的版本号有三種:主号、次号、修訂号。以2.4.10為例一般來說,主号如目前的2是很穩定的。主号的變動說明了作業系統發生了很大的變動。次号如目前的.4,用來說明核心的穩定性。當次号為偶數号((0,2, 4, 6) 時,表明現在的核心的穩定性強,而當次号為奇數号(1,3, 5) 時,表明現在的核心處于測試的階段,其穩定性值得考慮,如果你使用次号為奇數号的核心進行配置和建立時、就值得三思而行了。而修訂号的發表比較的頻繁,它主要是用來對前面的版本進行修補。開發新的版本和修改以前的版本是同時進行的,很有可能修改的修訂版本在新的版本出來之後。
依次執行以下指令完成uClinux的編譯過程:
cd/usr/local/src/uclinux=dist
make dep
make clean
make lib_only
make user_only
make romfs
make p_w_picpath
最終在p_w_picpath目錄下生成2個檔案:
zImage——uClinux核心2.4.x的壓縮方式可執行映象檔案;
romfs——檔案系統的映象檔案。
這就是我們要用來燒錄到硬體闆内的最終檔案了。具體燒寫可以通過使用專用的燒寫工具來實作,燒寫過程一定要參照燒寫工具的說明要求來進行。
其中zImage已經包含了檔案系統映象檔案,通常直接燒寫到Flash檔案上即可執行了。當然在這之前要進行BootLoader的燒錄, BootLoader其實就是一個引導程式,主要作用就是初始化系統,進而來引導作業系統。在嵌入式系統中,處理器上電後首先執行的一段代碼就是BootLoader,BootLoader與硬體密切相關,其代碼主要用C和彙編語言寫成,不同的系統中,BootLoader的功能有所不同,但主要作用還是差不多的,主要有下面幾點:
初始化微控制器MCU運作的時鐘頻率;
初始化Flash和記憶體的資料寬度,讀/寫通路周期和重新整理周期;
初始化中斷系統;
初始化系統中各種片内、片外裝置和I/O端口裝置;
初始化系統各種運作模式下的寄存器和堆棧;
加載和引導作業系統;
BLOb是BootLoaderObject的縮寫,它是一個功能強大、源代碼公開的自由軟體,它已經實作了對多種處理器晶片的Linux 引導支援。對ARM7等核心的BootLoader支援版本可以到專業網站上進行下載下傳,并稍微做适當修改來滿足開發應用中的硬體環境要求即可,在此我們不做過多講述。
上面所講述的核心編譯過程隻是比較寬泛的、籠統的操作過程,也就是說隻是基本的操作過程,而在真正的路由功能實作過程中,還要對核心進行多種設定編譯,比如說對硬體系統中設計到的部件進行驅動配置安裝等,當然,這些并不是特别難的操作技術,再比如我們下面就要講到的内容,這可就是很有挑戰性的核心技術了,這些都是針對核心進行技術性操作來實作特定的網絡功能。
第7章:核心編譯核心部分
1、檔案系統分析
檔案系統是uClinux作業系統的重要組成部分,uClinux檔案系統是操作運作的基礎。許多嵌入式系統在不存在磁盤的情況下也可以運作。檔案系統可以随同核心一起被打包并在啟動時作為一個檔案系統的映像被加載。對一個簡單的應用系統來說,這己足夠了。檔案系統可以存放在一個傳統磁盤中,但也可以存放在非易失性的存儲媒體— 閃存中。閃存有一個引導塊,它存放了CPU上電後運作的第一個軟體,這個軟體可以是uclinux的引導程式,也可以是自己編的bootloader。uClinux的核心可以被引導程式從閃存中拷貝到RAM中全速運作。閃存也可以作為檔案的存儲媒體,必要時寫入一些需要儲存的資料。
uClinux支援NFS(Network File System),它允許通過網絡加載各種應用程式。由于用在每一個嵌入式系統上的軟體可以從一個公用的伺服器上加載,這在控制軟體的修訂或更新中是很重要的.在系統運作的過程中,導入和導出資料、配置、狀态資訊的備份也很重要。對使用者監控而言,這是一個非常強大的功能。例如,一個嵌入式系統可能裝配了一個RAM DISK,它包含着與系統目前狀态的更新維持一緻的(狀态)檔案。那麼别的嵌入式系統僅需通過網絡把這個RAM DISK作為遠端磁盤mount過來便可以通路那些位于遠端RAM DISK中的狀态檔案。這也允許在另一台機器上的WEB伺服器借助簡單的CGI腳本來通路那些狀态資訊。運作在其他機器上的應用程式包能夠很容易地通路這些資料。uClinux作業系統根據不同的安裝選擇可以生成不同的檔案系統。系統中提供了十分豐富的檔案系統以供不同需要的使用者選擇。每種類型的檔案系統的基本塊大小、優化配置設定政策、一次傳送的資料長度等等都是互相比對的,使得本類檔案系統均有相應的最佳性能。
2、嵌入式Web伺服器
對uClinux作業系統下嵌入式Web技術的實作主要用于使用者可以通過網
頁方式來管理路由器。
⑴uClinux下Web Server的實作
uClinux下,主要有三個WebServer:htpd,thttpd和Boa。Httpd是最簡單的一個Web Server,它的功能最弱,不支援認證,不支援CGI。Thttpd和Boa都支援認證、CGI等,功能都比較全。為了實作動态Web技術,這裡我們選擇實作一個支援CGI的、非常适合于嵌入式系統的Boa Web Server。Boa是一個單任務的http伺服器,源代碼開放、性能高。目前,uClinux的代碼中已經包含boa的源代碼,在uClinux下實作Boa,需要對Boa做一些配置和修改。這主要通過對boa.conf和mime.types檔案進行修改來實作,需要改動的配置有以下幾項:
①建目錄
由于uClinux預設的根檔案系統romfs是隻讀的,不能用mkdir等指令來建立目錄,故應在編譯核心前先建好要用到的目錄,這通過修改
/uclinux-samsung/vendors/Samsung/4510b/makefile檔案來實作。在ROWFS_DIRS=bin dev etc home lib mnt proc usr var的後邊增加home/webhome/web/cgi-bin,這樣修改後編譯核心,編譯好的根檔案系統romfs中就包含這些目錄了。
②指定Web 伺服器的根目錄路徑(SERVER ROOT)
進入 /uclinux-samsung/user/boa/src/目錄,通過修改define.h檔案中#define ERVER ROOT "/home”語句來指定SERVER ROOT。另外,還可以通過指令行來指定,例如:boa-c/home/&。而且指令行指定的SERVER ROOT可以覆寫define.h檔案所指定的。
③修改boa.conf檔案
在. /uclinux-samsung/user/boa/src/boa.conf裡修改:
*将 user obody和Group ogroup改為User0 和Group0 ;
*将 DocumentRoot/var/www改為DocumentRoot/home/web,這樣web伺服器的文檔根目錄為/home/web;
*将 MimeTypes/eWmime.types改為MimeTypes/home/web/mime.types;
定義預設首頁和CGI程式所在目錄,即
DirectoyIndex index.html
ScriptAlias/cgi-bin//home/web/cgi-bin/
這樣指定後,.index.htm為遠端浏覽客戶通路WebServer所看到的首頁預設值,用C編寫的CGI程式編譯成二進制檔案,放到/cgi-bin/目錄下,CGI程式能被正确地執行。
Boa.conf檔案和mime.types檔案必須放到Web伺服器根目錄下,是以把修改後的bao.conf和mime.types拷貝到“./uclinux-samsung/romfs/home/”目錄下。然後在/uclinux- samsung/Vendors/Samsung/4510b/initab裡修改,在:inet:unknown:/bin/inetd後加入: boa:unknown:/bin/boac/homeo
配置過程後,重新編譯核心,編譯時選中Boa選項。把編譯好的核心下載下傳到硬體闆,啟動uclinux,完成IP配置,啟動Boa Web Server,然後就可以通過lE通路你的網頁了。如果想啟動uclinux時自動啟動Boa Web Server,可以修改re檔案,進入uclinux-samsung/vendors/Samsung/4510B目錄,在運作腳本rc中增加兩行:
ifconfig eth0 192.168.0.101 up
boa-c/home/&
修改後重新編譯核心,再下載下傳到硬體闆運作.運作uclinux後,不需要配置就可以直接通過IE來通路[url]http://192.168.0.101[/url],看到你的網頁了。
⑵uclinux下實作動态Web頁面的CGI技術
到目前為止,實作動态Web頁面有4種技術可供選擇:CGI(Common Gateway Interface), ASP(ActiveXServerPage),PHP(PersonalHomePage)和JSP(JavaServerPage).在uclinux下如果要實作動态網頁,隻能采用CGI,是以目前uclinux還不支援ASP, PHP等動态Web頁面技術。CGI(通用網關接口)提供Web伺服器一個執行外部程式的通道,這種服務端技術使得浏覽器和伺服器之間具有互動性。CGI程式屬于一個外部程式,需要編譯成可執行檔案,以便在服務端運作。浏覽器将使用者輸入的資料送到Web伺服器,Web伺服器将資料使用STDIN送給CGI程式,在執行CGI程式後,可能會通路存儲資料的一些文檔,最後使用STDOUT輸出HTML形式的結構檔案,經Web伺服器送回浏覽器顯示給使用者。CGI程式可以用任何程式設計語言編寫,如Shell腳本語言、Perl,Fortran, Pascal, C語言等。但目前uclinux不支援Pert, Fortran等語言,而且C語言在平台無關性上表示不錯,是以我們選擇用C來編寫CGI程式。另外,uClinux也不支援資料庫,是以需要儲存的資料隻能儲存到檔案中,CGI查詢資料時也是查詢這些檔案,而不是通路資料庫。
⑶uClinux下動态Web頁面的實作
下面通過一個例子來說明如何實作uClinux下的動态Web頁面技術。此例子的目的是使使用者能夠通過Web頁面内嵌表單送出資料,并能把使用者送出的資料通過Web浏覽器正确地傳回給使用者。實作動态Web頁面的第一步是用HTML語言編寫Web頁及内建表單。編寫Web頁面時,要由ACTION屬性來指定相關的CGI程式,如ACTION=cgi-bin/demo;由MOTHOD屬性來指明所用的送出資料的方法,即MOTHOD=POST(GET)。
實作動态 Web頁面的第二步是用C編寫CGI程式,CGI程式分為以下幾部分:①根據POST方法或GET方法從送出的表單中接收資料;②URL編碼的解碼;③用printf() 函數來産生HTML源代碼,并将經過解碼後的資料正确地傳回給浏覽器。包括demo.c, cgivars.h和cgivars.c三個檔案。将編寫好的CGI程式編譯成二進制檔案放在cgi-bin/目錄下,CGI程式能被正确地執行,最終CGI程式就可以對上述表單資料的進行處理了。
經過一系列深入的配置後,基本的路由功能器就這樣誕生了,當然實際中路由器還有相當多的應用功能,這些都是通過軟體開發來逐漸深層次實作的,如果你想成為一個嵌入式工程師的話,那這篇文章就算是一個引路人吧,要達到更高的境界,還需要自己刻苦學習研究,一步一步在魔幻般的技術殿堂中自由遨遊。