香港魔術討論區 » 電腦硬件 » 拿起手術刀 深入剖解路由器的“心髒”技術


2007-5-26 07:47 AM 立場
拿起手術刀 深入剖解路由器的“心髒”技術

寬帶上網已經不是什么新鮮事情,人們對相關的網絡器件已經不再陌生,比如說常見的路由器,見圖1。對于一般的網絡用戶,他們能知道怎樣使用路由器來上網、玩游戲等就已經感到很滿足了,通常情況下對路由器的深層技術很少去過問研究,但做為興趣廣泛的技術愛好者,對這方面的知識是非常感興趣的。但限于各種條件的制約,這些愛好者都非開發者,很大程度上無法深入了解真正的技術實現過程以及相關的核心內幕。正是基于此點,筆者憑借自身的知識沉澱,盡最大努力為愛好技術的讀者架設一坐能通向深層核心的橋梁,為大家揭開路由器的神秘面紗,剖開其核心內髒。為使讀者能清晰明白的理解掌握,筆者盡量將專業的技術內容轉化為容易接受的知識講解,其中可能有不足偏頗之處,還請大家多見諒。
  概述
  什么是路由器?
[img]http://net.yesky.com/imagelist/2007/138/lg94lzgas0z5s.jpg[/img]
互聯網是依靠路由器連接起來的,路由器是互聯網或者說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系列的專用路由芯片的路由器也逐漸普及。

路由器宏觀介紹
[img]http://net.yesky.com/imagelist/2007/138/0o8se06w3123.jpg[/img]
我們可以形象的把嵌入式設備的開發簡單的理解成三層模式,最底層的是微控制器芯片加外圍器件組成的硬件系統,比如我們介紹的開發小型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工具進行防火牆規則操作。
  通過如上的基本構造,一個路由器就基本成型了。說起來簡單,但其中包含了很多很多的技術細節,要有大量的實踐經驗才能真正實現。做為門外觀奇的好學讀者,現在肯定有些不耐煩了吧,想要了解更多的更詳細的構造內容吧?那好,現在就可以開始我們真正的技術之旅了。

  路由器工作原理
  1、基本原理
  要實 現 網 絡中通信節點彼此之間的通信,首先必須給每個節點分配一個唯一的IP地址。路由器應該至少有兩個網絡端口,分別連接LAN或者WAN子網上,每個端口必須具有一個唯一的IP地址,並且要求與所連接IP子網的網絡號相同。不同的端口有不同的網絡號,對應不同的IP子網,這樣各子網中的主機才能通過自己子網的IP地址把要求發出去的IP數據報送到路由器上。
  當路由器收到一份IP數據報后,首先要對該報文進行判斷,然后根據判斷的結果做進一步的處理。如果數據報是有效或正確的,路由器就根據數據報的目的IP地址轉發該報文:否則就把報文丟棄。如果這個數據報的目的IP地址與路由器直接相連的一個子網上,路由器會通過相應的接口把報文轉發到目的子網上去;否則會把它轉發到下一跳(Hop)路由器。為了完成上述的操作,每台路由器必須維護一個路由表。把對應不同目的地的最佳路徑存放在路由表中,這就是路由策略(Routing Policy)問題。路由表反映網絡的拓撲結構,一般一條表項應該包含數據報的目的IP地址(通常是目的主機所在網絡的地址)、下一跳路由器的地址和相應的網絡接口等,在網絡拓撲發生變化的時候,路由表也應該做相應的變動。所以路由器必須能夠生成並更新路由表。
  選路機制實際上就是如何查找路由表,通過查詢路由表來決定向哪個方向轉發數據。一般來說,路由器首先搜索匹配的主機地址:如果沒有,再搜索匹配的網絡地址:最后搜索默認路由。一旦查到匹配的表項,路由器就會把數據從相應的接口發送出去。
  路由器具備了上述各要素后,就可以完成數據轉發任務了。另外,路由器不僅負責對IP包的轉發,還要負責與別的路由器進行聯絡,共同確定互聯網的路由選擇和路由表的更新維護。
  2、SOHO路由器原理
[img]http://net.yesky.com/imagelist/2007/138/8i8dw8qng13r.jpg[/img]
當內部計算機要與外部Internet網絡進行通信時,各內部間通過私有IP地址進行通信的計算機必須把私有IP地址轉換成合法IP。這種網絡地址轉換技術稱為NAT(Network Address Translation,網絡地址轉換)。在一個實際的私有網絡中,NAT功能通常內建在路由器、防火牆或獨立的NAT設備之上,網絡中的主機將這些設備作為自己的默認網關。通過這樣的配置,每一台內部主機發送往Internet的數據報就會送到具有NAT功能的設備中進行轉換。NAT是SOHO路由器的必備功能,它是為解決IPv4地址不夠分配的矛盾而產生的一個簡單高效的解決方案。它能將任何兩個地址域的地址進行轉換,使私有網絡中多台主機共享一個合法IP地址訪問Internet。

嵌入式路由器硬件系統介紹
  1、硬件系統總體結構
  硬件結構是非常重要的部分,因為我們拆開一個路由器后首先看到的、所能看到的也就是硬件結構,我們就舉例簡單介紹一下硬件設計的各個部位的細節內容。
[img]http://net.yesky.com/imagelist/2007/138/2kv2i0721c86.jpg[/img]
為了宏觀查看,我們給出交換式寬帶路由器的硬件設計實例圖一張。圖中主要分為兩部分:
  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配置為物理層接收器。
  當各部分電路設計完成后,形成硬件連接圖,進而焊接之后,就可以作為開發用的實驗硬件板了。下面就簡要介紹一下個硬件電路部分。
 

2007-5-26 07:48 AM 立場
 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)等。
[img]http://net.yesky.com/imagelist/2007/138/u5qzmq989660.jpg[/img]
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路由器及其它智能應用。要實現必要的網絡功能,這部分的電路是關鍵中的關鍵。

  操作系統介紹
  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操作系統
  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簡介
[img]http://net.yesky.com/imagelist/2007/138/6654262z71jt.jpg[/img]
在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網站的介紹,http://www,gnu.oTgfhDmc.html。GNU開發套件作為通用的Linux開放套件,包括一系列的開發調試工具。GNU開發工具都是采用命令行的方式,用戶掌握起來相對比較困難,不如基于Windows系統的開發工具好用,但是GNU工具的複雜性是由于它更貼近編譯器和操作系統的底層,並提供了更大的靈活性。一旦學習和掌握了相關工具后,就了解了系統設計的基礎知識。運行于Linux操作系統下的自由軟件GNU gcc編譯器,不僅可以編譯Llnux操作系統下運行的應用程序,還可以編譯Linux內核本身,甚至可以作交叉編譯,編譯運行于其它CPU上的程序。所以,在進行嵌入式系統應用程序開發時,這些工具得到了日益廣泛的應用。
  ⑵uCIinux的打印終端
  通常情況下,uClinux的默認終端是串口,內核在啟動時所有的信息都打印到串口終端(使用printk函數打印),同時也可以通過串口終端與系統交互。uClinux在啟動時啟動了telnetd(遠程登錄服務),操作者可以遠程登錄上系統,從而控制系統的運行。至于是否允許遠程登錄可以通過燒寫romfs文件系統時由用戶決定是否啟動遠程登錄服務。
  ⑶交叉編譯調試工具
  支持一種新的處理器,必須具備一些編譯,匯編工具,使用這些工具可以形成可運行于這種處理器的二進制文件。對于內核使用的編譯工具同應用程序使用的有所不同。

  

2007-5-26 07:49 AM 立場
路由器軟件系統的設計過程
  uClinux 操作系統提供了嵌入式Web服務器、PPPOE拔號軟件、基于IPTable過濾防火牆等功能模塊的源代碼。路由器軟件系統的設計包括uClinux操作系統的裁剪、基于uClinux操作系統提供的以上功能模塊源代碼下的修改和設計,從而實現本路由器的嵌入式Web服務器、PPPOE拔號軟件、基于IPTable過濾防火牆。
  1、uClinux操作系統裁剪
  ⑴裁剪前准備
  uclinux的裁剪牽涉到對目標的硬件支持問題。要讓uClinux支持一個新硬件體系,要做的第一件事情就是收集和構建代碼的工具。然后就可以裁減和編譯內核。一旦內核支持基本的處理器功能,它就可以運作了,但是如果缺乏驅動程序的支持,就起不了多大作用。典型的驅動程序集合中包括了諸如控制台終端、基本串行設備和一個可能包含了根文件系統的塊設備的驅動等。
  在這里主要介紹針對我們剛才介紹的實例系統采用的uClinux裁剪方法。本實例中的宿主機上裝redhat9操作系統,因為redhat9具備安裝uClinux交叉編譯工具時所需要的庫。
  首先必須在redhat9下建立uclinux開發環境,[url=]建立uclinux開發環境的方法有很多,而且也十分方便。可以從[/url]http://www.uClinux.org處下載最新的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 image
  最終在image目錄下生成2個文件:
  zImage——uClinux內核2.4.x的壓縮方式可執行映象文件;
  romfs——文件系統的映象文件。
  這就是我們要用來燒錄到硬件板內的最終文件了。具體燒寫可以通過使用專用的燒寫工具來實現,燒寫過程一定要參照燒寫工具的說明要求來進行。
  其中zImage已經包含了文件系統映象文件,通常直接燒寫到Flash文件上即可執行了。當然在這之前要進行BootLoader的燒錄, BootLoader其實就是一個引導程序,主要作用就是初始化系統,進而來引導操作系統。在嵌入式系統中,處理器上電后首先執行的一段代碼就是BootLoader,BootLoader與硬件密切相關,其代碼主要用C和匯編語言寫成,不同的系統中,BootLoader的功能有所不同,但主要作用還是差不多的,主要有下面几點:
  初始化微控制器MCU運行的時鍾頻率;
  初始化Flash和內存的數據寬度,讀/寫訪問周期和刷新周期;
  初始化中斷系統;
  初始化系統中各種片內、片外設備和I/O端口設備;
  初始化系統各種運行模式下的寄存器和堆棧;
  加載和引導操作系統;
  BLOb是BootLoaderObject的縮寫,它是一個功能強大、源代碼公開的自由軟件,它已經實現了對多種處理器芯片的Linux 引導支持。對ARM7等核心的BootLoader支持版本可以到專業網站上進行下載,並稍微做適當修改來滿足開發應用中的硬件環境要求即可,在此我們不做過多講述。
  上面所講述的內核編譯過程只是比較寬泛的、籠統的操作過程,也就是說只是基本的操作過程,而在真正的路由功能實現過程中,還要對內核進行多種設置編譯,比如說對硬件系統中設計到的部件進行驅動配置安裝等,當然,這些並不是特別難的操作技術,再比如我們下面就要講到的內容,這可就是很有挑戰性的核心技術了,這些都是針對內核進行技術性操作來實現特定的網絡功能。

  

2007-5-26 07:50 AM 立場
內核編譯核心部分
  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/&
  修改后重新編譯內核,[url=]再下載到硬件板運行.運行uclinux后,不需要配置就可以直接通過IE來訪問[/url]http://192.168.0.101,看到你的網頁了。
  ⑵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程序就可以對上述表單數據的進行處理了。
  下面對程序稍加說明。若以GET方法提交數據,表單中的數據被保存在QUERY_STRING環境變量中,通過調用函數getenv("QUERY_STRING")來讀取數據;若以POST方法提交數據,則程序先從CONTENT LENGTH環境量得到數據的字長,然后從標准輸入中讀取相應長度的字符串即可得到提交的數據。數組postinput 中保存的就是從表單中提取的數據。
  URL編碼的解碼過程較為複雜,URL編碼的規則下:①變量之間用“&”分開;② 變量與其對應值之間用“=”連接;③空格符用“+”代替;④特殊意義的字符用%接相應的十六進制ASCI碼代替。解碼即為編碼的逆過程。在程序中,對于從表單中提取過來的postinput中的數據,當發現字符為“+”時,將它轉換成空格;當發現字符為“&”時,意味著個名字2值對的結束,在此處將字符中切成几個字符串;當再現字符為“=”時,意味著一個名字/值對的名字部分的結束,在此再將名字/值對分開。最后通過調用unescape_url(char *url)子函數將十六進制ASCII碼值表示的特殊字符轉換成相應的ASCII字符。
  3、PPPOE撥號實現
  PPPOE主要針對ADSL寬帶接入方式,實現用戶的的認證上網方式就是采用這種方式接入。
  ⑴PPPOE簡介
  1998年后期問世的以太網上點對點協議(PPP over Ethernet)技術是由Redback網絡公司、客戶端軟件開發商RouterWare公司以及Worldcom子公司UUNET Technologies公司在IETF RFC制的基礎上聯合開發的。通過把最經濟的局域網技術以太網和點對點協議的可擴展性及管理控制功能結合在一起,網絡服務提供商和電信運營商便可利用可靠和熟悉的技術來加速部署高速互聯網業務。它使服務提供商在通過數字用戶線、電纜調制解調器或無線連接等方式,提供支持多用戶的寬帶接入服務時更加簡便易行.同時該技術亦簡化了最終用戶在動態地選擇這些服務時的操作.
  ⑵PPPOE實現
  實現步驟 :
  pppoe的實現有兩種方式,一種是作為一個用戶態的應用程序運行,就是rp-pppoe這個程序;另一種是選擇在kernel ppp里支持pppoe功能,這同時也需要pppd支持pppoe。
  具體的細節實現步驟本文不做詳述,有興趣的讀者可以查閱相關的Linux資料進行更深一步的學習研究。
  4、基于IPTable過濾式防火牆
  網絡防火牆用來保護一個網絡不受來自另一個網絡的攻擊,是網絡安全環節中進行的一個防御步驟。在路由器中配置IPTable過濾式防火牆,可以對IP數據封包進行規則檢查和過濾,保證內網安全。
  ⑴防火牆概述
  防火牆是一套能夠在兩個或兩個以上的網絡之間,明顯區隔出實體線路聯機的軟硬件設備組合。被區隔開來的網絡,可以透過封包轉送技術來相互通訊,透過防火牆的安全管理機制,可以決定哪些數據可以流通,哪些資料無法流通,藉此達到網絡安全保護的目的。
  防火牆產品可以概略歸類為硬件式防火牆和軟件式防火牆,但實際上無論是硬件式或軟件式防火牆,它們都需要使用硬件來作為聯機介接,也需要使用軟件來設定安全政策,嚴格說兩者間的差別並不太大。我們只能從使用的硬件與操作系統來加以區分,硬件式防火牆是使用專有的硬件,而軟件式防火牆則使用一般的計算機硬件,硬件式防火牆使用專有的操作系統,而軟件式防火牆則使用一般的操作系統。
  防火牆依照其運作方式來分類,可以區分為封包過濾式防火牆(Packet Filter)、應用層網關式防火牆(Application-Level Gateway,也有人把它稱為Proxy防火牆)、電路層網關式防火牆(Circuit-Level Gateway).其中被廣為采用的是封包過濾式防火牆,本文要介紹的iptables防火牆就是屬于這一種。
  封包過濾是最早被實作出來的防火牆技術,它是在TCP/IP四層架構下的IP層中運作.封包過濾器的功能主要是檢查通過的每一個IP數據封包,如果其標頭中所含的數據內容符合過濾條件的設定就進行進一步的處理,主要的處理方式包含:放行(accept)、丟棄(drop)或拒絕(reject)。要進行封包過濾,防火牆必須要能分析通過封包的來源IP與目的地IP,,還必須能檢查封包類型、來源端口號與目的端口號、封包流向、封包進入防火牆的網卡接口、TCP的聯機狀態等數據。
  ⑵IPtable的原理及實現
  IPTables是Linux操作系統中的一個管理內核包過濾的工具,它可以添加、插入或刪除核心包過濾表(1)中的規則,以實現防火牆功能。
  一個iptables命令基本上包含如下五部分:希望工作在哪個表上、希望使用該表的哪個鏈、進行的操作(M入,添加,刪除,修改)、對特定規則的目標動作、匹配數據報條件。
  基本的語法為:
  iptables -t table -Operation chain -target match(es)
  例如,希望添加一個規則,允許所有從任何地方到本地smtp端口的連接:
  iptables -t filter -A INPUT -ACCEPT -p tcp --dport smtp
  當然 ,還有其他的對規則進行操作的命令如:清空鏈表,設置鏈缺省策略,添加一個用戶自定義的鏈...
  經過一系列深入的配置后,基本的路由功能器就這樣誕生了,當然實際中路由器還有相當多的應用功能,這些都是通過軟件開發來逐步深層次實現的,如果你想成為一個嵌入式工程師的話,那這篇文章就算是一個引路人吧,要達到更高的境界,還需要自己刻苦學習研究,一步一步在魔幻般的技術殿堂中自由遨游。

頁: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.