0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony Liteos_A內(nèi)核之iperf3移植心得

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:OpenAtom OpenHarmony ? 2022-10-16 21:15 ? 次閱讀

開源項目 OpenHarmony 是每個人的 OpenHarmony

蔣衛(wèi)峰

深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司

OS內(nèi)核開發(fā)工程師

一、iperf3工作原理

iperf3主要的功能是測試基于特定路徑的帶寬,在客戶端和服務(wù)器端建立連接(三次握手)后,客戶端發(fā)送一定大小的數(shù)據(jù)報并記下發(fā)送的時間,或者客戶端在一定的時間內(nèi)發(fā)送數(shù)據(jù)并記下發(fā)送的總數(shù)據(jù)。帶寬的大小等于發(fā)送的總數(shù)據(jù)除以發(fā)送的總時間。對服務(wù)器端來說,在連接建立時間內(nèi),接收的總數(shù)據(jù)除以所花時間即為服務(wù)器端所測得的帶寬。

iperf3測試UDP的性能時,客戶端可以指定UDP數(shù)據(jù)流的速率??蛻舳税l(fā)送數(shù)據(jù)時,將根據(jù)客戶提供的速率計算數(shù)據(jù)報發(fā)送之間的時延,客戶還可以指定發(fā)送數(shù)據(jù)報的大小。每個發(fā)送的數(shù)據(jù)報包含一個ID號,用來唯一地標(biāo)識該報文。服務(wù)器端則根據(jù)該ID號來確定數(shù)據(jù)報丟失和亂序。當(dāng)把UDP報文大小設(shè)置可以將整個報文放入IP層的包(packet)內(nèi)時,那么UDP所測得的報文丟失數(shù)據(jù)即為IP層包的丟失數(shù)據(jù)。這提供了一個有效的測試包丟失情況的方法。數(shù)據(jù)報傳輸延遲抖動(Jitter)的測試由服務(wù)器端完成,客戶發(fā)送的報文數(shù)據(jù)包含有發(fā)送時間戳,服務(wù)器端根據(jù)該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由于它是一個相對值,所以并不需要客戶端和服務(wù)器端時間同步。

由上介紹我們可以知道iperf3的功能增加了操作系統(tǒng)網(wǎng)絡(luò)度量的能力,而攜帶Liteos_A內(nèi)核的OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)操作系統(tǒng)目前還不支持這個功能,特此嘗試把iperf3移植到支持Liteos_A內(nèi)核的OpenHarmony操作系統(tǒng)中,并作此文分享一些心得。

二、iperf3移植過程

iperf3可以運行在Linux和Windows平臺下,其使用了標(biāo)準(zhǔn)的POSIX接口,因此將iperf3移植到Liteos_A上,目前Liteos_A支持用戶態(tài)和內(nèi)核態(tài)的命令,這個也造成了移植的很大困難,所以以下將2種添加命令的方式都記錄下,供讀者參考。

1.確定庫的類型

OpenHarmony有如下幾種目標(biāo)類型:

executable: 生成可執(zhí)行文件,對于Liteos_A,在目錄/bin下可以找到可執(zhí)行文件

shared_library: 生成.dll或.so動態(tài)鏈接庫、對于Liteos_A,在目錄/lib或者 /usr/lib下可以找到動態(tài)庫

static_library: 生成.lib或.a靜態(tài)鏈接庫

group: 生成依賴關(guān)系組

action: 運行腳本以生成文件

根據(jù)以上幾種類型的描述可知,將iperf3移植成executable類型的組件最為合適。

2.添加庫到工程中

將源碼下載到Linux下并解壓,執(zhí)行./configure,生成iperf_config.h,將iperf3的源碼拷貝到OpenHarmony代碼庫中合適的位置,如下將iperf3添加到/third_party目錄下。 c5f378f4-4bc1-11ed-a3b6-dac502259ad0.png ? 需要注意的是非內(nèi)核態(tài)的庫不能添加到內(nèi)核的目錄下,不然編譯和調(diào)試過程中相關(guān)的頭文件可能找不到。在/vendor/廠商名/產(chǎn)品型號/config.json中的某一子系統(tǒng)下添加組件。 ? d7fc5e94-4bc1-11ed-a3b6-dac502259ad0.png ? 在 /build/lite/components/子系統(tǒng)名.json中添加組件,如下: ? d82294d8-4bc1-11ed-a3b6-dac502259ad0.png ? 3.編寫配置BUILD.gn d84c6cea-4bc1-11ed-a3b6-dac502259ad0.png ? 移植的iperf3代碼目錄下需要提供一個gn文件,指明需要編譯的代碼。此文件可以通過import組件模板函數(shù)。一方面,很多引用到的頭文件需要逐個添加到系統(tǒng)BUILD.GN中去,import組件模板函數(shù)可以省去很多麻煩;另一方面,頭文件有多個,最終還很難確定是哪一個,使用系統(tǒng)配置好的組件模板函數(shù),可以自動匹配。

4.程序啟動入口:將三方庫添加到shell命令

1) 內(nèi)核態(tài)的shell功能不符合POSIX標(biāo)準(zhǔn),僅供調(diào)試使用,本文特記錄下其添加命令的方法,此方法分為靜態(tài)和動態(tài)兩種方式,添加方式如下:

① 命令源代碼包含如下頭文件

#include "shell.h"
#include "shcmd.h"

② 靜態(tài)注冊命令方式

第一步:調(diào)用SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook),在源文件最后增加這個調(diào)用即可。

第二步:在鏈接選項中添加鏈接該新增命令項參數(shù)

即在kernel/liteos_a/tools/build/mk/liteos_tables_ldflags.mk中增加相應(yīng)選項,SHELLCMD_ENTRY的第一個參數(shù)前加-u。

此方法添加的shell,在代碼編譯階段就已編譯進(jìn)去了,其實現(xiàn)原理是利用了編譯器的section特性(也是代碼模塊化的重要手段),將所有shell命令相關(guān)功能都放在一段連續(xù)的地址空間,將SHELLCMD_ENTRY宏一層層展開,即可得到下面原型。

LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd); //段的起始tag
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd); //段的結(jié)束tag
SHELLCMD_ENTRY(l,cmdType,cmdKey,paraNum,cmdHook)

如下是編譯后生成的map文件中shell段的部分,可以觀察到已經(jīng)通過此方法加入的shell命令。

d873856e-4bc1-11ed-a3b6-dac502259ad0.png

d8a89baa-4bc1-11ed-a3b6-dac502259ad0.png

③ 動態(tài)注冊命令方式

此類方式是在代碼運行階段動態(tài)的注冊,osCmdReg本身是一個函數(shù),在命令初始化的源代碼增加此函數(shù)調(diào)用。

UINT32 osCmdReg(CmdT ype cmdType, CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
函數(shù)原型在/kernel/liteos_a/shell/full/src/base/shcmd.c 可以找到,基本原理是將動態(tài)注冊的shell命令加入到動態(tài)shell命令鏈表空間。

2)用戶態(tài)的shell不用手動添加

添加目標(biāo)的方式為executable,將程序下載到目標(biāo)板上,在/bin目錄下找到可執(zhí)行的文件,只要在串口助手中輸入 ./bin/可執(zhí)行文件名,內(nèi)核即可動態(tài)加載可執(zhí)行的文件(或者輸入exec /bin/可執(zhí)行文件名)。

三、iperf3使用方式介紹

使用iperf3測試時必須將一臺主機設(shè)置為客戶端,一臺主機設(shè)置為服務(wù)器。在Linux環(huán)境或者Windows或者OpenHarmony shell交互窗口輸入iperf3 -h可以獲取iperf3的幫助信息。以下介紹幾種常見的使用方式:

1.iperf3測試TCP

在默認(rèn)的情況下,iperf3客戶端與指定的監(jiān)聽5201端口的iperf3服務(wù)器建立一個TCP會話。

服務(wù)端:iperf3 -s
客戶端:iperf3 -c 服務(wù)器IP   (默認(rèn)測試10秒),使用t來設(shè)置測試時間,單位是秒。
例如:iperf3 -c 192.168.99.74 -t 20
運行結(jié)果如下: d8c86f34-4bc1-11ed-a3b6-dac502259ad0.pngd8e0a31a-4bc1-11ed-a3b6-dac502259ad0.png ? 2.iperf3測試UDP iperf3測試UDP性能時,客戶端可以指定UDP數(shù)據(jù)流的速率??蛻舳税l(fā)送數(shù)據(jù)時,將根據(jù)客戶端提供的速率計算數(shù)據(jù)報發(fā)送之間的時延。 客戶端還可以指定發(fā)送數(shù)據(jù)報的大小。每個發(fā)送的數(shù)據(jù)報包含一個ID號,用來唯一標(biāo)識報文,服務(wù)器端根據(jù)該ID號來確定數(shù)據(jù)報丟失和亂序。

當(dāng)把UDP報文大小設(shè)置可以將整個報文放入IP層的包(packet)內(nèi)時,那么UDP所測得的報文丟失數(shù)據(jù)即為IP層包的丟失數(shù)據(jù),這提供了一個有效的測試包丟失情況的方法。

數(shù)據(jù)報傳輸延遲抖動(Jitter)的測試由服務(wù)器端完成,客戶發(fā)送的報文數(shù)據(jù)包含有發(fā)送時間戳,服務(wù)器端根據(jù)該時間信息和接收到報文的時間戳來計算傳輸延遲抖動。傳輸延遲抖動反映傳輸過程中是否平滑。由于它是一個相對值,所以并不需要客戶端和服務(wù)器端時間同步。測試過程如下:

服務(wù)端:iperf3 -s -p 6868  (設(shè)定服務(wù)端監(jiān)聽6868端口)
Liteos_A shell客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M
測試結(jié)果: d91241b8-4bc1-11ed-a3b6-dac502259ad0.pngd93c2b40-4bc1-11ed-a3b6-dac502259ad0.png ? - Jitter(延時變化):用iperf3 UDP測試來量度 - 數(shù)據(jù)報丟失:用iperf3 UDP測試來量度

- 帶寬:通過TCP測試來量度

3.反向帶寬測試

服務(wù)端使用的命令不變,客戶端需要加上參數(shù)-R,在幫助信息中,可以看到-R的信息是run in reverse mode (server sends, client receives)

服務(wù)端:iperf3 -s -p 6868
客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868 -u -b 100M -R
測試結(jié)果如下: d95c8ef8-4bc1-11ed-a3b6-dac502259ad0.pngd9dbaba2-4bc1-11ed-a3b6-dac502259ad0.png ? 4.同步雙向帶寬測試 客戶端加上命令參數(shù) -bidir
服務(wù)端:iperf3 -s -p 6868
客戶端:./bin/iperf3 -c 172.17.5.159 -p 6868-u-b100M-bidir
測試結(jié)果如下: da0b84e4-4bc1-11ed-a3b6-dac502259ad0.pngda387260-4bc1-11ed-a3b6-dac502259ad0.png ?

四、注意事項和遇到的問題及解決方法

1. Hi3516有三種下載程序的方式:串口、USB、網(wǎng)口轉(zhuǎn)USB。推薦使用USB來下載程序,使用串口來調(diào)試程序。

2. DevEco Device Tool工具使用USB燒錄Hi3516DV300鏡像時失敗,怎么解決? da570ae0-4bc1-11ed-a3b6-dac502259ad0.png ? 解決措施: 出現(xiàn)這個問題,主要是因為開發(fā)者將Device Tool工具安裝在系統(tǒng)盤符,在燒錄大文件時會因為沒有權(quán)限導(dǎo)致失敗,可以根據(jù)以下操作解決: ●在Windows平臺找到安裝目錄,如圖。鼠標(biāo)右鍵,選中屬性。 ●?依次操作,步驟5將紅框中兩個選項都勾選上。 ? da6fdcbe-4bc1-11ed-a3b6-dac502259ad0.png ? 3. Hi3516如果攜帶操作系統(tǒng)是支持Linux內(nèi)核的OpenHarmony,第一次下載時,需要格式化,下載完成后,系統(tǒng)啟動到boot,就不會引導(dǎo)整個系統(tǒng)應(yīng)用程序,這時需要點擊如下菜單,然后重新拔插USB才能進(jìn)入整個系統(tǒng)。 ? da9fbb14-4bc1-11ed-a3b6-dac502259ad0.png ? 4. 在編寫.gn文件時,如果三方組件為executable,那么第三方庫代碼中需要有唯一個入口main函數(shù),最終生成一個可執(zhí)行的命令。 5. iperf有大版本1,2,3,目前最新的是iperf3,不同的版本間命令參數(shù)不同,工作機制有所不同,所以在測試時,服務(wù)端和客戶端要求使用相同的大版本。例如iperf3服務(wù)端不支持iperf的-u,-命令。 6. 在使用iperf3進(jìn)行測試過程中,需要關(guān)閉防火墻,不然可能不能進(jìn)行正常測試,可以提前使用ping測試一下網(wǎng)絡(luò)是否已通。 7. 公司網(wǎng)絡(luò)端的控制也會對測試造成影響,如果測試中發(fā)現(xiàn)發(fā)送和接收到的數(shù)據(jù)一直是0,則可能是網(wǎng)絡(luò)控制端進(jìn)行了控制,在拔掉外網(wǎng)絡(luò)的情況,測試出來的結(jié)果就會很穩(wěn)定。 8. Hi3516主板作為服務(wù)端,輸入iperf3 -s,然后在PC機上啟動客戶端進(jìn)行測試,發(fā)現(xiàn)根本不能進(jìn)行正常測試,原因也是公司網(wǎng)絡(luò)控制導(dǎo)致,解決辦法是將要測試的兩個網(wǎng)絡(luò)接口,接到同一交換機下,然后拔掉外網(wǎng)的網(wǎng)線,可以進(jìn)行正常測試;或者需要IT開發(fā)權(quán)限,當(dāng)然如果不是在公司特定網(wǎng)絡(luò)環(huán)境下,這個現(xiàn)象是不會出現(xiàn)的。 9. Hi3516需要設(shè)置網(wǎng)絡(luò)才能進(jìn)行測試,可以使用命令ifconfig來設(shè)置,例如: ifconfig eth0?172.17.5.253 netmask 255.255.254.0 gateway 172.17.4.1 10. MSS在OpenHarmony的底層LWIP不支持,在iperf_connect函數(shù)中調(diào)用getsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_MAXSEG, &opt, &len),會通過系統(tǒng)調(diào)用到達(dá)kernel層中的/kernel/liteos_a/compat/posix/src/socket.c, 最終走到底層LWIP的lwip_getsockopt_impl接口,在level IPPROTO_TCP下,對于分支TCP_MAXSEG,沒有實現(xiàn),解決辦法是先屏蔽iperf3對此處的操作。同樣在調(diào)用setsockopt(s, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt))時,SO_SNDBUF分支在LWIP也未實現(xiàn),先屏蔽此處,將發(fā)送緩沖區(qū)設(shè)置成和接收緩沖區(qū)同樣的大小。 11. Liteos_A未實現(xiàn)延時刪除,所以調(diào)用unlink時會出錯,目前處理是先屏蔽此處。 12. Liteos_A對fprintf的實現(xiàn)也不如Linux,Windows好,所以對help命令輸出到stdout上,長字串顯示不出來,解決辦法是使用fputs替換fprintf。

五、總結(jié)

本文從iperf3的工作原理、移植過程、使用方式、注意事項四個方面介紹了將iperf3移植到支持Liteos_A內(nèi)核的OpenHarmony操作系統(tǒng)中的方法,希望本篇文章對開發(fā)者有所幫助。 關(guān)于OpenHarmony內(nèi)核的內(nèi)容,之前我還介紹了內(nèi)核對象隊列的算法、OpenHarmony LiteOS-M內(nèi)核事件的運作機制,以及內(nèi)核IPC機制數(shù)據(jù)結(jié)構(gòu),感興趣的讀者可以點擊閱讀:《OpenHarmony——內(nèi)核對象隊列之算法詳解(上)》、《OpenHarmony——內(nèi)核對象隊列之算法詳解(下)》、《OpenHarmony——內(nèi)核對象事件之源碼詳解》、《OpenHarmony——內(nèi)核IPC機制數(shù)據(jù)結(jié)構(gòu)解析》。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3546

    瀏覽量

    15734

原文標(biāo)題:OpenHarmony Liteos_A內(nèi)核之iperf3移植心得

文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    淺談OpenHarmony LiteOS-A內(nèi)核基礎(chǔ)硬件——中斷控制器GIC400

    OpenHarmony(以下簡稱“OpenHarmony”)采用多內(nèi)核架構(gòu),支持Linux內(nèi)核的標(biāo)準(zhǔn)系統(tǒng)、LiteOS-A的小型系統(tǒng)、
    的頭像 發(fā)表于 10-26 23:00 ?2062次閱讀

    求助,請問esp32的iperf能升級為iperf3嗎?

    請問esp32的iperf能升級為iperf3
    發(fā)表于 06-12 06:19

    給路由器安裝一個軟件iperf3的步驟

    telnet登錄路由器,進(jìn)入工廠模式。 3. cd到要上傳的目錄。 4. tftp -gr iperf3 192.168.2.100。意思:下載 文件名 從PC。 5. ls檢查是否下載成功
    發(fā)表于 07-24 06:53

    [HarmonyOS][鴻蒙專欄開篇]快速入門OpenHarmonyLiteOS內(nèi)核

    。 `Huawei LiteOS`微內(nèi)核在`OpenHarmony`源碼中所處的位置:3LiteOS的目錄介紹我們以`Cortex-
    發(fā)表于 09-14 19:40

    韋東山鴻蒙系統(tǒng)移植課程:給IMX6ULL編譯Liteos-a

    下載源碼》。1.3 編譯我的修改還不完善,還無法在根目錄下編譯。需要進(jìn)入kernel/liteos_a目錄下配置、編譯:cd/home/book/openharmony/kernel
    發(fā)表于 09-30 15:51

    LiteOS-A內(nèi)核

    更友好的開發(fā)體驗。圖1為OpenHarmony LiteOS-A內(nèi)核架構(gòu)圖:圖 1 OpenHarmony LiteOS-A
    發(fā)表于 04-23 17:10

    OpenHarmony LiteOS-A內(nèi)核介紹

    內(nèi)核架構(gòu)圖:圖 1OpenHarmony LiteOS-A內(nèi)核架構(gòu)圖目錄/kernel/liteos_a├── apps # 用戶態(tài)的ini
    發(fā)表于 08-19 10:46

    給大家分享瑞芯微三款A7芯片liteos_a內(nèi)核補丁

    1、鴻蒙內(nèi)核liteos_a移植補丁-支持rk3126c rk3288 rv1126給大家分享瑞芯微三款A7芯片liteos_a
    發(fā)表于 09-07 17:36

    OpenHarmony Liteos_A內(nèi)核iperf3移植心得

    目前還不支持這個功能,特此嘗試把iperf3移植到支持Liteos_A內(nèi)核OpenHarmony操作系統(tǒng)中,并作此文分享一些
    發(fā)表于 10-18 11:32

    LiteOS-A內(nèi)核中的procfs文件系統(tǒng)分析

    》、《OpenHarmony——內(nèi)核IPC機制數(shù)據(jù)結(jié)構(gòu)解析》、《OpenHarmony Liteos_A內(nèi)核
    發(fā)表于 12-08 11:31

    LS1046如何使用iperf3工具測試TCP數(shù)據(jù)包傳輸?

    LS1046: 我嘗試使用iperf3工具測試TCP數(shù)據(jù)包傳輸。 找到一些速度為 10Mb/s 的重傳。數(shù)據(jù)包大小為 60 字節(jié)。(網(wǎng)絡(luò)鏈接為 100Mbps) ethtool notify
    發(fā)表于 05-10 08:07

    LS1046A運行iperf3時出現(xiàn)內(nèi)核崩潰怎么解決?

    我對內(nèi)核恐慌有一些疑問。我使用 LS1046A 作為服務(wù)器端,我的 PC 作為客戶端。 PC通過telnet輸入命令:iperf3 -c 192.168.1.254 -t 600 -R 經(jīng)過
    發(fā)表于 05-29 08:35

    淺談OpenHarmony內(nèi)核以及OpenHarmony開發(fā)語言

    、java、Python、C++ 等等。 OpenHarmony內(nèi)核有兩個,一個是liteos_A另一個是lite_M。 要說這倆有啥區(qū)別呢?按照我個人的理解大概就是liteos_A
    的頭像 發(fā)表于 06-24 09:47 ?3736次閱讀

    OpenHarmony內(nèi)核是什么

    OpenHarmony源碼里面包含兩個內(nèi)核代碼,分別是liteos_A和lite_M。
    的頭像 發(fā)表于 06-24 10:08 ?3039次閱讀

    【鴻蒙】小型系統(tǒng)LiteOS-A內(nèi)核

    LiteOS-A 內(nèi)核 移植概述 移植場景 LiteOS-A 當(dāng)前支持 ARMv7-a 指令集架
    的頭像 發(fā)表于 02-29 16:16 ?840次閱讀
    【鴻蒙】小型系統(tǒng)<b class='flag-5'>LiteOS-A</b><b class='flag-5'>內(nèi)核</b>