萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> LINUX網絡嵌入式設備

LINUX網絡嵌入式設備

   這不是什麼新鮮東西,無線路由器很早前就開始使用了,不過最近才慢慢理解其原理。現在網絡嵌入式設備的功能越來越強大了,各芯片廠商的解決方法支持著這種復雜性。最近公司實習,做一個家庭網關的項目。下面的內容應該不算洩密吧,寫得隨意一點。

  1.一個網絡芯片架構

LINUX網絡嵌入式設備 三聯

  大家應該看得出來,這是一個DSL芯片。其網絡部分由一個switch core構成核心,對外有3個交換口(粉紅色的):左側為以太網MAC,可外接以太網芯片MAC或PHY,稱為LAN端;右側為DSL的TPS子層,按照DSL標准傳輸ATM/PTM數據,成為WAN端;上面的是一個PDMA片級總線,與片上系統SoC通信。

  另外還有幾個額外的交換口,主要是提供額外功能的:一個QDMA用於擴展core外Mem;LTR和WTR是兩個轉換引擎,當LAN或WAN端的數據包需要一些特殊處理時(如VLAN、PPPOE頭等),會被分別交換到這兩個口進行轉換後,再發回Queue中。再另外,LAN、WAN端各有一個classifier,是預分類器,在數據包進入switch core前,先進行一個粗略的劃分,決定發往哪個端口。

  以上的這些功能都市switch core獨立完成的,SoC系統只需對其進行簡單的配置、控制即可。所以SoC的新能並不需要太高(CPU大概是130MHz的)。注意,該switch core和一般以太網switch的區別,首先其端口類型就不同,所提供的功能也跟為復雜。

  這裡給出一個簡單的以太網switch芯片的架構,如下圖所示,其核心就是一個register集,對它們進行配置(內部EEPROM、或外部MDIO總線),可以實現port-VLAN、二層filter等功能。其結構相對簡單,因為其所有端口都是以太網口。

  用該芯片接在上述DSL芯片的LAN端,構成網絡系統如下圖所示:

  以太網switch可以自主實現port-VLAN功能,並通過一個trunk口與switch core相連。而switch core有很好的vlan_tag classifier功能。另外WAN端實現了8個硬件通道PVCs,且switch core也能對它進行很好的classifier。綜上,就可以實現所謂的port-mapping功能,只要一跟DSL接入線,就可在家庭裡實現IPTV、Internet、可視電話等業務的分離。

  注意,所有這些功能都是switch core自動完成的,網絡數據包不需要進入SoC的協議棧,這和後面講的一般的路由器是不同的。

  2.嵌入式片上系統

  2.1與外界的交互方式

  這裡的SoC系統主要功能有:與外界用戶的交互,解析用戶指令,配置系統。

  解析指令對軟件系統來說很簡單,配置系統,前面也說了,主要是讀寫一些register,也很簡單。關鍵就在於與外界用戶交互。

  很容易想到的一種方式是網絡,SoC也連在switch core上,有自己的IP、MAC。當然它和switch core是片上bus相連的,通信時並不需要MAC,這裡只是把自己偽裝成一個通用的以太網設備,可以被switch core和外界PC識別。

  要通信,當然就需要協議棧了,不過,這裡的SoC系統不需要處理額外(正常通信)的數據,所以協議棧也選擇簡單的LWIP,如之前的博文所述。最常用的網絡通信方式就http了,另外還有telent等。

  呵呵,連接192.168.1.1實際就是去連接其內部的SoC,一般的交換機、路由器都是這樣的,而不是什麼端口。當我還是一個超級菜鳥時,這個問題困擾了好久,糾結。

  另外,嵌入式系統中,還有一個最常用的交互方式是串口UART。UART是一個非常簡單的I/O設備,它通過直接讀寫管腳的電平信號(串行的)來實現輸入輸出,沒有任何額外的中斷、控制等機制。雖然簡單,不能用以實現復雜、可靠的功能,但用作嵌入式系統的調試方法卻非常有效。

  UART就像是嵌入式設備的鍵盤/顯示器。它是一種非常簡單的硬件資源,在它之上可以構建通用的I/O設備tty,在tty之上,就可以實現各種應用,如shell等。

  硬件資源UART、虛擬層設備tty都是系統的資源,在Uc/OS中,一般作為全局量,在其上的應用則通過task來完成。如XSHELL_TASK中,就是通過一個while(1)循環,不停地通過tty_get_line()讀取命令行。注意,該函數已經不是裸的硬件操作了,而是加上了一個上層操作,即識別/r/n來作為結束符,也是通過一個while(1)循環來作的。讀到電平為空,則忽略,因為UART太簡單了,沒有中斷、緩存機制等(沒有詳細區考究,只是粗略地浏覽了一下代碼,好像是這樣的吧!)。

  最後,外界用戶讀寫電平,當然不同用示波器了。呵呵,PC上裝個串口驅動,那麼PC的鍵盤/顯示器就為嵌入式板子所用啦。

  2.2bootloader

  這就像一個心結,你一天不理解它,就一天不能安心地開發嵌入式系統,盡管你可以把軟件寫得很出色。

  傳統的PC機上電後,cpu核的指令指針(如cs:ip)會指向系統內某段固化的代碼,如BIOS,這些代碼被燒錄在rom存儲器中,斷電也不會丟失。它們會調用我們開發的代碼(如操作系統軟件、或一些簡單的前後台程序)。

  一個嵌入式怎麼啟動,其實大意和PC(所有這種代碼機器)差不多。當然不同廠商的芯片,也有各自的方式特點,以公司的這款芯片來說(注意,這裡說的是芯片上集成的SoC子系統),它有好幾種方式啟動。

  首先,其芯片內集成了一個BootRom,它裡面的代碼(也就是二進制的門電路)是在芯片的一部分,即芯片生產出來就有的。芯片對外有個引腳(boot-mode_pin),把它接低,則芯片上電後的ip指向該BootRom,執行裡面的代碼。這些代碼很簡單,一般會實現BOOTP、tffp等功能,從網絡上下載OS的內核到內存中來運行。這就是所謂的網絡無盤系統的工作方式。

  不過現在好像這種方式用的少了,存儲器便宜啊。一般都會把boot-mode_pin拉高,這樣上電後ip指向外部flash。很容易想到flash和PC上的硬盤類似,是差不多,有點區別。PC上電後先執行BIOS,由BIOS裝載硬盤的bootloader扇區。而嵌入式系統一般不這麼麻煩,它直接就在flash中運行這些代碼。

  現在的cpu-core一般都是32位的,即有4G物理尋址空間,而嵌入式的SDRAM並不要那麼大,所有可以把外部flash和SDRAM一起編址:

  系統上電後,ip指向2G處,則可以直接在flash運行初始的代碼,只是速率比較慢,所以開始的代碼往往是把後面的一個image下載到SDRAM中去,然後在SDRAM中運行。

  至於flash的基址為什麼能是2G,這是由CPU的地址總線和flash的SPI總線的特殊的電路連接方式決定的,呵呵,電子出身的應該不難理解。而且,有些芯片還提高一些外部引腳pin,來為地址線加上一個offset(比如1M),那麼兩個處理芯片就可以使用同一個flash的不同的部分了(0~1M,1~2M),而其內部只覺得都是從2G地址開始的。

  下面一個關鍵問題就是,flash中是什麼,怎麼來的,能改變嗎?

  一般flash中的東西,是有具體應用來決定的,開頭一般都是bootloader代碼,後面有一個image文件,公司的網絡系統,需要一個啟動配置文件,也簡單的放在flash中:

  Bootloaer一般放在開頭,便於執行。後面的則也可以直接這樣按照物理空間分配,復雜一點,也可以做成文件系統fs,如嵌入式linux。主要包括一些配置文件,log信息文件。最重要的是IMAGE文件,一般要被加載到SDRAM中去運行,這也是我們開發系統功能應用的關鍵。

  那這些內容怎麼來的呢?一般初始時,會用特定的硬件工具廠商提供的一個初始的文件(格式就是上圖所示)燒到flash中,就像當年我們燒8051單片機一樣,再把flash焊在板子上。如果運行過程中,代碼被改死了,系統再也起不來了,那對不起,只能重新焊一個新的flash了。而一個不就的方法是在flash中准備兩個image,板子上預留一個特殊的案件,按下後啟動新的image(前面講的flash-offset方法)。還有一種方法,是通過內部bootrom啟動,無盤啟動。實現當然需要一定的硬件支持,如前面所述的那個boot-mode_pin不能焊死,用一個跳冒,或者通過一些特殊電路接在以太網上,以太網事先有數據傳輸時,則使用內啟動,如組播升級。方法各不一啦。

  最後,flash裡面的內容怎麼變?很簡單,它既然也在cpu的變址內,直接用cpu把數據寫到flash中不就行了。一般用http服務,client會post一個image文件上來,server端檢查沒問題,就寫到flash中,這就是手動升級。

  3.一個無線路由器的架構分析

  前面提到的公司芯片解決方案,SoC子系統的功能很有限,通信數據包一般不會到SoC的協議棧。而目前市場上的無線路由器系統,系統中的CPU功能一般很強大,RAM配置也很強大,一般都能運行大型系統軟件,如Linux。

copyright © 萬盛學電腦網 all rights reserved