mailbox其实是多核处理器soc上,核与核之间互相发中断的机制,由于核与核之间可能存在不同的业务,故硬件上设计分配一两个中断已经无法满足业务的需求,软件拓展起来很困难,所以mailbox可以理解为软件可自由定义的中断模块。
用于在片上处理器之间通信的一种mailbox队列中断机制,mailbox队列中断机制允许软件通过一组寄存器和关联的中断设置和得到信息在二个处理之间建立通信渠道。
核间通信的主要目标是:充分利用硬件提供的机制,实现高效的CORE间通信;给需要CORE间通信的应用程序提供简洁高效的编程接口。
根据所使用的硬件特性,核间通信可能的实现机制有:
每个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
全部0条评论
快来发表一下你的评论吧 !