12/08/2009

SDK的概念

經常會在技術論壇裡面看到類似這樣的帖子:「什麼是 SDK?」,「請高手講一下 SDK 是什麼東東?」……

其實很簡單,SDK 就是 Software Development Kit 的縮寫,中文意思就是「軟件開發工具包」。

這是一個覆蓋面相當廣泛的名詞,可以這麼說:輔助開發某一類軟件的相關文檔、範例和工具的集合都可以叫做 「SDK」。

具體到我們這個系列教程,我們後面只討論廣義 SDK 的一個子集——即開發 Windows 平台下的應用程序所使用的 SDK。

呵呵,其實上面只是說了一個 SDK 大概的概念而已,理解什麼是 SDK 真有這麼容易嗎?恐怕沒這麼簡單!

為瞭解釋什麼是 SDK 我們不得不引入 API、動態鏈接庫、導入庫等等概念。^_^,不要怕,也就是幾個新的名詞而已,我也是到了大學快結束的時候才體會到其實學習新知識就是在學習新名詞、新 概念和新術語。

首先要接觸的是「API」,也就是 Application Programming Interface,其實就是操作系統留給應用程序的一個調用接口,應用程序通過調用操作系統的 API 而使操作系統去執行應用程序的命令(動作)。

其實早在 DOS 時代就有 API 的概念,只不過那個時候的 API 是以中斷調用的形式(INT 21h)提供的,在 DOS 下跑的應用程序都直接或間接的通過中斷調用來使用操作系統功能,比如將 AH 置為 30h 後調用 INT 21h 就可以得到 DOS 操作系統的版本號。而在 Windows 中,系統 API 是以函數調用的方式提供的。

同樣是取得操作系統的版本號,在 Windows 中你所要做的就是調用 GetVersionEx() 函數。可以這麼說,DOS API 是「Thinking in 彙編語言」的,而 Windows API 則是「Thinking in 高級語言」的。

DOS API 是系統程序的一部分,他們與系統一同被載入內存並且可以通過中斷矢量表找到他們的入口,那麼 Windows API 呢?要說明白這個問題就不得不引入我們下面要介紹得這個概念——DLL。

DLL(又是一個縮寫,感覺 IT 這個行業裡三字頭縮寫特別多),即 Dynamic Link Library(動態鏈接庫)。我們經常會看到一些 .dll 格式的文件,這些文件就是動態鏈接庫文件,其實也是一種可執行文件格式。跟 .exe 文件不同的是,.dll 文件不能直接執行,他們通常由 .exe 在執行時裝入,內含有一些資源以及可執行代碼等。

其實 Windows 的三大模塊就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),裡面就含有了 API 函數的執行代碼。為了使用 DLL 中的 API 函數,我們必須要有 API 函數的聲明(.H)和其導入庫(.LIB),函數的原型聲明不難理解,那麼導入庫又是做什麼用的呢?我們暫時先這樣理解:導入庫是為了在 DLL 中找到 API 的入口點而使用的。

所以,為了使用 API 函數,我們就要有跟 API 所對應的 .H 和 .LIB 文件,而 SDK 正是提供了一整套開發 Windows 應用程序所需的相關文件、範例和工具的「工具包」。到此為止,我們才真正的解釋清楚了 SDK 的含義。

由於 SDK 包含了使用 API 的必需資料,所以人們也常把僅使用 API 來編寫 Windows 應用程序的開發方式叫做「SDK 編程」。而 API 和 SDK 是開發 Windows 應用程序所必需的東西,所以其它編程框架和類庫都是建立在它們之上的,比如 VCL 和 MFC,雖然他們比起「SDK 編程」來有著更高的抽象度,但這絲毫不妨礙它們在需要的時候隨時直接調用 API 函數。

【轉】BSP的概念

Drew在這裡按照自己的理解來解釋一下BSP( Board Support Package),僅供參考:

BSP是板級支持包,是介於主板硬件和操作系統之間的一層,應該說是屬於操作系統的一部分,主要目的是為了支持操作系統,使之能夠更好的運行於硬件主板。 BSP是相對於操作系統而言的,不同的操作系統對應於不同定義形式的BSP,例如VxWorks的BSP和Linux的BSP相對於某一CPU來說儘管實 現的功能一樣,可是寫法和接口定義是完全不同的,所以寫BSP一定要按照該系統BSP的定義形式來寫(BSP的編程過程大多數是在某一個成型的BSP模板 上進行修改)。這樣才能與上層OS保持正確的接口,良好的支持上層OS。

例如:

VxWorks中的網卡驅動,首先在config.h中包含該網卡,然後將網卡含網卡的信息的參數放入數組 END_TBL_ENTRY endDevTbl [] 中,系統通過函數muxDevLoad( )調用這個數組來安裝網卡驅動。

而在Linux中的網卡驅動,是在space.c中聲明該網絡設備,再把網卡驅動的一些函數加到dev結構中,由函數ether_setup()來完成網卡驅動的安裝。

純粹的BSP所包含的內容一般說來是和系統有關的驅動和程序,如網絡驅動和系統中網絡協議有關,串口驅動和系統下載調試有關等等。離開這些驅動系統就不能正常工作。

Tornado中BSP的編譯和上層應用程序不同,用命令行或直接在Tornado環境下Build,在Tornado下不能跟蹤調試。

用戶也可以添加自己的程序到BSP中,但嚴格來說不應該算BSP.一般來說這種做法不建議。因為一旦操作系統能良好運行於最終的主板硬件後,BSP也就固 定了,不需要做任何改動。而用戶自己在BSP中的程序還會不斷的升級更新,這樣勢必對BSP有不好的影響,對系統造成影響,同時由於BSP調試編譯環境較 差,也不利於程序的編譯調試。

 

上層程序

Tools - Applications

I/O System

VxWorks Libraries

TCP/IP


 

Wind Kernel

BSP

 


SCSI Controllerr

Serial Controller

Clock Timer

Ethernet Controller

.. ..

硬件

 

BSP在嵌入式系統和Windows系統中的不同


其實運行與PC機上的windows或linux系統也是有BSP的。只是PC機均採用統一的X86體系架構,這樣一定操作系統 (windows,linux..)的BSP相對x86架構是單一確定的,不需要做任何修改就可以很容易支持OS在x86上正常運行,所以在PC機上談論 BSP這個概念也沒什麼意義了。

而對嵌入式系統來說情況則完全不同,目前市場上多種結構的嵌入式CPU(RISC)並存(PPC,ARM,MIPS....),為了性能的需要,外圍設備 也會有不同的選擇和定義。一個嵌入式操作系統針對不同的CPU,會有不同的BSP,即使同一種CPU,由於外設的一點差別(如外部擴展DRAM的大小,類 型改變),BSP相應的部分也不一樣。
所以根據硬件設計編寫和修改BSP,保證系統正常的運行是非常重要的。


BSP和PC機主板上的BIOS區別

 

BSP和PC機主板上的BIOS區別很大,BIOS主要是負責在電腦開啟時檢測、初始化系統設備(設置棧指針,中斷分配,內存初始化..)、裝入操作系統 並調度操作系統向硬件發出的指令,它的Firmware代碼是在芯片生產過程中固化的,一般來說用戶是無法修改。其實是為下載運行操作系統做準備,把操作 系統由硬盤加載到內存,並傳遞一些硬件接口設置給系統。在OS正常運行後,BIOS的作用基本上也就完成了,這就是為什麼更改BIOS一定要從新關機開 機。

PC機BIOS的作用更像嵌入式系統中的Bootloader(最底層的引導軟件,初始化主板的基本設置,為接收外部程序做硬件上的準備)。與 Bootloader不同的是BIOS在裝載OS系統的同時,還傳遞一些參數設置(中斷端口定義,...),而Bootloader只是簡單的裝載系統。

BSP是和操作系統綁在一起運行在主板上的,儘管BSP的開始部分和BIOS所做的工作類似,可是大部分和BIOS不同,作用也完全不同。此外BSP還包 含和系統有關的基本驅動(串口,網口...),此外程序員還可以編程修改BSP,在BSP中任意添加一些和系統無關的驅動或程序,甚至可以把上層開發的統 統放到BSP中。

而BIOS程序是用戶不能更改,編譯編程的,只能對參數進行修改設置。更不會包含一些基本的硬件驅動。



BSP在嵌入式開發中的位置和作用

BSP開發處於整個嵌入式開發的前期,是後面系統上應用程序能夠正常運行的保證。

大概步驟如下:

1.硬件主板研製,測試。

2.操作系統的選定,BSP編程。

3.上層應用程序的開發。

BSP部分在硬件和操作系統,上層應用程序之間。所以這就要求BSP程序員對硬件,軟件和操作系統都要有一定的瞭解。這樣才能做好BSP編程。

熟悉工具方面:電表,示波器,邏輯分析儀。硬件仿真器,仿真調試環境。

語言方面:彙編語言,C語言。

12/03/2009

常用的Android指令和模擬器參數

  • Android模擬器命令列啟動模式
    在android-sdk-windows-1.1\tools執行emulator以執行模擬器
    加上-skin參數,指定顯示模式為HVGA-L,則可轉為橫向
    emulator - skin HVGA-L (480*320,水平顯示)
    emulator - skin HVGA-L (320*480,垂直顯示,模擬器預設模式)
    emulator - skin HVGA-L (320*240,水平顯示)
    emulator - skin HVGA-L (240*320,垂直顯示)


  • 使用mksdcard指令模擬1GB的記憶卡
    mksdcard 1024M sacard.img

  • 模擬插入 SD 卡的模擬器
    emulator - sdcard sdcard.img

  • 使用 adb+push 上載檔案到SD記憶卡
    adb push 001.jpg /sdcard (複製檔案到 /sdcard 目錄下)
    adb push pictures /sdcard (複製 picture 照片目錄到 /sdcard 目錄下)
    adb push mp3 /sdcard (複製 mp3 音樂目錄到 /sdcard 目錄下)
    adb shell (Android 模擬器啟動命令列模式)
    #cd /sdcard (進入 /sdcard 目錄)
    #ls (查看 SD 記憶卡中的檔案)


  • 使用 adb+pull 從 SD 記憶卡下載檔案
    adb pull /sdcard/001.jpg . (下載 /sdcard 目錄下的檔案)
    adb pull /sdcard/pictures . (下載 sdcard 目錄下的 pictures 目錄)


  • 刪除 SD 卡里面的檔案
    adb shell
    #ced /sdcard
    #rm 001.jpg (刪除 SD 記憶卡里的檔案)
    #rm -r * (刪除 SD 記憶卡里所有檔案與目錄)


  • Android模擬器影片播放方法
    mksdcard 4096M video.img (製作一個影像檔的 SD 記憶卡)
    adb push video.avi /sdcard (從電腦複製影像檔到 SD 卡中)
    emulator -sdcard video.img (啟動模擬器並載入 SD 卡)

    下載免費的影片播放軟體,ex: Meridian Video Player (iiivpa.apk)
    http://sites.google.com/site/eternalsandbox/Home/meridian-video-player
    adb install iiivpa.apk (安裝Meridian Video Player)
    接下來就可以用裝上去的player播放.mp4、3gp與.wmv三種檔案格式

  • 安裝 APK 應用程式
    adb install filename.apk (安裝filename.apk)
    adb install -r filename.apk (保留已設定資料,重新安裝filename.apk)
    adb -s emulator-5554 install filename.apk (指定安裝 APK 套件在 5554 的 Android 模擬器中)


  • 移除 APK 應用程式
    adb uninstall package
    adb uninstall -k package (移除程式時,保留資料)

    此package名稱不是安裝APK套裝時的檔名或顯示在模擬器中的應用程式名稱
    可以先到/data/data或data/app目錄下,查詢想移除的package名稱
    adb shell
    ls /data/data 或 /data/app (查詢 Package 名稱)
    exit
    adb uninstall package (移除查詢到的 Package)


  • ADB 系統除錯與連結工具
    $adb devices (顯示目前有多少個模擬器正在執行)
    $adb -s (指定模擬器來操作)
    adb -s emulator-5554 install email.apk

    $adb install apkfile (安裝 APK 應用程式套件)
    adb install email.apk
    $adb uninstall package (移除 APK 應用程式套件)
    adb uninstall com.android.email

    $adb shell (進入 Android 系統指令列模式)
    $ls
    $dmesg (查看 Android Linux Kernel 運作訊息)

    ls - 顯示檔案目錄
    cd - 進入目錄
    rm - 刪除檔案
    mv - 移動檔案
    mkdir - 產生目錄
    rmdir - 刪除目錄

    $adb push (複製檔案到 SD 卡)
    adb push mp3 /sdcard
    $adb pull . (從 Android 系統下載檔案)
    adb pull /data/app/com.android.email

    $adb logcat (監控模擬器運作紀錄,以Ctrl + c 離開監控模式)
    $adb bugreport (產生 adb 除錯報告)
    $adb get-state (獲得 adb 伺服器運作狀態)
    $adb start-server (啟動 adb 伺服器)
    $adb kill-server (關掉 adb 伺服器)

    $adb forward tcp:6100 tcp:7100 (更改模擬器網路 TCP 通訊埠)
    $adb shell ps -x (顯示 Android 上所有正在執行的行程)
    $adb version (顯示 adb 版本)
    $adb help (顯示 adb 指令參數)

  • Emulator 命令列啟動參數
    emulator -timezone Asia/Taipei (指定時區)
    emulator -no-boo-anim (省略開機小機器人動畫畫面)
    emulator -scale auto (調整模擬器視窗大小)
    emulator - scale factor (factor: 0.1-3.0)

    emulator -dpi-device 300 (更改模擬器的解析度,default為 165dpi)
    emulator -skin (更改模擬器顯示模式)
    emulator -help-keys (顯示鍵盤快速鍵說明)
    emulator -shell (相當於adb shell 功能)
    emulator -data data.img (使 /data 目錄使用 data.img 的檔案空間)
    emulator -sdcard sdcard.img (使 /sdcard 目錄使用 sdcard.img 的檔案空間)
    emulator -cache cache.img (瀏覽器暫存檔儲存空間)

    emulator -wipe-data (使模擬器恢復到原廠設定)
    emulator -help (顯示 emulator 指令參數)
  • 【轉】Network performance debug tools : Iperf

    使用Iperf測試網路效能

    測試傳輸效能及穩定度其實很容易,我們將教會你如何透過免費工具來做到這件事。


    在企業評估網路設備的流程中,實際測試佔了非常重要的一環(愈大型的產品更是如此),目的是為了找出符合需求的設備,避免IT投資的浪費。一般來說,網路 設備的測試有兩種常見的做法,一種是將設備直接部署上線,觀察它在真實流量下的運作情況,至於另外一種方式則是利用工具取得數據。

    雖然透過工具測試網路設備,經常會與實際環境下的結果有所落差,不過對於測試時間有限的企業來說,仍然是可行的做法,而我們所要介紹的Iperf,正是一套常用的免費流量產生工具,可以幫助企業測試網路設備的傳輸效能,或者找出實際環境當中的效能瓶頸。

    能在Windows等多種平臺環境下運作
    我們此次使用的Windows版本Iperf主程式執行檔,可以在http://www.noc.ucf.edu/Tools/Iperf /iperf.exe下載,它支援Windows、Linux等多種平臺環境。除了該工具之外,網路上常見的類似測試工具還包括了Netperf。

    就我們這次使用的Windows版本來說,程式不需要安裝就能直接使用。只要將Iperf.exe的主程式放置到適當路徑(例如C:\),之後就可以在命令提示字元的環境下,以指令方式運行Iperf的各項功能模式。

    既然是以流量方式測試效能,因此執行Iperf的電腦需有兩臺,分別以伺服器及用戶端的模式開啟,其中前者負責接收用戶端電腦傳送而來的流量,並產生效能數據。

    就一般最常見的應用來說,只需要在Iperf主程式所在的目錄下,執行「iperf.exe -s」指令,就能讓電腦進入Iperf的伺服器模式。

    用戶端的操作指令就相對複雜一些,除了輸入「-c」參數啟用Iperf的用戶端模式之外,至少需要指定Iperf伺服器所在的IP位址,才能傳送流量到伺服器做測試。

    為了免去使用者理解參數功能的不便,因此後來也出現所謂的Jperf,也就是在原有的Iperf主程式之上,加上一個以Java編寫而成的圖形化介面,只要電腦本身有安裝JVM軟體,直接點選Jperf.bat這個批次檔,就能開啟圖形介面,操作Iperf的各項測試。

    功能以流量測試為主
    Iperf最常見的應用之一,是用來測試網路設備的NAT效能,以居易的Vigor2110路由器為例,我們將兩臺電腦分別接在這臺設備的WAN 及LAN埠,做為伺服器及用戶端電腦,經由傳輸流量所得的NAT效能為76.9Mbps,意味該款設備能夠介接的總頻寬(上傳+下載)大小約在 76~77Mbps左右。

    不過隨著設備啟用的功能愈來愈多,對於NAT轉送流量的能力也會有所影響(以企業端的UTM為例,影響最大的是閘道防毒、IPS及VPN等三項功 能,個人端設備的瓶頸則多半在於QoS),而以網路設備本身的設計來說,一般影響NAT效能表現的因素,由大至小,分別是處理器/記憶體、韌體及網路介面 等三項。

    當流量透過網路介面送入設備之後,會經由處理器的運算,根據封包表頭所提供的資訊而決定流向,而在開啟多項功能使得硬體資源消耗過多時,用來解析封包的硬體資源就會相對減少,使得效能下降。

    至於網路設備的韌體,就如同電腦的作業系統,當韌體撰寫得太過肥大,佔用太多的系統資源時,也同樣會影響效能表現。

    網路介面對於NAT效能的影響比較不明顯,多數網路設備內建的交換器晶片在等級上並沒有明顯的差異,不過也有少數設定不良的晶片會在網路封包密集傳送的情況下,出現比較明顯的效能波動。

    傳送流量之餘,也能測試設備運作是否穩定
    Iperf預設的測試時間是10秒,也就是說需以每10秒為一個段落進行傳輸測試。不過我們一般都會將測試時間拉長,同時增加傳輸次數,藉此瞭解流量傳輸的起伏,判斷穩定與否,這時可利用「-t」參數,設定用戶端傳輸流量的秒數。

    在傳送流量的同時,也能透過Iperf對於網路設備實施壓力測試,利用「-P」參數,同時模擬多臺電腦傳輸流量的行為,測試設備在開啟大量連線數 的情況下,能否持續正常運作,不過我們建議,如果要開啟大量的連線數,最好是使用Linux、FreeBSD版本的Iperf執行這項測試。

    也能用於無線網路的效能測試
    不只是有線網路的環境,Iperf也很適合用來測試無線網路,尤其是支援802.11n草案的無線網路設備。

    相較之下,Ixia的IxChariot及Qcheck是經常用來測試無線網路的兩套代表性軟體,但使用上都有一些限制,IxChariot的功 能雖然強大,然而使用上必須付費,同時使用者也必須瞭解如何設定測試的範本,形成一定的使用門檻;至於免費版本的Qcheck最多僅能傳送1MB大小的測 試檔案,在802.11n的環境下,往往未達效能傳輸的頂點,測試即告結束,因此僅能在802.11a/b/g的環境下測試無線網路的效能。

    由於可以長時間傳送大量流量,因此很多人也以Iperf測試無線網路,這裡我們使用了SMC的SMCWBR14S-N2無線路由器,搭配同廠牌 USB介面的SMCWUSBS-N網卡,在40GHz頻寬的802.11n模式下,透過Iperf測得的速度最快為79.4Mbps,與透過 IxChariot 5.4試用版測試所得的數據相差不多。文⊙楊啟倫

    使用Iperf測試網路設備效能

    我們將示範4個步驟,透過Iperf測試網路設備效能,使用居易的Vigor2110及支援802.11n無線網路標準的SMC SMCWBR14S-N2兩款消費端的路由器設備做為Iperf的測試平臺,在設備還原為出廠預設值的情況下,執行效能的傳輸測試。


    我們在連接居易Vigor 2110路由器WAN埠的電腦上輸入了iperf.exe–s指令,將該臺電腦設定為Iperf的伺服器。


    在另外一臺連接LAN埠的電腦上輸入指令,傳送流量到伺服器端測試效能,測試完畢後,在兩端的命令提示字元視窗皆會顯示測試結果。


    為了方便示範,這裡我們僅開啟了5個Session測試Vigor 2110同時傳輸封包,對於有意實施壓力測試的人來說,可以加大同時傳輸的Session數量。


    就無線網路的測試來說,在搭配同廠牌USB 介面的SMCWUSBS-N網卡,我們透過perf測得79.4Mbps的效能數據,大致符合802.11n的效能要求。

    iperf-1.7.0的移植(Porting iperf-1.7.0 to arm linux platform)

    1.cd 進入 iperf-1.7.0 目錄;
    2.make config (會生成config.h config.log config.status Makefile.rules);
    3.修改Makefile.rules, 將其中的CC C++ LD AR RANLIB 改為你的cross compile 工具;
    4.make (會生成 iperf);
    5.copy iperf 到你的嵌入式平台中;
    6.在你的嵌入式平台中執行iperf, 會提示缺少兩個庫文件, 於是將這兩個庫文件copy 到你的嵌入式平台上(你平台的RAM要夠大或帶有硬盤也可,別忘了為你兩個庫文件在/lib/目錄下創建聯接);
    7.執行iperf, OK!

    註:當然,如果在CFLAGS 中加入-static 的話,第6步就不需要了。


    網路效能測試工具 「iperf」

    Iperf是一個TCP/IP和UDP/IP的性能測量工具,能夠提供網路吞吐量訊息,以及震動、封包丟失、最大段和最大傳輸單元大小等統計信息;從而能夠幫助我們測試網路性能,定位網路瓶頸.perf 支援大多數的作業系統,如: Windows,Linux,FreeBSD,MACOSX,Solaris等等,使用上非常簡單,在你的網路環境中準備兩台電腦,各架設於兩端點間,如 core switch到RD switch之間,一邊設定為iperf server,另一邊設定成iperf client,這麼一來你就可以知道core switch與RD switch之間的throughput能達到多少!

    Step 1.下載程式
    Step 2.安裝 iperf(Server端)
    Step 3.安裝 iperf(client端)
    Step 4.看 iperf 結果
    Step 5.iperf 參數
    Step 6.jperf 圖形(GUI) 介面的 iperf


    Step 1.下載程式
    通常我們在 Linux 下面可以透過 Iometer 去測試硬碟的效能速度,那網路呢!!要以免費最簡單使用的就算是 iperf 了.Iperf 是由 NLANR( National Laboratory for Applied Network Research)所開發出來的工具,主要 iperf 可以用來量測網路的最大的 TCP / UDP 網路頻寬/效能,但僅僅如此如果你需要更精準的網路效能或是穩定度那建議使用 另外一套專業級的網路效能測試工具 - IxChariot (http://benjr.tw/?q=node/433).不過我們先來看看 iperf 如何使用, iperf 並不是 Linux 系統預設套件,可以從 sourceforge 中下載. http://sourceforge.net/projects/iperf 它支援的作業系統包括了 linux, unix 和 window,採用 Server / Client 模式進行量測.

    [root@Server ~]# svn co https://iperf.svn.sourceforge.net/svnroot/iperf iperf

    測試環境如下:

    基本上只要兩台 Linux 機台就可以做網路效能測試,當然兩張網卡速度要一致,並同時將這個程式安裝在 Server 和 Client 上面.


    Step 2.安裝 iperf(Server端 IP:192.12.1.2)

    [root@Server ~]# tar iperf
    [root@Server ~]# cd iperf
    #configure for your machine
    [root@Server iperf]# ./configure
    #compile Iperf
    [root@Server iperf]# make
    #install Iperf, if desired
    [root@Server iperf]# make install
    [root@Server iperf]#
    iperf -s

    Server 端的程式要先開,去監看 Client 端的封包!預設使用 TCP port 5001.TCP read/write buffer 預設是 8KB.


    Step 3.安裝 iperf(client端 IP:192.12.1.1)

    [root@benjr ~]# tar iperf
    [root@benjr ~]# cd iperf
    #configure for your machine
    [root@benjr iperf]# ./configure
    #compile Iperf
    [root@benjr iperf]# make
    #install Iperf, if desired
    [root@benjr iperf]# make install
    [root@benjr iperf]#
    iperf -c 192.12.1.2 -t 60 -i 30
    #-c : server IP
    #-t : 測量時間間隔為60秒
    #-i : 每隔 x 秒將測量結果顯示出來,最後再算出平均值.


    Step 4.看 iperf 結果
    (Server端 IP:192.12.1.2)

    [root@Server ~]# iperf -s
    ------------------------------------------------------------
    Server listening on TCP port 5001
    TCP window size: 85.3 KByte (default)
    ------------------------------------------------------------
    [ 4] local 192.12.1.2 port 5001 connected with 192.12.1.1 port 37994
    [ ID] Interval Transfer Bandwidth
    [ 4] 0.0-60.0 sec 6.58 GBytes 941 Mbits/sec

    顯示結果依序為1.執行時間 2.時間內所傳輸的總資料量. 3.頻寬為 941 Mbits/sec,跟我們實際 1G 頻寬差不多了.

    (client端 IP:192.12.1.1)

    [root@benjr ~]# iperf -c 192.12.1.2 -t 60 -i 30
    ------------------------------------------------------------
    Client connecting to 192.12.1.2, TCP port 5001
    TCP window size: 16.0 KByte (default)
    ------------------------------------------------------------
    [ 3] local 192.12.1.1 port 37994 connected with 192.12.1.2 port 5001
    [ ID] Interval Transfer Bandwidth
    [ 3] 0.0- 30.0 sec 3.3 GBytes 941 Mbits/sec
    [ ID] Interval Transfer Bandwidth
    [ 3] 30.0-60.0 sec 3.28 GBytes 942 Mbits/sec
    [ ID] Interval Transfer Bandwidth
    [ 3] 0.0-60.0 sec 6.58 GBytes 942 Mbits/sec


    Step 5.iperf 參數
    -w n[KM] 指定 TCP window size
    -l n[KM] 指定 read/write buffer 大小(預設為 8k)
    -Pn (大寫的P) client 端指定同時 (parallel) 跑幾個的 threads

    [root@Server ~]# iperf -s -w 2M -l 64k
    ------------------------------------------------------------
    Server listening on TCP port 5001
    TCP window size: 256 KByte (WARNING: requested 2.00 MByte)
    ------------------------------------------------------------
    [ 4] local 192.7.1.2 port 5001 connected with 192.7.1.1 port 41278
    [ 5] local 192.7.1.2 port 5001 connected with 192.7.1.1 port 41279
    [ 6] local 192.7.1.2 port 5001 connected with 192.7.1.1 port 41280
    [ 7] local 192.7.1.2 port 5001 connected with 192.7.1.1 port 41281
    [ ID] Interval Transfer Bandwidth
    [ 5] 0.0-120.0 sec 32.1 GBytes 2.30 Gbits/sec
    [ ID] Interval Transfer Bandwidth
    [ 6] 0.0-120.0 sec 33.4 GBytes 2.39 Gbits/sec
    [ ID] Interval Transfer Bandwidth
    [ 4] 0.0-120.0 sec 32.2 GBytes 2.31 Gbits/sec
    [ ID] Interval Transfer Bandwidth
    [ 7] 0.0-120.0 sec 33.3 GBytes 2.38 Gbits/sec
    [SUM] 0.0-120.0 sec 131 GBytes 9.38 Gbits/sec

    Server 和 Client 需要用相同的參數才可以跑!

    [root@benjr ~]# iperf -c 192.12.1.2 -t 60 -i 5 -w 2M -l 64k -P4


    Step 6.jperf 圖形(GUI) 介面的 iperf
    xjperf 是有圖形 GUI 介面的 iperf,不過他是架構在 iperf 必須先安裝過 iperf 才可以使用.下載點在 http://code.google.com/p/xjperf/downloads/list 方式也很簡單,先行安裝完 iperf http://benjr.tw/?q=node/369. 再解開 xjperf 即可執行

    [root@benjr ~]# unzip jperf2.0.0.zip
    Archive: jperf2.0.0.zip
    creating: bin/
    creating: lib/
    inflating: bin/iperf.exe
    inflating: jperf.bat
    inflating: jperf.sh
    inflating: jperf2.0.0.jar
    inflating: lib/forms-1.1.0.jar
    inflating: lib/jcommon-1.0.10.jar
    inflating: lib/jfreechart-1.0.6.jar
    inflating: lib/swingx-2008_02_03.jar
    [root@benjr ~]# sh jperf.sh

    相對應的指令參數會顯示在最上面,就如圖我們在使用 iperf 時一樣.不過我在 RHEL5 Update 2 上面使用時這一隻程式倒是常常當掉.

    Iperf使用說明

    Iperf 是一個 TCP/IP 和 UDP/IP 的性能測量工具,能夠提供網路吞吐率信息,以及震動、丟包率、最大段和最大傳輸單元大小等統計信息;從而能夠幫助我們測試網路性能,定位網路瓶頸。

    參數說明

    -s 以server模式啟動,eg:iperf -s
    -c host以client模式啟動,host是server端地址,eg:iperf -c 222.35.11.23

    通用參數

    -f [k|m|K|M] 分別表示以Kbits, Mbits, KBytes, MBytes顯示報告,預設以Mbits為單位,eg:iperf -c 222.35.11.23 -f K
    -i sec 以秒為單位顯示報告間隔,eg:iperf -c 222.35.11.23 -i 2
    -l 緩衝區大小,預設是8KB,eg:iperf -c 222.35.11.23 -l 16
    -m 顯示tcp最大mtu值
    -o 將報告和錯誤信息輸出到檔案eg:iperf -c 222.35.11.23 -o c:\iperflog.txt
    -p 指定服務器端使用的端口或客戶端所連接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999
    -u 使用udp協議
    -w 指定TCP窗口大小,預設是8KB
    -B 綁定一個主機地址或通訊埠(當主機有多個地址或通訊埠時使用該參數)
    -C 兼容舊版本(當server端和client端版本不一樣時使用)
    -M 設定TCP資料封包的最大mtu值
    -N 設定TCP不延時
    -V 傳輸ipv6資料封包

    server專用參數

    -D 以服務方式運行ipserf,eg:iperf -s -D
    -R 停止iperf服務,針對-D,eg:iperf -s -R

    client端專用參數

    -d 同時進行雙向傳輸測試
    -n 指定傳輸的位元組數,eg: iperf -c 222.35.11.23 -n 100000
    -r 單獨進行雙向傳輸測試
    -t 測試時間,預設10秒,eg: iperf -c 222.35.11.23 -t 5
    -F 指定需要傳輸的檔案
    -T 指定ttl值

    運作方式:

    1.隨意選擇結點A作為Server端,而B作為客戶端,在A上進入命令提示字元執行iperf -s,這樣iperf將以Server端方式啟動,並且通過TCP的5001port監聽.

    2.接下來我們到B節點進入命令提示字元,然後執行iperf -c 192.168.0.199 -t 60,這個命令是將B節點以客戶端的方式運行,並且連接IP地址為192.168.0.199的服務端,監視測量數據時間是60秒.

    3.執行完畢客戶端將自動開啟1903port連接服務端的5001port,通過發送與接收數據來實現測量頻寬的目的.

    4.與此同時我們在Server端上也可以看到有客戶端連接5001port的提示,這表明兩個節點已經建立了相應的連接,數據通訊正常.

    5.由於我們之前是設置了測量時間間隔為60秒,所以在60秒過後客戶端節點上就會顯示出測量的具體數據.

    6.當然我們還可以通過在客戶端上執行iperf -c 192.168.0.199 -t 60 -i 2,這樣將每隔兩秒自動將測量結果顯示出來,在最後再計算其平均值.


    當需要測試網 路環境中的速度是否為理想狀況時,最普通的是利網路芳鄰、FTP傳軟來達成測試的目地,但如果需要重覆測試取得平均值時,這樣的測法可能比較沒有效率了, 所以有iperf這樣的工具對於測試網路傳輸的速度來說就較方便。要使用iperf的話就要有2台電腦,一台為serve端,另一台為client端,此 次以windows環境來當做示範,需要windows版本可以到這裡下載取得,其他平台的話,iperf有提供原始碼可以供其他平台重新編譯就可以使用。

    以下則開始介紹如何使用iperf,分為Server與Client,要先執行Server程式再執行Client。

    Server(伺服端):

    執行iperf –s


    Client(客戶端):

    iperf –c 192.168.3.58 –w 100M –t 120 –i 10


    -c 192.168.3.58 :Server端的IP

    -w 100M :測試的檔案大小

    -t 120 :監視測量數據時間為120秒

    -i 10 :每隔10秒將數據顯示出來

    測試完成會如下面的圖總共測試從0.0~121.3秒,傳輸9.28GByte,


    所 使用的平均速度在657Mbits/sec,對於1Giga來說已經發揮6成的速度,當然這個環境下測試的值並不是理想值,在測試時還有另外在操作網路上 的軟體,所以速度並沒有我第一次在測試時平均可以跑到800Mbits/sec,想要知道自已網路環境是否為較合理的值可以使用iperf測試看看,把問 題找出來。

    通過簡單的設置和簡單的指令我們輕鬆實現了針對內網兩個節點之間頻寬傳輸速度的測量,當然iperf程序還支援很多參數,具體設定我們可以參考其 HELP,比較常用的有-l 緩衝區大小-m 顯示tcp最大mtu值-p 指定伺服端使用的port或客戶端所連接的port-u 使用udp協議-w 指定TCP窗口大小,預設是8KB-M 設定TCP資料封包的最大mtu值等。另外在客戶端上可以通過-n 指定傳輸的位元組-r 單獨進行雙向傳輸測試,在伺服端則可以通過-D參數以服務方式運行ipserf,以-R來停止iperf服務.

    Iperf 實做,tcp 與 udp 測速

    # wget -c http://ncu.dl.sourceforge.net/project/iperf/iperf/2.0.4%20source/iperf-2.0.4.tar.gz
    # mkdir iperfV2
    # mv iperf-2.0.4.tar.gz iperfV2
    # cd iperfV2
    # gzip -d iperf-2.0.4.tar.gz
    (解壓縮)
    # tar xvf iperf-2.0.4.tar
    # cd iperf-2.0.4
    # ./configure

    # make
    # make install-----
    到此時已經順利安裝完成
    # iperf -s 127.0.0.1 (開啟iperf server端程式,使用tcp通訊協定)
    # iperf -s 127.0.0.1 -u (開啟iperf server端程式,使用udp通訊協定)


    此時server端的軟體已經啟動.
    接下來於client端(windows system)在安裝檔的bin目錄下,並於dos視窗中執行

    # iperf -c [遠端ip] -w 1M (TCP通訊協定)

    或是

    # iperf -c [遠端ip] -w 1M -u (UDP通訊協定)


    8/15/2009

    要去大陸了之複習(1)

    24號即將要飛去深圳...來公司剛滿一個月就被派出去...還要負責3件case...

    還滿無言的...hychen笑的很開心!!!!

    總而言之,這次是個機會,但是真的實在是有點趕....

    信用卡來不及辦...台胞證要落地簽證...沒出過國的我只有一個人去!!!!

    超級的坎恪不安的啦...(還要去一個月....= =)

    負責的案子相當陌生,除了BT外...山寨機的wifi porting...android porting等等

    簡直要逼出我的潛能呀呀呀呀!!!!!!!!!

    以下先來複習之前學習過的東東吧...

    -------------------------------------------------------

    PC通常一上電,第一個執行的是BIOS,它負責的事有:

    1.所有硬體週邊初始化
    2.遮罩所有的中斷
    3.重新分配記憶體資源
    4.引導到MBR開機磁區,MBR存放著作業系統的開機程序,此程序會跳到作業系統的初始化入口

    其實bootload做的事跟BIOS差不多,但通常BIOS還有負責一些廠商的firmware設定等等其它作用,這些都是廠商的機密,而bootload是沒有像BIOS有這麼多功能的.

    bootload是常駐在快閃記憶體(flash)或者是ROM的低階元件,當power on時,bootload會馬上取得控制權.

    它主要是設計來執行低階的初始化作業 啟動影像檔載入及系統診斷,也可以包括target board的低階自我測試的程式,像是記憶體和輸出/輸入的測試.

    最後,bootload裡會包含一小段程式,它會載入和移轉控制權到其它的程式,而這程式通常都是作業系統.

    而這些不是今天的重點...我先把目標放在核心初始化...未來再來複習其它東西.

    在不同的處理器架構,都會產出許多的共通檔案,其中有個叫vmlinux的二進位檔,而這個vmlinux就是核心的本尊了.

    這vmlinux相當大,它可不可以直接放在嵌入式系統裡?答案是可以的,像是PowerPC架構和U-BOOT開機載入程序建置的平台,通常是可以直接啟動vmlinux影像檔的.(這我不太清楚好壞了...一般來說核心影像檔都是以壓縮的格式儲)

    然而其它架構(像是ARM)和開機載入程序的組合,就需要建置適合的內文來整合其它的共用程序.

    註:最常見的開機載入程序(bootload)就是U-Boot了,bootload跟硬體架構幾乎是密不可分的,所以不可能會有一個bootload可以適合多種平台架構(未來好像很難講!?)

    什麼叫適合的內文?當開機載入程序取得控制權,並沒有準備好執行環境,直到開機載入程序初如化處理器和相關硬體之後才會有.

    也就是說,當開機載入程序到執行作業系統的第一支程式(../init/main.c)時,如果沒有建立適合的內文及環境,是沒辦法執行main.c的.

    因為開機載入程序取得控制權時是沒有任何堆壘或是堆壘指標,所以這時只要執行一個簡單的C程式,都會造成處理器當機,因為C的任何變數是儲存在stack上的.

    這時你就知道為何要做成uImage檔了吧?會有u這個字,是因為U-BOOT的關係,而這個image檔,就是為了建立適合的環境以及低階公用常式,以便在特定架構中啟動核心.

    影像檔是很複雜的,而且又有組合語言的關係,令我非常的難以理解...所以大家只要知道為何要做成影像檔就好.

    其實真正的開機載入程序是有二層,其中開機載入程序在啟動時控制版子,它完全不依靠核心;而第二層bootstrap loader的主要功能像是介於開機載入程序及核心中間.

    也就是說,bootstrap loader的責任是執行解壓縮和重新定位核心影像檔,以便提供核心在運作時有適合的環境.

    像常看到成功載入核心時的一段訊息:

    Uncompressing Linux...................done, booting the kernel.

    這就是bootstrap loader成功解壓縮核心之後的訊息.

    另外我要提到一個重點:

    在移到核心時,所有的處理器暫存器所指向的邏輯位址,都是實體位址,可是當處理器暫存器以及核心的資料結構初始化之後,馬上就會受到處理器打開的MMU(記憶體管理單元)的影響,突然間,處理器所有能見到的位址空間,都變成了以虛擬位址定址所取代.

    這也是為什麼寫driver時,通常都會利用ioremap或其它技巧來轉換實體位址的關係了(除非處理器沒有MMU的架構...之前常被搞死...終於知道原因了...T_T)

    核心初始化的第一步,就是執行../init/main.c裡面的start_kernelo()的function,在這裡核心開始發展它的勢力!!!

    其中,它呼叫了一個setup_arch(),很清楚的,它會辨識特定的處理器,然後提供一個機制來呼叫(setup_processor)特定處理器的初始化常式,可以在../arch/arm/kernel/setup.c看到.

    其實核心初始化非常複雜,越瞭解下去就越煩...其中還有什麼核心命令列巨集等等....但我工作只是porting,深入瞭解對目前的我來說就未必有用,說不定還能因此鬱悶吐血身亡....所以點一點能止渴就好.