前言
目前域控項目有的采用S32G這類多核異構的芯片,轉載一篇分析下多核異構中A核與M核通信過程的文章。
正文
一、 硬件層通信實現原理
二、驅動層Virtio下RPMsg通信實現
三、應用層雙核通信實現方式
現在越來越多的產品具有M core和A core的異構架構,既能達到M核的實時要求,又能滿足A核的生態和算力。比如NXP的i.MX8系列、瑞薩的RZ/G2L系列以及TI的AM62x系列等等。雖然這些處理器的品牌及性能有所不同,但多核通信原理基本一致,都是基于寄存器和中斷傳遞消息,基于共享內存傳輸數據。
通信過程整體架構說明
一、 硬件層通信實現原理
通過物理內存DDR分配,將硬件層分為了兩部分:TXVring Buffer(發送虛擬環狀緩沖區)和RXVring Buffer(接收虛擬環狀緩沖區);其中M核從TXVring區發送數據,從RXVring區讀取接收數據,A核反之。
處理器支持消息傳遞單元(MessagingUnit,簡稱MU)功能模塊,通過MU傳遞消息進行通信和協調,M核和A核之間通過寄存器中斷的方式傳遞命令,最多支持4組MU雙向傳遞消息,既可通過中斷告知對方數據傳遞的狀態,也可發送最多4字節數據,還可在低功耗模式下喚醒對方,是保證雙核通信實時性的重要手段。
下面看下完成了1次從CoreA向CoreB 傳遞消息的具體過程:
寄存器輸入輸出通信模型
(1)CoreA寫入數據;
(2)MU將Tx 空位清0,Rx滿位置1;
(3)產生接收中斷請求,通知CoreB接收狀態寄存器中的接收器滿,可以讀取數據;
(4)CoreB響應中斷,讀取數據;
(5)CoreB讀完數據后,MU將Rx滿位清0,Tx空位置1;
(6)狀態寄存器向CoreA生成發送中斷請求,告知CoreB讀完數據,發送寄存器空。
二、驅動層Virtio下RPMsg通信實現
virtio 是一個通用的 I/O 虛擬化框架,位于設備之上的抽象層,負責前后端之間的通知機制和控制流程,為異構多核間數據通信提供了層的實現。hypervisor 通過他模擬出一系列的虛擬化設備,例如:virtio-net、virtio-blk等,并使得這些設備在虛擬機內部通過 api 調用的方式變得可用。它包含4個部分:前端驅動、后端驅動、 vring 及通信間統一的接口。與其他的模擬 I/O 方式對比, virtio 減少了虛擬機的退出和數據拷貝,能夠極大地提高 I/O 性能。計算機中存在不同的總線標準,而 virtio 采用的是 pci 總線(當然也可以用其他總線來實現)。每一個 virtio 設備就是一個 pci 設備。
virtio前端驅動
virtio 前端驅動位于 Linux 內核中,運行在虛擬機 VM,針對不同類型的設備有不同類型的驅動程序,包括virtio-net、virtio-blk、virtio-pci等,這些驅動程序與后端驅動交互的接口都是統一的。
virtio層
virtio層實現虛擬隊列接口,作為前后端通信的橋梁,不同類型的設備使用的虛擬隊列數量不同,例如 virtio-net 使用兩個虛擬隊列,一個用于接收,一個用于發送;virtio-blk 驅動僅使用一個虛擬隊列。虛擬隊列實際上被實現為跨越客戶機操作系統和 hypervisor 的銜接點,可以通過任意方式實現,前提是客戶機操作系統和 virtio 后端程序都遵循一定的標準,以相互匹配的方式實現它。
virtio-ring層
virtio-ring 是虛擬隊列的具體實現,其中實現了環形緩沖區(ring buffer),用于保存前端驅動和后端處理程序執行的信息,并且它可以一次性保存前端驅動的多次I/O請求,并且交由后端驅動去批量處理,最后實際調用宿主機中設備驅動實現物理上的I/O操作,這樣做就可以根據約定實現批量處理而不是客戶機中每次I/O請求都需要處理一次,從而提高客戶機與 hypervisor 信息交換的效率。
virtio后端驅動
virtio 后端驅動位于 qemu ,后端設備承擔的主體功能分為兩部分:
virtio后端設備的模擬;
依據virtio協議處理來自虛擬機端發送的請求。
在 QEMU 的實現中, virtio 設備是 QEMU 為虛擬機模擬的 PCI 設備,遵循 PCI-SIG 定義的 PCI 規范,具有配置空間、中斷配置等功能;virtio 后端驅動運行在宿主機中,用于實現 virtio 后端操作硬件設備,例如向內核協議棧發送一個數據包完成虛擬機對網絡數據的操作。
RPMsg消息框架是Linux系統基于Virtio緩存隊列實現的主處理核和協處理核間進行消息通信的框架,當客戶端驅動需要發送消息時,RPMsg會把消息封裝成Virtio緩存并添加到緩存隊列中以完成消息的發送,當消息總線接收到協處理器送到的消息時也會合理地派送給客戶驅動程序進行處理。
在驅動層,對A核,Linux采用RPMsg框架+Virtio驅動模型,將RPMsg封裝為了tty文件供應用層調用;在M核,將Virtio移植,并使用簡化版的RPMsg,因為涉及到互斥鎖和信號量,最終使用FreeRTOS完成過程的封裝,流程框圖如下方所示。
主處理核與協處理核數據傳遞流程圖
(1)Core0向Core1發送數據,通過rpmsg_send函數將數據打包至Virtioavail鏈表區;
(2)在avail鏈表尋找共享內存中空閑緩存,將數據置于共享內存中;
(3)通過中斷通知Core1數據到來,共享內存由avail鏈表區變至used區;
(4)Core1收到中斷,觸發rpmsg的接收回調函數,從used區獲取數據所在的共享內存的物理地址,完成數據接收;
(5)通過中斷通知Core0數據接收完成,共享內存緩存由used區變為avail區,供下次傳輸使用。
三、應用層雙核通信實現方式
在應用層,對A核可使用open、write和read函數對 /dev下設備文件進行調用;對M核,可使用rpmsg_lite_remote_init、rpmsg_lite_send和rpmsg_queue_recv函數進行調用,不做重點闡述。從整體架構上看,關系如下:
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
18927瀏覽量
227247 -
芯片
+關注
關注
450文章
49636瀏覽量
417211 -
通信
+關注
關注
18文章
5880瀏覽量
135323 -
瑞薩
+關注
關注
33文章
22274瀏覽量
85513 -
多核異構
+關注
關注
0文章
16瀏覽量
5432
原文標題:A核與M核異構通信過程解析
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論