多CPU间的通信方法、系统及CPU转让专利

申请号 : CN201010193491.8

文献号 : CN101957808B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 金伟赵先林黄毅胡扬忠邬伟琪

申请人 : 杭州海康威视数字技术股份有限公司

摘要 :

本发明公开了一种多CPU间的通信方法、系统及CPU,所述多CPU中的主CPU通过总线连接若干从CPU,所述方法包括:主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间;从CPU接收到主CPU触发的中断信号后,从CPU的内核从共享内存空间中获取所述数据;从CPU的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU的应用程序。本发明实施例中的多个CPU之间的应用程序通信时,通过在CPU的内核与应用程序之间设置SOCKET,将在传输不同命令时所需要设置的不同接口统一为SOCKET接口,降低了CPU内部接口设置的复杂性,提升了CPU间应用程序通信的性能。

权利要求 :

1.一种多CPU间的通信方法,其特征在于,所述多CPU中的主CPU通过总线连接若干从CPU,包括:主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间;

从CPU接收到主CPU触发的中断信号后,从CPU的内核从所述共享内存空间中获取所述数据;

从CPU的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU的应用程序;

其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。

2.根据权利要求1所述的方法,其特征在于,还包括:

所述从CPU启动时,在所述从CPU的应用程序和从CPU的内核分别建立关联的SOCKET;

所述从CPU的应用程序所建立的SOCKET监听所述从CPU的内核的请求。

3.根据权利要求1所述的方法,其特征在于,所述从CPU的内核通过预先建立的SOCKET将所述数据传输到所述从CPU的应用程序包括:所述从CPU的内核将所述数据封装成网络数据包;

所述从CPU的内核所建立的SOCKET通过单播方式将所述网络数据包发送到所述从CPU的应用程序所建立的SOCKET上。

4.根据权利要求1所述的方法,其特征在于,还包括:

所述从CPU的应用程序分析所述数据获得命令码;

根据所述命令码执行相应的操作;

将所述执行的结果数据通过所述从CPU的应用程序所建立的SOCKET返回所述从CPU的内核。

5.根据权利要求4所述的方法,其特征在于,还包括:

所述从CPU的内核将所述结果数据传输到所述主CPU内预先设置的共享内存空间;

主CPU接收到从CPU触发的中断信号后,主CPU的内核从所述共享内存空间中获取所述结果数据。

6.根据权利要求5所述的方法,其特征在于,还包括:

所述主CPU向从CPU发送所述中断信号后,主CPU将当前进程设置为睡眠状态;

主CPU接收到从CPU触发的中断信号后,所述主CPU将所述进程从睡眠状态唤醒。

7.一种多CPU间的通信系统,其特征在于,包括:至少一个主CPU,以及与所述主CPU通过总线相连的若干从CPU,所述主CPU,用于通过主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间;

所述从CPU,用于接收到主CPU触发的中断信号后,通过从CPU的内核从所述共享内存空间中获取所述数据,以及所述从CPU的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU的应用程序;

其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。

8.根据权利要求7所述的系统,其特征在于,所述从CPU还用于,启动时在所述从CPU的应用程序和从CPU的内核分别建立关联的SOCKET,所述从CPU的应用程序所建立的SOCKET监听所述从CPU的内核的请求。

9.根据权利要求7所述的系统,其特征在于,所述从CPU还用于,通过从CPU的应用程序分析所述数据获得命令码,根据所述命令码执行相应的操作,并将所述执行的结果数据通过所述从CPU的应用程序所建立的SOCKET返回所述从CPU的内核。

10.根据权利要求9所述的系统,其特征在于,所述从CPU还用于,通过所述从CPU的内核将所述结果数据传输到所述主CPU内预先设置的共享内存空间;

所述主CPU,还用于接收到从CPU触发的中断信号后,主CPU的内核从所述共享内存空间中获取所述结果数据。

11.一种中央处理器CPU,其特征在于,所述CPU作为从CPU应用于包含若干CPU的系统中,所述从CPU通过总线与主CPU连接,包括:接收单元、内核单元和应用程序单元,接收单元,用于接收主CPU触发的中断信号,所述中断信号为所述主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间后所发送的中断信号;

内核单元,用于从所述共享内存空间中获取所述数据,并通过预先建立的套接字SOCKET将所述数据传输到所述应用程序单元;

其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。

12.根据权利要求11所述的CPU,其特征在于,还包括:建立单元,用于所述从CPU启动时,在所述应用程序单元和内核单元分别建立关联的SOCKET;

所述应用程序单元,还用于通过所建立的SOCKET监听所述内核单元的请求。

13.根据权利要求11所述的CPU,其特征在于,所述内核单元包括:数据包封装子单元,用于将所述数据封装成网络数据包;

数据包传输子单元,用于通过所述内核单元所建立的SOCKET以单播方式将所述网络数据包发送到所述应用程序单元建立的SOCKET上。

14.根据权利要求11所述的CPU,其特征在于,所述应用程序单元还包括:数据分析子单元,用于分析所述数据获得命令码;

操作执行子单元,用于根据所述命令码执行相应的操作;

结果返回子单元,用于将所述执行的结果数据通过所述应用程序单元所建立的SOCKET返回所述内核单元。

15.根据权利要求14所述的CPU,其特征在于,所述内核单元,还用于将所述结果数据传输到所述主CPU内预先设置的共享内存空间。

说明书 :

多CPU间的通信方法、系统及CPU

技术领域

[0001] 本申请涉及通信技术领域,尤其涉及一种多CPU(Central Processing Unit,中央处理器)间的通信方法、系统及CPU。

背景技术

[0002] 大型应用系统中通常包含上千个CPU,每个CPU上会运行一个操作系统,每个操作系统上还会运行各种应用程序,各个操作系统之间,以及各种应用程序之间都可能进行通信。现有技术中,多个CPU进行通信时,需要分别为每个CPU设置外挂内存空间,在发送数据报文时,发送方CPU将待发送的数据报文写入接收方CPU的外挂内存空间,然后通过设置寄存器产生中断信号发送到接收方CPU,接收方CPU接收到中断信号后从外挂内存空间内接收数据报文。上述多CPU之间的通信主要是指CPU内核之间的通信,当两个CPU的应用程序需要通信时,则在每个CPU内部,还需要实现数据在应用程序与内核之间的传输。
[0003] 发明人在对现有技术的研究和实践过程中发现,多CPU之间的应用程序在进行通信时,在发送方CPU中的命令需要从发送方应用程序传输到发送方内核,发送方内核将命令传输到接收方CPU的内核后,接收方内核再将该命令传输到接收方应用程序。由于内核与应用程序之间通信时,对于不同的命令需要设置不同的接口进行传输,当CPU之间需要传输多种命令数据时,则需要在应用程序和接口之间设置多组接口进行传输,由此增加了CPU内部接口设置的复杂性。

发明内容

[0004] 本申请实施例的目的是提供一种多CPU间的通信方法、系统及CPU,以解决现有技术中多CPU之间传输不同命令时,CPU的内核和应用程序之间接口难以统一的问题。
[0005] 为解决上述技术问题,本申请实施例提供如下技术方案:
[0006] 一种多CPU间的通信方法,所述多CPU中的主CPU通过总线连接若干从CPU,包括:
[0007] 主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间;
[0008] 从CPU接收到主CPU触发的中断信号后,从CPU的内核从所述共享内存空间中获取所述数据;
[0009] 从CPU的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU的应用程序;
[0010] 其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。
[0011] 还包括:
[0012] 所述从CPU启动时,在所述从CPU的应用程序和从CPU的内核分别建立关联的SOCKET;
[0013] 所述从CPU的应用程序所建立的SOCKET监听所述从CPU的内核的请求。
[0014] 所述从CPU的内核通过预先建立的SOCKET将所述数据传输到所述从CPU的应用程序包括:
[0015] 所述从CPU的内核将所述数据封装成网络数据包;
[0016] 所述从CPU的内核所建立的SOCKET通过单播方式将所述网络数据包发送到所述从CPU的应用程序所建立的SOCKET上。
[0017] 还包括:
[0018] 所述从CPU的应用程序分析所述数据获得命令码;
[0019] 根据所述命令码执行相应的操作;
[0020] 将所述执行的结果数据通过所述从CPU的应用程序所建立的SOCKET返回所述从CPU的内核。
[0021] 还包括:
[0022] 所述从CPU的内核将所述结果数据传输到所述主CPU内预先设置的共享内存空间;
[0023] 主CPU接收到从CPU触发的中断信号后,主CPU的内核从所述共享内存空间中获取所述结果数据。
[0024] 还包括:
[0025] 所述主CPU向从CPU发送所述中断信号后,主CPU将当前进程设置为睡眠状态;
[0026] 主CPU接收到从CPU触发的中断信号后,所述主CPU将所述进程从睡眠状态唤醒。
[0027] 一种多CPU间的通信系统,包括:至少一个主CPU,以及与所述主CPU通过总线相连的若干从CPU,
[0028] 所述主CPU,用于通过主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间;
[0029] 所述从CPU,用于接收到主CPU触发的中断信号后,通过从CPU的内核从所述共享内存空间中获取所述数据,以及所述从CPU的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU的应用程序;
[0030] 其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。
[0031] 所述从CPU还用于,启动时在所述从CPU的应用程序和从CPU的内核分别建立关联的SOCKET,所述从CPU的应用程序所建立的SOCKET监听所述从CPU的内核的请求。
[0032] 所述从CPU还用于,通过从CPU的应用程序分析所述数据获得命令码,根据所述命令码执行相应的操作,并将所述执行的结果数据通过所述从CPU的应用程序所建立的SOCKET返回所述从CPU的内核。
[0033] 所述从CPU还用于,通过所述从CPU的内核将所述结果数据传输到所述主CPU内预先设置的共享内存空间;
[0034] 所述主CPU,还用于接收到从CPU触发的中断信号后,主CPU的内核从所述共享内存空间中获取所述结果数据。
[0035] 一种中央处理器CPU,所述CPU作为从CPU应用于包含若干CPU的系统中,所述从CPU通过总线与主CPU连接,包括:接收单元、内核单元和应用程序单元,[0036] 接收单元,用于接收主CPU触发的中断信号,所述中断信号为所述主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间后所发送的中断信号;
[0037] 内核单元,用于从所述共享内存空间中获取所述数据,并通过预先建立的套接字SOCKET将所述数据传输到所述应用程序单元;
[0038] 其中,所述预先建立的套接字SOCKET与线程号绑定,不同的线程具有不同的线程号,在建立应用程序的套接字SOCKET时,应用程序中开启一个线程,该线程打开一个套接字SOCKET。
[0039] 还包括:
[0040] 建立单元,用于所述从CPU启动时,在所述应用程序单元和内核单元分别建立关联的SOCKET;
[0041] 所述应用程序单元,还用于通过所建立的SOCKET监听所述内核单元的请求。
[0042] 所述内核单元包括:
[0043] 数据包封装子单元,用于将所述数据封装成网络数据包;
[0044] 数据包传输子单元,用于通过所述内核单元所建立的SOCKET以单播方式将所述网络数据包发送到所述应用程序单元建立的SOCKET上。
[0045] 所述应用程序单元还包括:
[0046] 数据分析子单元,用于分析所述数据获得命令码;
[0047] 操作执行子单元,用于根据所述命令码执行相应的操作;
[0048] 结果返回子单元,用于将所述执行的结果数据通过所述应用程序单元所建立的SOCKET返回所述内核单元。
[0049] 所述内核单元,还用于将所述结果数据传输到所述主CPU内预先设置的共享内存空间。
[0050] 可见,本申请实施例中多CPU中的主CPU通过总线连接若干从CPU,主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间,从CPU接收到主CPU触发的中断信号后,从CPU的内核从共享内存空间中获取数据,从CPU的内核通过预先建立的套接字SOCKET将数据传输到从CPU的应用程序。本申请实施例中的多个CPU之间的应用程序通信时,通过在CPU的内核与应用程序之间设置SOCKET,将在传输不同命令时所需要设置的不同接口统一为SOCKET接口,降低了CPU内部接口设置的复杂性,提升了CPU间应用程序通信的性能。

附图说明

[0051] 为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0052] 图1为本申请多CPU间的通信方法的第一实施例流程图;
[0053] 图2为本申请实施例中主CPU与从CPU之间的通信架构示意图;
[0054] 图3A为本申请多CPU间的通信方法的第二实施例流程图;
[0055] 图3B为本申请实施例中的PCI共享缓冲的数据格式示意图;
[0056] 图3C为本申请实施例中主从CPU之间发送命令的结构示意图;
[0057] 图4为本申请多CPU间的通信系统的实施例框图;
[0058] 图5为本申请CPU的第一实施例框图;
[0059] 图6A为本申请CPU的第二实施例框图;
[0060] 图6B为图6A中内核单元的实施例框图;
[0061] 图6C为图6A中应用程序单元的实施例框图。

具体实施方式

[0062] 本申请实施例提供一种多CPU间的通信方法、系统及CPU。本申请实施例的多个CPU中,包括至少一个主CPU和若干从CPU,其中主CPU通过总线与从CPU相连。本申请实施例中主CPU也可称为HOST CPU,从CPU也可称为SLAVE CPU。
[0063] 为了使本技术领域的人员更好地理解本申请实施例中的技术方案,并使本申请实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本申请实施例中技术方案作进一步详细的说明。
[0064] 参见图1,为本申请多CPU间的通信方法的第一实施例流程图:
[0065] 步骤101:主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间。
[0066] 本申请实施例中主CPU与从CPU之间可以通过PCI(Peripheral Component Interconnect,外部组件互联标准)总线或PCIE(PCI Express,高速外部组件互联标准)总线相连。系统启动时,主CPU从自身内存中划分出一部分内存作为共享内存,供从CPU使用,并且主CPU还需要为从CPU分配PCI地址.0空间;在从CPU的应用程序和从CPU的内核分别建立关联的SOCKET,从CPU的应用程序所建立的SOCKET监听所述从CPU的内核的请求。
[0067] 步骤102:从CPU接收到主CPU触发的中断信号后,从CPU的内核从共享内存空间中获取该数据。
[0068] 从CPU可以通过映射主CPU的共享内存到自身的地址空间中,实现对该共享内存的访问,获得主CPU的共享内存中的数据。
[0069] 步骤103:从CPU的内核通过预先建立的套接字SOCKET将数据传输到从CPU的应用程序,结束当前流程。
[0070] 具体的,从CPU的内核将数据封装成网络数据包,从CPU的内核所建立的SOCKET通过单播方式将网络数据包发送到从CPU的应用程序所建立的SOCKET上。
[0071] 参见图2,为本申请实施例中主CPU与从CPU之间的通信架构示意图,图2中示出了一个主CPU和一个从CPU,主CPU和从CPU之间通过PCI或PCIE总线连接。无论主CPU或从CPU,其中都包含应用程序、内核驱动和用于通信的硬件设备,本申请实施例在每个CPU的应用程序和内核驱动上建立SOCKET,用于统一二者之间的数据传输和命令传输接口。在建立应用程序的SOCKET时,应用程序中开启一个线程,该线程打开一个SOCKET,而与该SOCKET通讯的对象就是同一操作系统的内核,在该内核里面开发一个驱动程序SOCKET,通过该驱动程序SOCKET与应用程序SOCKET进行交互,驱动程序SOCKET在收到应用程序SOCKET发过来的信息后,把该消息转化为PCI封包,发送到PCI/PCIE总线上。
[0072] 本申请实施例中,主CPU和从CPU之间通信时,包括两种通信模式:
[0073] 一、命令主动发起模式:
[0074] 命令主动发起方可以是主CPU,也可以是从CPU,命令主动发起方在进入系统调用后,可以进入睡眠状态,直到命令接收方返回命令执行结果和状态,或者命令发送超时时从睡眠状态唤醒。例如,主CPU有命令要发送给从CPU,则命令首先是由主CPU发起的,那么主CPU就称为命令主动发起方,此时主CPU驱动内核程序实现供应用程序调用的接口,由内核从应用程序中获取数据;主CPU的当前进程进入睡眠状态的目的是避免主CPU忙等从CPU的回复,使得主CPU可以在该时间内执行其他进程任务,当从CPU返回命令执行结果和状态后,主CPU唤醒进入睡眠状态的进程任务,使其可以继续执行。
[0075] 二、命令被动接收模式:
[0076] 命令被动接收方在其操作系统内核接收到PCI中断后,把通过PCI传输的数据转成NETLINK(Linux操作系统下的一种通讯工作机制)的数据传到应用程序SOCKET,应用程序执行完操作后,再通过NETLINK把数据返回内核驱动程序SOCKET,由内核硬件将数据通过PCI总线返回命令主动发起方。
[0077] 参见图3A,为本申请多CPU间的通信方法的第二实施例流程图,该实施例详细示出了本申请多CPU间通信的过程:
[0078] 步骤301:主CPU内预先设置共享内存空间。
[0079] 通信系统初始化时,由HOST CPU为所有SLAVE CPU分配PCI空间地址,并且HOST CPU从自身内存中划分出一部分内存作为PCI的共享内存,根据系统中SLAVE CPU的数量在PCI共享内存中设置相应的PCI共享缓冲的数据格式,一个PCI共享缓冲的数据格式如图3B所示,其中status表示数据内容,init_params表示数据参数,host_to_dmsoc_cmd用于HOST CPU向SLAVE CPU发送命令,dmsoc_to_host_cmd用于SLAVE CPU向HOST CPU发送命令。基于上述PCI共享缓冲的数据格式可以实现HOST CPU与SLAVE CPU之间的通信。host_to_dmsoc_cmd和dmsoc_to_host_cmd的结构一致,如图3C所示,其中的字段解释如下:
[0080] Cmd_len表示命令长度;
[0081] Cmd_magic表示命令幻数,用于防止其它随机数据混入,判断数据是否是有效的命令;
[0082] Cmd_index:命令序列号,用于指示命令的类型;
[0083] Interrupt_ack:中断响应,用于当收到中断命令后,给中断源反馈一个回应;
[0084] Cmd_return_status:命令返回状态,用于表示命令执行是否成功;
[0085] Reserved:保留位;
[0086] Pad填充至128KB:用于存放命令实际的数据,如果命令长度不到128KB,则补满至128KB。
[0087] 同时,HOST CPU还需要配置SLAVE CPU的PCI基地址寄存器(base address register),用于确定SLAVE CPU在PCI空间中的地址,当SLAVE CPU访问HOST CPU的PCI共享内存时,可以通过映射PCI内存到自己的地址空间内实现。
[0088] 例如,系统中有一个HOST CPU,两个SLAVE CPU,假设HOST CPU的内存是512MB,两个SLAVE CPU的内存分别是128MB,则在系统启动时,HOST CPU在512MB中先划分出一段内存作为PCI/PCIE总线共享的内存,以便每个SLAVE CPU可以访问该共享内存。HOST CPU可以通过设置HOST CPU的PCI/PCIE窗口的映射寄存器(不同的CPU有不同的名称)来把这段共享内存映射到PCI/PCIE总线上,HOST CPU同时把每个SLAVE CPU的PCI BAR(Base Address Register,基本地址寄存器)设置好,这样SLAVE CPU就存在于PCI空间上(PCI空间地址与所占长度由BAR中的值决定),通过上述初始化,HOST CPU可以访问SLAVE CPU的内存;SLAVE CPU通过设置SLAVE CPU的PCI映射寄存器到要访问的地址上来实现对HOST CPU的共享内存的访问。由此,HOST CPU和SLAVE CPU可以互相访问内存,其中只把HOST CPU上划分出来的内存作为PCI共享内存。
[0089] 步骤302:从CPU启动时在从CPU的应用程序和从CPU的内核分别建立关联的SOCKET。
[0090] SLAVE CPU在系统启动的时候应用程序会先建立一个SOCKET,这个SOCKET不同于一般的网络SOCKET,其不是通过IP地址绑定的SOCKET,而是与线程号绑定的SOCKET,不同的线程具有不同的线程号,由此SOCKET确定将数据发往哪个线程;应用程序的SOCKET在建立的时候,运行于SLAVE CPU上的内核(通常为linux内核)驱动也会建立一个SOCKET,与应用程序的SOCKET保持关联。上述应用程序的SOCKET和内核驱动的SOCKET可以双向通讯。
[0091] 步骤303:从CPU的应用程序所建立的SOCKET监听从CPU的内核的请求。
[0092] 步骤304:主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间。
[0093] HOST CPU上的应用程序通过初始化一段内存数据,然后调用通过驱动程序实现的系统接口,该接口的功能是把应用程序的数据拷贝到内核,内核再把该数据传输到HOST CPU向SLAVE CPU开放的PCI共享内存里。
[0094] 步骤305:主CPU向从CPU发送中断信号后将当前进程设置为睡眠状态。
[0095] HOST CPU的内核将数据拷贝到PCI共享内存后,就触发SLAVE CPU的PCI中断,由于HOST CPU要求SLAVE CPU执行的命令需要相应的执行时间的,因此HOST CPU可以把当前进程设置成睡眠状态,从而避免HOST CPU的忙等待。
[0096] 步骤306:从CPU接收到主CPU触发的中断信号后,从CPU的内核从共享内存空间中获取数据。
[0097] SLAVE CPU在收到HOST CPU发出的PCI中断后,SLAVE CPU的内核运行已经注册的中断例程,把数据从HOST CPU的PCI共享内存中拷贝到自己的内存中。
[0098] 步骤307:从CPU的内核将数据封装成网络数据包。
[0099] 步骤308:从CPU的内核所建立的SOCKET通过单播方式将网络数据包发送到从CPU的应用程序所建立的SOCKET上。
[0100] SLAVE CPU的内核驱动把内存中的数据封装成网络数据包,该网络数据包通过NETLINK单播的方式,从内核驱动SOCKET发送到应用程序监听的SOCKET上。
[0101] 步骤309:从CPU的应用程序分析接收到的网络数据包,获得命令码。
[0102] 步骤310:从CPU的应用程序根据命令码执行相应的操作。
[0103] 应用程序监听的SOCKET收到内核驱动请求后,分析网络数据包的包头,从中获取命令的长度以及命令码等信息,然后根据命令码执行相应的操作。
[0104] 步骤311:将执行的结果数据通过从CPU的应用程序所建立的SOCKET返回从CPU的内核。
[0105] 步骤312:从CPU的内核将结果数据传输到主CPU内预先设置的共享内存空间。
[0106] SLAVE CPU的应用程序通过sendmsg的系统调用把执行的结果数据包发送到内核,内核驱动中有相应的针对sendmsg的处理函数,处理函数把应用程序发送的结果数据包接收下来,拷贝到HOST CPU的PCI共享内存上,并向HOST CPU发送PCI中断信号。
[0107] 步骤313:主CPU接收到从CPU触发的中断信号后,主CPU将进程从睡眠状态唤醒。
[0108] HOST CPU在收到PCI中断后,会在中断例程中检查执行状态,并把相应的处于睡眠状态的进程唤醒。
[0109] 步骤314:主CPU的内核从共享内存空间中获取结果数据,结束当前流程。
[0110] 需要说明的是,上述描述了主CPU和从CPU之间的通信,当从CPU之间需要通信时,均通过主CPU进行转发。通信过程中所发的数据包的数据中有一个字段是Target id(目标标识),指代的是目标CPU。假定HOST CPU的id是0xffffffff,若干SLAVE CPU的id是从0-80进行排序,如果id为7的SLAVE CPU要把数据包发到id为0x3的SLAVE CPU,则id为7的SLAVE CPU先把数据包发送到HOST CPU上,如果数据包中的Target id不是HOST CPU的id“0xffffffff”,而是SLAVE CPU的id“0x3”,则HOST CPU确认该数据包需要转发,则按照id“0x3”将数据包转发到对应的SLAVE CPU上,这个转发过程与前述HOST CPU与SLAVE CPU之间的通信过程是一样;相应的,id为7的SLAVE CPU收到HOST CPU转发的数据包后,执行相应的操作,然后把结果状态和数据返回给HOST CPU,HOST CPU再把该数据转发到id为“0x3”的SLAVE CPU上,由此实现两个SLAVE CPU之间的通信。
[0111] 与本申请多CPU间的通信方法的实施例相对应,本申请还提供了多CPU间的通信系统和CPU的实施例。
[0112] 参见图4,为本申请多CPU间的通信系统的实施例框图:
[0113] 该系统包括:至少一个主CPU410和若干从CPU420,主CPU410通过总线与若干从CPU420相连,为了示例方便,图4中仅示出了一个主CPU410和两个从CPU420。
[0114] 其中,所述主CPU410,用于通过主CPU410的内核将主CPU410的应用程序发送的数据传输到主CPU410内预先设置的共享内存空间;
[0115] 所述从CPU420,用于接收到主CPU410触发的中断信号后,通过从CPU420的内核从所述共享内存空间中获取所述数据,以及所述从CPU420的内核通过预先建立的套接字SOCKET将所述数据传输到所述从CPU420的应用程序。
[0116] 进一步,所述从CPU420还用于,启动时在所述从CPU420的应用程序和从CPU420的内核分别建立关联的SOCKET,所述从CPU420的应用程序所建立的SOCKET监听所述从CPU420的内核的请求。
[0117] 进一步,所述从CPU420还用于,通过从CPU420的应用程序分析所述数据获得命令码,根据所述命令码执行相应的操作,并将所述执行的结果数据通过所述从CPU420的应用程序所建立的SOCKET返回所述从CPU420的内核。
[0118] 进一步,所述从CPU420还用于,通过所述从CPU420的内核将所述结果数据传输到所述主CPU410内预先设置的共享内存空间;所述主CPU410,还用于接收到从CPU420触发的中断信号后,主CPU410的内核从所述共享内存空间中获取所述结果数据。
[0119] 参见图5,为本申请CPU的第一实施例框图,该CPU作为从CPU应用于包含若干CPU的系统中,该从CPU通过总线与主CPU连接:
[0120] 该CPU包括:接收单元510、内核单元520和应用程序单元530。
[0121] 接收单元510,用于接收到主CPU触发的中断信号,所述中断信号为所述主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间后所发送的中断信号;
[0122] 内核单元520,用于从所述共享内存空间中获取所述数据,并通过预先建立的套接字SOCKET将所述数据传输到所述应用程序单元530。
[0123] 参见图6A,为本申请CPU的第二实施例框图,该CPU作为从CPU应用于包含若干CPU的系统中,该从CPU通过总线与主CPU连接:
[0124] 该CPU包括:建立单元610、接收单元620、内核单元630和应用程序单元640。
[0125] 其中,建立单元610,用于所述从CPU启动时,在所述应用程序单元640和内核单元630分别建立关联的SOCKET;
[0126] 应用程序单元640,用于通过所建立的SOCKET监听所述内核单元630的请求;
[0127] 接收单元620,用于接收主CPU触发的中断信号,所述中断信号为所述主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间后所发送的中断信号;
[0128] 内核单元630,用于从所述共享内存空间中获取所述数据,并通过预先建立的套接字SOCKET将所述数据传输到所述应用程序单元640。
[0129] 应用程序单元640,还用于将对所述数据进行处理后的结果数据通过应用程序单元640所建立的SOCKET返回内核单元630;
[0130] 内核单元630,还用于将所述结果数据传输到所述主CPU内预先设置的共享内存空间。
[0131] 参见图6B,为图6A所示CPU中的内核单元630的实施例结构图:
[0132] 该内核单元630包括:
[0133] 数据包封装子单元631,用于将所述数据封装成网络数据包;
[0134] 数据包传输子单元632,用于通过所述内核单元所建立的SOCKET以单播方式将所述网络数据包发送到所述应用程序单元建立的SOCKET上。
[0135] 参见图6C,为图6A所示CPU中的应用程序单元640的实施例结构图:
[0136] 该应用程序单元640包括:
[0137] 数据分析子单元641,用于分析所述数据获得命令码;
[0138] 操作执行子单元642,用于根据所述命令码执行相应的操作;
[0139] 结果返回子单元643,用于将所述执行的结果数据通过所述应用程序单元所建立的SOCKET返回所述内核单元。
[0140] 通过以上的实施方式的描述可知,本申请实施例中多CPU中的主CPU通过总线连接若干从CPU,主CPU的内核将主CPU的应用程序发送的数据传输到主CPU内预先设置的共享内存空间,从CPU接收到主CPU触发的中断信号后,从CPU的内核从共享内存空间中获取数据,从CPU的内核通过预先建立的套接字SOCKET将数据传输到从CPU的应用程序。本申请实施例中的多个CPU之间的应用程序通信时,通过在CPU的内核与应用程序之间设置SOCKET,将在传输不同命令时所需要设置的不同接口统一为SOCKET接口,降低了CPU内部接口设置的复杂性,提升了CPU间应用程序通信的性能。
[0141] 通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
[0142] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0143] 本申请可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、置顶盒、可编程的消费电子设备、网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
[0144] 本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0145] 虽然通过实施例描绘了本申请,本领域普通技术人员知道,本申请有许多变形和变化而不脱离本申请的精神,希望所附的权利要求包括这些变形和变化而不脱离本申请的精神。