核間通信的主要目標是:充分利用硬件提供的機制,實現高效的CORE間通信;給需要CORE間通信的應用程序提供簡潔高效的編程接口。
根據所使用的硬件特性,核間通信可能的實現機制有:
1) Mailbox中斷;
2) 基於共享內存的消息隊列;
3) POW + Group;
4) FAU;支持原子的讀,寫,fetch and add操作。
每個core有一個相應的32bit的mailbox寄存器,每一位可被單獨地設置或清零。這對於core間的中斷非常有用,任意core可直接通過其它core 的mailbox對其它core發出中斷。當mailbox被置位時,相應core的中斷寄存器也同時被置位,軟件可實現其中斷處理。
Bootloader支持Octeon_phy_mem_named_block_alloc( ),分配以名字命名的物理內存空間,不管是Service Executive應用程序還是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的名字參數隨后由希望共享該內存區的任何其他進程使用。