風河虛擬化元件使用說明(17)—— 測試Shared Memory demo
參考User Guide文件"Shared Memory Features",目前支援Shared Memory特性的Windows系統只有Windows 10,VxWorks系統只有VxWorks 7。
首先確認GuestOS Windows 10是否安裝Shared Memory驅動:
檢查vx_vsb工程,確認Shared Memory相關元件都已新增:
編譯vx_vsb工程,之後檢查vx_vip工程,確認Shared Memory相關元件都已新增:
編譯vx_vip工程,重新新增進romfs檔案系統。之後檢查rootos_vsb工程,確認Shared Memory相關元件都已新增:
編譯rootos_vsb工程,檢查rootos_vip工程的相關元件都已新增:
拷貝Vxworks映象至目標機,啟動目標機。啟動GuestOS VxWorks 7及GuestOS Windows 10,在hvconfig指令碼下使用device list命令檢視裝置,確定RootOS擁有裝置vmem0.0,vmem1.0,vmem2.0,vmem3.0:
確定GuestOS VxWorks 7擁有裝置vmem0.1,vmem4.0,GuestOS Windows 10擁有裝置vmem1.1,vmem4.1:
共享記憶體圖示如下:
下載並在主機安裝Visual Studio 2017 (15.0),只有15.0以後的版本才能編譯例程中的程式碼:
找到例程的目錄,包含原始碼及VS工程:
將編譯好的ShmemServer.exe和ShmemClient.exe複製到目標機的win10系統上,注意最好在目標機上也裝上Visual Studio 2017。
在RootOS,,GuestOS VxWorks 7執行vmemServer(),在GuestOS Windows 10執行ShmemServer.exe:
在RootOS,GuestOS VxWorks 7執行vmemClient(),在GuestOS Windows 10執行ShmemClient.exe:
注意到Server函式有兩個引數,分別表示是共享記憶體編號及傳輸一個Message佔有的位元組數;Client函式有三個引數,分別表示與Server函式對應的那一塊共享記憶體編號、傳輸多少個Message、每個Message佔有的位元組數。
在三個作業系統上分別執行Server和Client函式後,可看到共享記憶體傳遞資訊的相關資料,如Client接收到多少個Message,共傳輸多少位元組,產生多少箇中斷,總耗時,資料速率。
例程完畢,再深入瞭解下這個例程。
RootOS及GuestOS VxWorks 7上的Shared Memory例程程式碼可以通過下列方式查詢,在此以GuestOS VxWorks 7為例,RootOS同理。實際上,RootOS及GuestOS VxWorks 7的例程已經被打包成所謂的“層”,配置VIP工程時新增元件就是新增“層”。
開啟vx_vip的Kernel Configuration,找INCLUDE_HYPERVISOR_SHMEM_TESTS,在Synopsis欄下找到cdf檔案:
開啟cdf檔案後定位到usrHvShmemTests.c:
之後在主機上搜索這個c檔案:
開啟後發現實際呼叫了vmemTestInit():
vmemTestInit()位於shmemTest.c中,該C檔案路徑是C:/WindRiver/ vxworks-7/ pkgs/os/hv/ guest-benchmarks-1.0.1.2/shmem/src/shmemTest.c:
在此可以看出,Shared Memory例程的程式碼位於以下目錄,其中h資料夾和src資料夾及Makefile用於編譯適用於VxWorks (RootOS或GuestOS)的例程,Window資料夾中存有VS工程:
在主機的 Windriver Workspace目錄下搜尋shmemTest,可發現在RootOS和GuestOS VxWorks 7的VSB工程目錄下編譯的shmemTest.o,實際在RootOS和GuestO VxWorks7下呼叫的vmemClient就是來自這個shmemTest.o,每次編譯rootos_vip和vx_vip時,程式碼都會重新編譯:
對例程稍作修改,得到將GuestOS VxWorks 7作為Client,GuestOS Windows 10作為Server,VxWorks 7向Windows 10傳遞字串的DEMO。
GuestOS VxWorks 7使用C:/WindRiver/ vxworks-7/ pkgs/os/hv/ guest-benchmarks-1.0.1.2 /shmem/src/shmemTest.c中的vmemClient()函式:
GuestOS Windows 10使用下列路徑中的vs解決方案:
在GuestOS Windows 10中也安裝好Visual Studio 2017後,開啟ShmemServer.sln,新增除錯引數:
並對程式碼稍作修改,適當新增輸出資訊:
在主機上修改vx_vsb工程用到的程式碼shmemTest.c。在GuestOS VxWorks 7和GuestOS Windows 10兩端的程式碼中加上 puts(buffer + sizeof(UINT32)); 打印出在作業系統間傳遞的字串(例程中是msg0.msg1.msg2...):
在主機上重新編譯vx_vsb,vx_vip,重新新增vx_vip映象進入romfs,重新編譯rootos_vip,將映象拷貝至目標機,重新啟動目標機,進入GuestOS VxWorks 7和GuestOS Windows 10。
先執行Server(Server的引數通過vs的除錯選項配置,vmemServer()引數為1 32,兩個引數間通過空格隔開),再執行Client(Client的引數通過GuestOS VxWorks 7的C Shell配置,vmemClient 1,100,32),可看到在GuestOS之間傳遞的字串:
Server和Client之間通過共享記憶體傳遞資訊的程式碼流程如下:
Server /*Generate the device name 把共享記憶體塊當成一個裝置*/
/*Open a handle to the shared memory device */
/*Create the event used to signal interrupts*/
/*Tell the driver to use this event to signal interrupts*/
/*Determine shared memory size*/
/*Calculate max number of messages shared memory area will hold*/
/*Wait for the message*/
Client /*Confirm buffer size*/
/*Allocate temporary buffers*/
/*Create the semaphore used to signal interrupts*/
/*Open the shared memory device*/
/*Connect the interrupt handler*/
/*Determine shared memory size*/
/*Calculate max number of messages shared memory area will hold*/
/*Generate the outgoing message and send it*/
/*Wait for the reply message*/
Server /*Read the message*/
Server /*Generate reply message and send it*/
Client /*Read the reply message*/
/*Validate the reply message*/
/*Calculate performance*/