mailbox其實是多核處理器soc上,核與核之間互相發中斷的機制,由于核與核之間可能存在不同的業務,故硬件上設計分配一兩個中斷已經無法滿足業務的需求,軟件拓展起來很困難,所以mailbox可以理解為軟件可自由定義的中斷模塊。
用于在片上處理器之間通信的一種mailbox隊列中斷機制,mailbox隊列中斷機制允許軟件通過一組寄存器和關聯的中斷設置和得到信息在二個處理之間建立通信渠道。
核間通信的主要目標是:充分利用硬件提供的機制,實現高效的CORE間通信;給需要CORE間通信的應用程序提供簡潔高效的編程接口。
根據所使用的硬件特性,核間通信可能的實現機制有:
- Mailbox中斷;
- 基于共享內存的消息隊列;
- POW + Group;
- FAU;支持原子的讀,寫,fetch and add操作。
每個core有一個相應的32bit的mailbox寄存器,每一位可被單獨地設置或清零。這對于core間的中斷非常有用,任意core可直接通過其它core的mailbox對其它core發出中斷。當mailbox被置位時,相應core的中斷寄存器也同時被置位,軟件可實現其中斷處理。
Bootloader支持Octeon_phy_mem_named_block_alloc( ),分配以名字命名的物理內存空間,不管是ServiceExecutive應用程序還是linux kernel都可以通過Octeon_phy_mem_named_block_find()找到這部分內存,實現core之間的共享數據。
Linux kernel也提供了共享內存的機制。主要有mmap(),系統V,Posix共享內存模型等。系統調用mmap()通過映射一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以向訪問普通內存一樣對文件進行訪問。系統V共享內存指的是把所有共享數據放在共享內存區域(IPC shared memory region),任何想要訪問該數據的進程都必須在本進程的地址空間新增一塊內存區域,用來映射存放共享數據的物理內存頁面。posix共享內存區首先指定一個名字參數調用shm_open,以創建一個新的共享內存區對象或打開一個以存在的共享內存區對象。然后調用mmap把這個共享內存區映射到調用進程的地址空間。傳遞給shm_open的名字參數隨后由希望共享該內存區的任何其他進程使用。
核間通信方案
如下圖所示ARM核和DSP核進行mailbox通信,ARM要發送數據給DSP:
? 1 ARM核先往某個指定的共享內存空間buffer寫入數據,然后MAILBOX觸發中斷和寫入關于共享內存空間的地址信息給DSP。
? 2 DSP通過得到mailbox中斷的信息讀取共享內存空間ARM核發送的buffer數據。
? 3 DSP核讀取完數據后將觸發mailbox中斷給ARM作為回應,告訴ARM核你發送的數據我已經接受完成了。a
-
處理器
+關注
關注
68文章
19166瀏覽量
229152 -
寄存器
+關注
關注
31文章
5319瀏覽量
120016 -
通信
+關注
關注
18文章
5973瀏覽量
135860 -
soc
+關注
關注
38文章
4122瀏覽量
217948
發布評論請先 登錄
相關推薦
評論