具体实施方式
本发明的核心思想是:对于运行在多核处理器上的多个操作系统,指定其中的一个操作系统直接操作共享存储介质,而其它操作系统需要对共享存储介质进行操作时,通过核间通信机制,将操作请求通知指定的操作系统,由该指定的操作系统根据所述操作请求完成对共享存储介质的操作后,通过核间通信机制将操作结果通知给发送操作请求的操作系统。
为使本发明的目的、技术方案及优点更加清楚明白,以下对本发明进行详细说明。
图2是本发明实施例一种实现多操作系统共享存储介质的方法的原理示意图。如图2所示,在一个多核处理器中假设有三个核:核A、核B和核C,三个核上各自运行一个操作系统,分别为:操作系统A、操作系统B和操作系统C。这三个操作系统需要访问共享存储介质S,S可以是Flash、CF卡或硬盘等。
在图2中,为了保证对共享存储介质S访问的互斥性,本发明中只允许操作系统A直接访问共享存储介质S,而操作系统B或C要访问共享存储介质S,需要通过核间通信机制通知操作系统A,由操作系统A完成对共享存储介质的访问,然后再通过核间通信机制通知操作系统B或C。这样,就把对共享存储介质的访问问题转换为核间通信问题。
图2所示的方法可以使得多核处理器上的多操作系统能够共享一个存储介质,且实现起来简单高效。下面以两个操作系统A和B为例来说明访问共享存储介质的交互过程,操作系统A为实际访问共享存储介质的操作系统,其自身访问共享存储介质的操作与单操作系统访问自身的存储介质相同,是现有技术,这里不再详述。以下重点描述操作系统B访问共享存储介质时的过程,而操作系统C访问共享存储介质时的过程与操作系统B相同。
图3是图2中的操作系统B访问共享存储介质S的流程示意图。如图3所示,为了完成访问共享存储介质S操作,操作系统B包含核间数据处理模块B和状态交互模块B;而对于操作系统A而言,因为需要真正访问共享存储介质S,所以需要三个模块:存储介质访问模块、核间数据处理模块A和状态交互模块A。
其中,存储介质访问模块相当于存储介质的驱动程序,进行真正访问存储介质的操作,包括读写数据和获取存储介质信息等。
核间数据处理模块负责处理核间交互的数据,如共享内存的读写、核间消息的处理等。
状态交互模块用于在操作系统启动和关机时向对方通报自己当前的状态,只有操作系统A和B都完成初始化后,操作系统B才能进行访问共享存储介质S的操作。
这里共享内存是指操作系统A和操作系统B都可以访问的内存,在两个操作系统初始化时将物理内存映射到虚拟内存的重叠部分的内存即为共享内存。图4是本发明实施例中操作系统A和操作系统B的共享内存的示意图。共享内存的映射过程是现有技术,这里不再详述。
在本实施例中,在操作系统A和操作系统B的共享内存中存放两部分内容分别为:读写数据队别和共享存储介质信息。
在本实施例中,共享内存中的读数据队列和写数据队列都为头尾相接的环形队列,队列中为已分配好的内存块,一个内存快的大小一般为共享存储介质的一个访问单元的大小,这样可以避免内存分配和释放的开销。为了内存管理的方便,A和B两个操作系统约定,由操作系统B对读数据队列和写数据队列进行管理,将其中的内存块标记为空闲或已用。本实施例中,操作系统A操作共享内存中的读数据队列和写数据队列的条件如表1所示,操作系统B操作共享内存中的读数据队列和写数据队列的条件如表2所示:
|
共享内存读数据队列 |
共享内存写数据队列 |
收到写请求消息前 |
不操作 |
只读 |
收到写请求消息后,发送写应答消息前 |
不操作 |
可读可写 |
发送写应答消息后 |
不操作 |
只读 |
收到读请求消息前 |
只读 |
不操作 |
收到读请求消息后,发送读应答消息前 |
可读可写 |
不操作 |
发送读应答消息后 |
只读 |
不操作 |
表1
|
共享内存数据队列 |
共享内存写数据队列 |
发送写请求消息前 |
不操作 |
可读可写 |
发送写请求消息后,收到写应答消息前 |
不操作 |
只读 |
收到写应答消息后 |
不操作 |
可读可写 |
发送读请求消息前 |
可读可写 |
不操作 |
发送读请求消息后,收到读应答消息前 |
只读 |
不操作 |
收到读应答消息后 |
可读可写 |
不操作 |
表2
在本实施例中,共享存储介质信息由操作系统A在启动初始化时写入共享内存(由存储介质访问模块获取共享存储介质信息,并发送给核间数据处理模块A,再由核间数据处理模块A写入共享内存),用于操作系统B的初始化。共享存储介质信息包括:操作系统B使用的共享存储介质的起始地址,扇区号以及存储空间的大小等信息。
在本实施例中,由于读写都采用请求-应答机制,因此核间消息队列中包括:写请求队列、读请求队列、写应答队列和读应答队列,分别用于存放:写请求核间消息、读请求核间消息、写应答核间消息和读应答核间消息。存放核间消息队列的存储空间由核间通信机制提供,是现有技术,这里不再详述。
共享内存中的读数据队列和写数据队列的处理相当于数据平面的操作,而对核间消息队列的处理相当于控制平面的操作,用于访问共享存储介质时的逻辑控制。
在图3中,操作系统B对共享存储介质S访问可以分为如下几个阶段:操作系统启动时的初始化、共享存储介质的读操作、共享存储介质的写操作和操作系统关机时的处理,以下分别介绍:
一、操作系统启动时的初始化
操作系统A启动时的初始化流程包括:
√将物理的共享内存映射到虚拟内存;
√初始化共享内存中的读数据队列和写数据队列信息;
√清空核间消息队列中的读请求队列和写请求队列;
√初始化存储介质访问模块,以使共享存储介质S真正可以访问;
√将共享存储介质S的信息写入共享内存;
√状态交互模块A向操作系统B发送核间中断,通知操作系统B共享存储介质S已可用。
操作系统B启动时的初始化流程包括:
√将物理的共享内存映射到虚拟内存;
√初始化共享内存中的读数据队列和写数据队列,将读数据队列和写数据队列中的内存块都标记为空闲;
√清空核间消息队列中的读应答队列和写应答队列;
√如果有核间中断,在中断处理函数中将共享存储介质S的可用标志置位,以表示共享存储介质S可用;
√从共享内存中读取共享存储介质S的信息,上报给上层软件。
其中,读数据队列、写数据队列、读请求队列、写请求队列、读应答队列、写应答队列以及操作系统A和操作系统B的共享内存都是预先配置好的,操作系统A和操作系统B不需要同时启动。
二、共享存储介质的读操作
操作系统B对共享存储介质S的读操作在图3中用实线箭头表示,具体为:
步骤①,根据记录的共享内存中的读数据队列的信息,操作系统B的核间数据处理模块B从读数据队列中找到一块当前可用的内存块M,将其标记为已用,然后向操作系统A的核间数据处理模块A发送读请求核间消息;该读请求核间消息中包含:操作系统B所要读取的数据在共享存储介质中的起始地址、所要读取的数据长度和内存块M在共享内存中的读数据队列中的位置;
步骤②,核间数据处理模块A从读请求队列中取出所述读请求核间消息,从该核间消息中解析出操作系统B所要读取的数据在共享存储介质中的起始地址、所要读取的数据长度和内存块M在读数据队列中的位置;
步骤③、④和⑤,核间数据处理模块A调用存储介质访问模块的读函数,将操作系统B要读取的共享存储介质S的内容写入内存块M;
步骤⑥,核间数据处理模块A向核间数据处理模块B发送读应答核间消息,将该读应答核间消息写入读应答队列中,其中,该读应答核间消息中包含内存块M的读数据队列中的位置信息;
步骤⑦,核间数据处理模块B从读应答队列中取出读应答核间消息,解析出内存块M在读数据队列中的位置;
步骤⑧,核间数据处理模块B从共享内存的读数据队列中的内存块M中读出数据,交给操作系统B的上层软件处理,并将内存块M标记为空闲。
三、共享存储介质的写操作
步骤①,操作系统B的核间数据处理模块B从共享内存的写数据队列中找到当前第一块空闲的内存块N,将要写入共享存储介质S的数据写入内存块N,将内存块N标记为已用;
步骤②,核间数据处理模块B向核间数据处理模块A发送写请求核间消息,该写请求核间消息中包含:操作系统B所要写入的数据在共享存储介质S中的起始地址、所要写入的数据的长度和内存块N在共享内存中写数据队列中的位置;
步骤③,核间数据处理模块A从写请求队列中取出所述写请求核间消息,解析出操作系统B所要写入的数据在共享存储介质S中的起始地址、所要写入的数据的长度和内存块N在共享内存中写数据队列中的位置;
步骤④、⑤和⑥,核间数据处理模块A从内存块N中取出所要写入的数据,并调用存储介质访问模块的写函数,将从内存块N中取出的数据写入共享存储介质S中的相应位置;
步骤⑦,核间数据处理模块A向核间数据处理模块B发送写应答核间消息,通知操作系统B写操作已完成;其中,该写应答核间消息中包含内存块N在写数据队列中的位置信息;
步骤⑧,操作系统B的核间数据处理模块B从写应答队列中读出写应答核间消息,根据其中的内存块N在写数据队列中的位置,将内存块N标记为空闲。
三、操作系统关机时的处理
操作系统A关机时的处理流程包括:
√状态交互模块A向操作系统B发送核间中断,通知操作系统B禁止再发读请求核间消息和写请求核间消息;
√核间数据处理模块A将读请求队列和写请求队列中的读写请求核间消息处理完;
√操作系统A关机
操作系统B关机时的处理流程与现有技术相同,无特殊处理。
操作系统的重启可以看作是操作系统关机时的处理加上操作系统启动时的初始化,所以不再赘述
通过上述实施例可以看出,在本发明中,利用多核处理器的核间通信机制,解决了运行于多核处理器上的多操作系统访问共享存储介质的互斥问题;利用多核处理器的共享内存机制,解决了多操作系统访问共享存储介质的效率问题;利用多核处理器的核间中断,解决了操作系统启动和关机时如何通知对方操作系统的问题。
本发明是的上述方案,使得多核多操作系统能够共享使用存储介质,降低了硬件成本;实现本发明的方案只需要修改操作系统的底层驱动即可,不需要修改文件系统等上层软件;采用核间消息和共享内存的机制,使得不需要进行内存搬移,数据处理效率高;操作系统启动和关机时采用核间中断通知对方操作系统,提高了系统可靠性。
图5是本发明实施例一种实现多个操作系统共享存储介质的装置的组成结构框图。多个操作系统运行在多核处理器上,则实现该多个操作系统共享存储介质的装置包括:属于所述多个操作系统中的一个指定的第一操作系统的第一核间数据处理模块和存储介质访问模块,属于所述多个操作系统中的任一第二操作系统的第二核间数据处理模块,其中,
存储介质访问模块,用于根据第一核间数据处理模块的指令对共享存储介质进行操作;
第二核间数据处理模块,用于在所述任一第二操作系统需要对共享存储介质进行操作时,通过核间通信机制,将所述任一第二操作系统的操作请求通知第一核间数据处理模块;
第一核间数据处理模块,用于根据第二核间数据处理模块发送的操作请求指令存储介质访问模块完成对共享存储介质的操作后,通过核间通信机制将操作结果通知第二核间数据处理模块。
在图5中,第二核间数据处理模块,用于在所述任一第二操作系统需要对共享存储介质进行读操作时,在共享内存中的读数据队列中指定一块可用的内存块,并向第一核间数据处理模块发送读请求核间消息;所述共享内存是第一操作系统和所述任一第二操作系统的共享内存;所述读请求核间消息包括:所要读取的数据在共享存储介质中的起始地址、所要读取的数据长度和指定内存块在共享内存中的位置;
第一核间数据处理模块,用于根据所述读请求核间消息,指令存储介质访问模块对共享存储介质进行读访问操作,并将存储介质访问模块读取并返回的数据写入所述指定内存块中,然后向第二核间数据处理模块发送读应答核间消息;所述读应答核间消息中包括所述指定内存块在共享内存中的位置;
第二核间数据处理模块,用于根据所述读应答核间消息,从指定内存块中读取数据,并上交给所述任一第二操作系统的上层软件。
在图5中,第二核间数据处理模块,用于将所述读请求核间消息发送至核间消息队列中的读请求队列中;用于从核间消息队列中的读应答队列中读取所述读应答核间消息;
第一核间数据处理模块,用于从核间消息队列中的读请求队列中读取所述读请求核间消息;用于将所述读应答核间消息发送至核间消息队列中的读应答队列中。
在图5中,第二核间数据处理模块,用于在所述任一第二操作系统启动时的初始化过程中,将所述读数据队列中的内存块都标记为空闲;用于在读数据队列中指定一块可用的内存块时,将该指定内存块标记为已用;用于根据第一核间数据处理模块发送的所述读应答核间消息,从指定内存块中读取数据后,将该指定内存块标记为空闲。
在图5中,第二核间数据处理模块,用于在所述任一第二操作系统需要对共享存储介质进行写操作时,在共享内存中的写数据队列中指定一块可用的内存块,将要写入共享存储介质的数据写入指定内存块,然后向第一核间数据处理模块发送写请求核间消息;所述共享内存是第一操作系统和所述任一第二操作系统的共享内存;所述写请求核间消息包括:所要写入的数据在共享存储介质中的起始地址、所要写入的数据的长度和指定内存块在共享内存中的位置;
第一核间数据处理模块,用于根据第二核间数据处理模块发送的写请求核间消息,从指定内存块中读取数据并发送给存储介质访问模块,指令存储介质访问模块将数据写入共享存储介质中的相应位置,然后向第二核间数据处理模块发送写应答核间消息,以通知第二核间数据处理模块写操作已完成。
在图5中,所述第二核间数据处理模块,用于将所述写请求核间消息发送至核间消息队列中的写请求队列中;用于从核间消息队列中的写应答队列中读取所述写应答核间消息;
所述第一核间数据处理模块,用于从核间消息队列中的写请求队列中读取所述写请求核间消息;用于将所述写应答核间消息发送至核间消息队列中的写应答队列中。
在图5中,所述第二核间数据处理模块,用于在所述任一第二操作系统启动时的初始化过程中,将所述写数据队列中的内存块都标记为空闲;用于在将要写入共享存储介质的数据写入指定内存块时,将该指定内存块标记为已用;用于在接收到第一核间数据处理模块发送的写应答核间消息时,将所述指定内存块标记为空闲。
在图5中,所述第一核间数据处理模块,进一步用于在第一操作系统启动时的初始化过程中,将所述共享存储介质的信息发送到第一操作系统和所述任一第二操作系统的共享内存中;
所述第二核间数据处理模块,进一步用于在所述任一第二操作系统启动时的初始化过程中,从所述共享内存中获取所述共享存储介质的信息。
如图5所示,该装置进一步包括:属于第一操作系统的第一状态交互模块和属于所述任一第二操作系统的第二状态交互模块,其中,
第一状态交互模块,用于在第一操作系统启动时的初始化过程中,向第二状态交互模块发送核间中断,以通知共享存储介质可用;
第二状态交互模块,用于在所述任一第二操作系统启动时的初始化过程中,收到通知共享存储介质可用的核间中断时,将共享存储介质的可用标志置位。
在图5中,第一状态交互模块,用于在第一操作系统关机时,向第二状态交互模块发送核间中断,以禁止发送对共享存储介质的操作请求;
第二状态交互模块,用于在收到禁止发送对共享存储介质的操作请求的核间中断时,向第二核间数据处理模块发送禁止对共享存储介质进行操作的指定。
综上所述,本发明这种多个操作系统中的一个指定的第一操作系统直接操作共享存储介质,多个操作系统中的任一第二操作系统需要对共享存储介质进行操作时,该第二操作系统通过核间通信机制,将操作请求通知第一操作系统,然后由第一操作系统根据所述操作请求完成对共享存储介质的操作后,通过核间通信机制将操作结果通知第二操作系统的技术方案相对于现有的利用NFS实现多操作系统共享存储介质的方案,简单而高效。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。