(57)【特許請求の範囲】
【請求項１】
各々キャッシュを備える複数のプロセッサコアから成るマルチコアプロセッサと、
前記キャッシュを利用したアクセスが可能かつ前記キャッシュを利用しないアクセスが不可能に構成された第１メモリ領域を有し、前記複数のプロセッサコアに共有され、前記マルチコアプロセッサとバスを介して接続された共有メモリと、
を備え、
前記マルチコアプロセッサは、
前記第１メモリ領域のうちの自マルチコアプロセッサに割り当てられている領域を、プロセッサコアに割り当てられていない第１の状態と、プロセッサコアのうちの１つに割り当てられ、読み出しおよび書き込みが実行される第２の状態と、１つ以上のプロセッサコアに割り当てられ、読み出しおよび書き込みが禁止されている第３の状態と、に分類し、前記第１乃至第３の状態間の遷移を実行する状態管理部と、
前記状態管理部が前記第２の状態から前記第３の状態に遷移させる際、対応するキャッシュをライトバックするキャッシュ／メモリ管理部と、
を備えることを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記共有メモリは、前記キャッシュを利用したアクセスおよび前記キャッシュを利用しないアクセスが可能に構成されている第２メモリ領域をさらに備え、
前記状態管理部は、前記第２メモリ領域のうちの自マルチコアプロセッサに割り当てられている領域を、プロセッサコアに割り当てられていない第５の状態と、プロセッサコアのうちの１つに割り当てられ、前記キャッシュを利用した読み出しおよび書き込みが実行される第６の状態と、１つ以上のプロセッサコアに割り当てられ、前記キャッシュを利用しない読み出しおよび書き込みが実行される第７の状態と、に分類し、前記第５乃至第７の状態間の遷移を実行し、
前記キャッシュ／メモリ管理部は、前記状態管理部が前記第６の状態から前記第７の状態に遷移させる際、対応するキャッシュをライトバックする、
ことを特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記共有メモリは、前記プロセッサコアが前記キャッシュを利用しないアクセスを行うための前記第２メモリ領域のシャドー領域を備え、
前記キャッシュ／メモリ管理部は、前記状態管理部が前記第７の状態に遷移させる際および前記状態管理部が前記第７の状態から別の状態に遷移させる際、前記シャドー領域と前記第２メモリ領域との間のアクセス先アドレスの変換を行う、
ことを特徴とする請求項２に記載のマルチコアプロセッサシステム。
【請求項４】
各々キャッシュを備える複数のプロセッサコアを備え、前記キャッシュを利用したアクセスが可能かつ前記キャッシュを利用しないアクセスが不可能に構成された第１メモリ領域が割り当てられるマルチコアプロセッサであって、
前記第１メモリ領域のうちの自マルチコアプロセッサに割り当てられた領域を、プロセッサコアに割り当てられていない第１の状態と、プロセッサコアのうちの１つに割り当てられ、読み出しおよび書き込みが実行される第２の状態と、１つ以上のプロセッサコアに割り当てられ、読み出しおよび書き込みが禁止されている第３の状態と、に分類し、前記第１乃至第３の状態間の遷移を実行する状態管理部と、
前記状態管理部が前記第２の状態から前記第３の状態に遷移させる際、対応するキャッシュをライトバックするキャッシュ／メモリ管理部と、
を備えることを特徴とするマルチコアプロセッサ。
【請求項５】
前記キャッシュを利用したアクセスおよび前記キャッシュを利用しないアクセスが可能に構成された第２メモリ領域が割り当てられ、
前記状態管理部は、前記第２メモリ領域のうちの自マルチコアプロセッサに割り当てられた領域を、プロセッサコアに割り当てられていない第５の状態と、プロセッサコアのうちの１つに割り当てられ、前記キャッシュを利用した読み出しおよび書き込みが実行される第６の状態と、１つ以上のプロセッサコアに割り当てられ、前記キャッシュを利用しない読み出しおよび書き込みが実行される第７の状態と、に分類し、前記第５乃至第７の状態間の遷移を実行し、
前記キャッシュ／メモリ管理部は、前記状態管理部が前記第６の状態から前記第７の状態に遷移させる際、対応するキャッシュをライトバックする、
ことを特徴とする請求項４に記載のマルチコアプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、マルチコアプロセッサシステムおよびマルチコアプロセッサに関する。
【背景技術】
【０００２】
従来、チップ面積および消費電力の増加を抑制するために、キャッシュの一貫性を維持する機能をハードウェア機構ではなくソフトウェアで実装する技術の開発が求められている。
【先行技術文献】
【非特許文献】
【０００３】
【非特許文献１】坪井芳郎、太田裕、山下高廣著、”東芝の次世代ＳｏＣ「Ｖｅｎｅｚｉａ」ホモジニアス・マルチコアを採用”、日経エレクトロニクス、日経ＢＰ社、２００８年６月３０日、第９８１号、ｐ．１１１、１１３−１１４
【発明の概要】
【発明が解決しようとする課題】
【０００４】
非特許文献１には、メモリアクセスにプロトコルを定義してメモリに状態を与え、状態毎に決められたメモリのアクセスを許可してキャッシュの一貫性を維持する技術が開示されている。この技術は、キャッシュを利用したアクセスおよびキャッシュを利用しないアクセスの両方が可能なメモリ領域を持つシステムに適用される。
【０００５】
本発明は、キャッシュを利用するアクセスのみ許されるメモリ領域にかかるキャッシュの一貫性をソフトウェアで維持するマルチコアプロセッサシステムおよびマルチコアプロセッサを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本願発明の一態様によれば、各々キャッシュを備える複数のプロセッサコアを備えるマルチコアプロセッサと、前記キャッシュを利用したアクセスが可能かつ前記キャッシュを利用しないアクセスが不可能に構成された第１メモリ領域と、を備えている。前記マルチコアプロセッサは、状態管理部と、キャッシュ／メモリ管理部をさらに備えている。前記状態管理部は、前記第１メモリ領域のうちの自マルチコアプロセッサに割り当てられている領域を、プロセッサコアに割り当てられていない第１の状態と、プロセッサコアのうちの１つに割り当てられ、読み出しおよび書き込みが実行される第２の状態と、１つ以上のプロセッサコアに割り当てられ、読み出しおよび書き込みが禁止されている第３の状態と、に分類し、前記夫々の状態間の遷移を実行する。前記キャッシュ／メモリ管理部は、前記状態管理部が前記第２の状態から前記第３の状態に遷移させる際、対応するキャッシュをライトバックする。
【図面の簡単な説明】
【０００７】
【図１】第１の実施の形態のマルチコアプロセッサシステムの構成を示すブロック図
【図２】キャッシュを利用したアクセスおよびキャッシュを利用しないアクセスの両方が可能なメモリの構成例を説明する図
【図３】第１の実施の形態のＭＡＰを説明する図
【図４】第１の実施の形態のマルチコアプロセッサシステムの機能構成を説明する図
【図５】第１の実施の形態のメモリのメモリ構造を説明する図
【図６】メモリアロケート管理情報のデータ構造の一例を説明する図
【図７】ＭＡＰ管理情報のデータ構造の一例を説明する図
【図８】状態遷移の一例を説明するフローチャート
【図９】allocate_private_memoryが呼び出されたときの動作を説明するフローチャート
【図１０】free_private_memoryが呼び出されたときの動作を説明するフローチャート
【図１１】allocate_public_memoryが呼び出されたときの動作を説明するフローチャート
【図１２】free_public_memoryが呼び出されたときの動作を説明するフローチャート
【図１３】open_private_memoryが呼び出されたときの動作を説明するフローチャート
【図１４】close_private_memoryが呼び出されたときの動作を説明するフローチャート
【図１５】open_protected_memoryが呼び出されたときの動作を説明するフローチャート
【図１６】close_protected_memoryが呼び出されたときの動作を説明するフローチャート
【図１７】enter_memory_access_protocolが呼び出されたときの動作を説明するフローチャート
【図１８】leave_memory_access_protocolが呼び出されたときの動作を説明するフローチャート
【図１９】第２の実施の形態のメモリのメモリ構造を説明する図
【図２０】第２の実施の形態のＭＡＰを説明する図
【図２１】allocate_ext_private_memoryが呼び出されたときの動作を説明するフローチャート
【図２２】free_ext_private_memoryが呼び出されたときの動作を説明するフローチャート
【図２３】allocate_ext_public_memoryが呼び出されたときの動作を説明するフローチャート
【図２４】free_ext_public_memoryが呼び出されたときの動作を説明するフローチャート
【図２５】open_ext_private_memoryが呼び出されたときの動作を説明するフローチャート
【図２６】close_ext_private_memoryが呼び出されたときの動作を説明するフローチャート
【図２７】open_ext_protected_memoryが呼び出されたときの動作を説明するフローチャート
【図２８】close_ext_protected_memoryが呼び出されたときの動作を説明するフローチャート
【図２９】enter_ext_memory_access_protocolが呼び出されたときの動作を説明するフローチャート
【図３０】leave_ext_memory_access_protocolが呼び出されたときの動作を説明するフローチャート
【発明を実施するための形態】
【０００８】
以下に添付図面を参照して、本発明の実施の形態にかかるマルチコアプロセッサシステムおよびマルチコアプロセッサを詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
【０００９】
（第１の実施の形態）
図１は、本発明の第１の実施の形態のマルチコアプロセッサシステムの構成を示すブロック図である。
マルチコアプロセッサシステム１は、マルチコアプロセッサ２と、メモリ３とを備えている。マルチコアプロセッサ２およびメモリ３はバスを介して接続されている。なお、夫々の構成要素をバスではなくメッシュなど他のネットワークトポロジーによって夫々接続するように構成してもよい。
【００１０】
マルチコアプロセッサ２は、ユーザタスクを実行するためのコア（プロセッサコア）２１を複数備え、夫々のコア２１は個別にキャッシュ２２を備えている。
【００１１】
メモリ３は、例えばＲＡＭ（Random  Access  Memory）により構成される。メモリ３には、マルチコアプロセッサ２のハードウェア・リソースの管理を行うカーネルプログラム３１がロードされている。また、メモリ３には、マルチコアプロセッサ２がメインメモリとして使用できるカーネル管理領域３２が確保されている。マルチコアプロセッサ２は、カーネルプログラム３１を実行することによって、キャッシュ２２の一貫性を保ちつつカーネル管理領域３２内のメモリ領域を各コア２１に割り当てる。
【００１２】
なお、以降の説明において、マルチコアプロセッサ２が主体となる動作は、マルチコアプロセッサ２（より正確にはコア２１）がカーネルプログラム３１またはユーザタスク（後述のユーザタスク２７）を実行することによって実現される。カーネルプログラム３１に基づく動作を、カーネルプログラム３１を動作の主体として表現する場合がある。また、カーネルプログラム３１をカーネル３１と略して表現することもある。また、ユーザタスクに基づく動作を、ユーザタスクを動作の主体として表現する場合がある。
【００１３】
なお、カーネルプログラム３１のロード元は、プログラムを予め格納したＲＯＭ（Read  Only  Memory）などにより構成される不揮発性メモリ領域や外部記憶装置などであってよい。
【００１４】
図２は、複数コアからキャッシュを利用したアクセスおよびキャッシュを利用しないアクセスの両方が可能なメモリの構成例を説明する図である。例えば、0x00000000〜0xFFFFFFFFまでの４ＧＢのアドレスがマップされたメモリのうち、0x00000000〜0x3FFFFFFFの領域がメインメモリ領域として使用される。各コアは、メインメモリ領域にキャッシュを利用したアクセスを行う場合、メインメモリ領域のアドレスをアクセス先とする。そして、該メインメモリ領域は、0xC0000000〜0xFFFFFFFFのシャドー領域にミラーされている。一方、各コアは、メインメモリ領域にキャッシュを利用しないアクセスを行う場合、シャドー領域のアドレスにアクセスする。このようなメモリを備えるシステムにおいては、非特許文献１に開示されるように、コア間で共有するデータはキャッシュを利用せずに物理メモリに直接アクセスし、各コアが占有するデータはキャッシュを利用してアクセスするといった方法でキャッシュの一貫性が維持される。
【００１５】
図２に示したメモリ構造は、メインメモリとして使用する領域と等しいサイズのシャドー領域を必要とするため、アドレス空間の圧迫を招いてしまう。また、キャッシュを利用しない物理メモリへのアクセスを実行するハードウェアを実装する必要があるため、チップの開発コストが増加してしまう。そこで、第１の実施の形態では、シャドー領域を持たないメモリ、すなわち、キャッシュを利用したアクセスのみ許可されるメモリについて、キャッシュの一貫性を維持できるように、次に説明するメモリアクセスプロトコル（Memory  Access  Protocol；ＭＡＰ）を定義する。図３は、第１の実施の形態のＭＡＰを説明する図である。
【００１６】
図３に示すように、メモリ領域に対して次の５つの状態が定義される。
（ａ）UNMANAGED状態
カーネル管理領域３２の領域外となっている状態をUNMANAGED状態と定義する。カーネル３１はこの状態のメモリ領域におけるキャッシュの一貫性を管理しない。
（ｂ）INVALID状態（第１の状態）
カーネル３１によるユーザタスク（ユーザタスクを実行しているコア２１）への割り当てがなされておらず、これから割り当てることが可能な状態をINVALID状態と定義する。具体的には、メモリ割り当て前およびメモリ解放後の状態がこの状態に属する。どのユーザタスクからの書き込み／読み出しアクセスも許可されない。
（ｃ）PRIVATE状態（第２の状態）
キャッシュ２２を利用した読み出し／書き込みアクセスが実行される状態をPRIVATE状態と定義する。この状態に遷移させた１つのユーザタスクのみが読み出し／書き込みアクセスできる。
（ｄ）PUBLIC状態（第３の状態）
全てのユーザタスクで共有化された状態であるが、どのユーザタスクからの読み出し／書き込みアクセスも許可されない状態をPUBLIC状態と定義する。ユーザタスクは、データを別のユーザタスクに送信する場合、該データ（が格納されているメモリ領域）をこの状態に遷移させ、受信側のユーザタスクは、この状態におかれたデータをPRIVATE状態か次に説明するPROTECTED状態に遷移させて読み出す。
（ｅ）PROTECTED状態（第４の状態）
読み出しアクセスのみキャッシュ２２を利用したアクセスが可能な状態をPROTECTED状態と定義する。この状態の領域には書き込みアクセスは一切出来ない。この状態に遷移させた１つ以上のユーザタスクのみがキャッシュ２２を利用した読み出しアクセスを実行できる。
【００１７】
ここで、カーネル管理領域３２が含むメモリ領域は、INVALID状態、PRIVATE状態、PUBLIC状態およびPROTECTED状態のうちの何れか１つの状態となっている。そして、INVALID状態とPUBLIC状態との間およびINVALID状態とPRIVATE状態との間は遷移可能となっている。PUBLIC状態は、INVALID状態のほかに、PRIVATE状態との間およびPROTECTED状態との間で遷移が可能となっている。カーネル管理領域３２内では、INVALID状態、PRIVATE状態、PUBLIC状態およびPROTECTED状態の各状態の定義に基づくメモリアクセスおよび状態遷移の関係が守られることにより、キャッシュの一貫性が保たれる。
【００１８】
なお、キャッシュの一貫性を維持するための構成として、UNMANAGED状態およびPROTECTED状態は必須の構成要素ではない。しかしながら、PROTECTED状態を設けることによって、複数コア２１からの同時読み出しが可能となる。また、カーネル３１の管理外の領域をUNMANAGED状態とし、UNMANAGED状態とINVALID状態との間を遷移可能とすることによって、マルチコアプロセッサシステム１は、カーネル３１の管理下に置かれるカーネル管理領域３２のサイズを動的に変化させることができるようになっている。
【００１９】
図４は、本発明の第１の実施の形態のマルチコアプロセッサシステム１の機能構成を説明する図である。図示するように、マルチコアプロセッサ２は、カーネルプログラム３１を実行することにより、状態遷移関数２３と、メモリアロケート管理部２４と、ＭＡＰ管理部２５と、キャッシュ／メモリ管理部２６と、を生成する。また、マルチコアプロセッサ２は、ユーザタスク２７を実行する。
【００２０】
状態遷移関数２３は、上述のＭＡＰに定義される各状態間の遷移を行うためのＡＰＩ（Application  Programming  Interface）である。状態遷移関数２３は、次に示す１０個の関数を含む。
【００２１】
（１）allocate_private_memory(size_t  size)
allocate_private_memory関数は、INVALID状態のメモリ領域から引数“size”で指定されるサイズのPRIVATE状態のメモリ領域を確保するための関数である。
（２）free_private_memory(void  *addr,  size_t  size)
free_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPRIVATE状態のメモリ領域をINVALID状態に解放するための関数である。
（３）allocate_public_memory(size_t  size)
allocate_public_memory関数は、INVALID状態のメモリ領域から引数“size”で指定されるサイズのPUBLIC状態のメモリ領域を確保するための関数である。
（４）free_public_memory(void  *addr,  size_t  size)
free_public_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPUBLIC状態のメモリ領域をINVALID状態に解放するための関数である。
（５）open_private_memory(void  *addr,  size_t  size)
open_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPUBLIC状態のメモリ領域をPRIVATE状態に遷移させるための関数である。
（６）close_private_memory(void  *addr,  size_t  size)
close_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPRIVATE状態のメモリ領域をPUBLIC状態に遷移させるための関数である。
（７）open_protected_memory(void  *addr,  size_t  size)
open_protected_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPUBLIC状態のメモリ領域をPROTECTED状態に遷移させるための関数である。
（８）close_protected_memory(void  *addr,  size_t  size)
close_protected_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるPROTECTED状態のメモリ領域をPUBLIC状態に遷移させるための関数である。
（９）enter_memory_access_protocol(void  *addr,  size_t  size)
enter_memory_access_protocol関数は、先頭アドレス“addr”、サイズ“size”で指定されるUNMANAGED状態のメモリ領域をINVALID状態に遷移させるための関数である。
（１０）leave_memory_access_protocol(void  *addr,  size_t  size)
leave_memory_access_protocol関数は、先頭アドレス“addr”、サイズ“size”で指定されるINVALID状態のメモリ領域をUNMANAGED状態に遷移させるための関数である。
【００２２】
なお、第１の実施の形態では、（１）allocate_private_memoryおよび（３）allocate_public_memoryを総称してallocate関数ということがある。また、（２）free_private_memoryおよび（４）free_public_memoryを総称してfree関数ということがある。また、（５）open_private_memory、（７）open_protected_memoryを総称してopen関数ということがある。また、（６）close_private_memory、（８）close_protected_memoryを総称してclose関数ということがある。
【００２３】
allocate関数、free関数、enter関数およびleave関数は、ユーザタスク２７により呼び出され、enter関数（enter_memory_access_protocol）およびleave関数（leave_memory_access_protocol）はカーネル３１自身により呼び出される。
【００２４】
メモリアロケート管理部２４およびＭＡＰ管理部２５は、協働して、カーネル管理領域３２をＭＡＰに定義される各状態に分類し、各状態間の遷移を実行する状態管理部として機能する。
【００２５】
メモリアロケート管理部２４は、カーネル管理領域３２の増減およびカーネル管理領域３２内のメモリ領域のユーザタスク２７に対する割り当て／解放を管理する。具体的には、メモリアロケート管理部２４は、カーネル管理領域３２内のメモリ領域に対して、ユーザタスク２７に割り当てているか否かを示す２値のisAllocated変数を定義し、カーネル管理領域３２内のメモリ領域のisAllocated変数の状態を示すメモリアロケート管理情報３３を更新管理する。isAllocated変数は、主にカーネル管理領域３２のうちのタスクに割り当てられていない領域を探索する用途で使用される。
【００２６】
図５は、第１の実施の形態のメモリ３のメモリ構造を説明する図である。シャドー領域を持たないメモリ領域（第１メモリ領域）にカーネル管理領域３２が確保されている。カーネル管理領域３２のうち、isAllocatedが“true”であるメモリ領域は既にユーザタスク２７に割り当てられており、PRIVATE状態、PUBLIC状態およびPROTECTED状態のうちの何れか一つの状態が設定される。また、“false”である領域はタスクに割り当てられておらず、INVALID状態が設定される。カーネル管理領域３２以外の領域はカーネル３１の管理下になく、isAllocated変数が定義されていない。なお、ここでは一例として、isAllocated変数は、予め定められた単位サイズ毎に定義されるものとしている。
【００２７】
図６は、メモリアロケート管理情報３３のデータ構造の一例を説明する図である。メモリアロケート管理情報３３における“アドレス”欄が示す先頭アドレスと“サイズ”欄が示す領域のサイズとにより一塊のアドレスが連続したカーネル管理領域３２が規定される。アドレスが連続した個々のカーネル管理領域３２が複数存在する場合は、“アドレス”および“サイズ”が複数セット規定される。“ＩＤ”欄は、複数セット規定されている夫々の連続したカーネル管理領域３２を区別するためのＩＤが記述される。“isAllocated”欄には、連続したカーネル管理領域３２について、単位サイズ毎に定義されているisAllocated変数の値が記述される。ここでは、“ＩＤ０”のカーネル管理領域３２のメモリ領域のisAllocated変数は、先頭から“false”、“true”、“false”・・・となっていることを示している。
【００２８】
メモリアロケート管理部２４は、enter関数が呼び出されると、メモリアロケート管理情報３３に、対応するエントリを追加し、leave関数が呼び出されると、メモリアロケート管理情報３３から対応するエントリを削除する。また、allocate／free関数が呼び出されると、対応するエントリのisAllocated変数の値を操作する。
【００２９】
ＭＡＰ管理部２５は、カーネル管理領域３２内のキャッシュ一貫性を維持するために、メモリ領域のＭＡＰの状態を管理する。具体的には、ＭＡＰ管理部２５は、メモリ領域の状態を、INVALID状態、PUBLIC状態、PRIVATE状態およびPROTECTED状態の４つの状態に分類してＭＡＰ管理情報３４に登録し、allocate／free関数およびopen／close関数の呼び出しに対応してＭＡＰ管理情報３４を更新管理する。
【００３０】
図７は、ＭＡＰ管理情報３４のデータ構造の一例を説明する図である。ＭＡＰ管理情報３４は、ユーザタスク２７のＩＤ（ＴＡＳＫ  ＩＤ）、状態（ＳＴＡＴＥ）、アドレス、サイズからなるエントリをユーザタスク２７毎に登録されたテーブル構造を備えている。
【００３１】
ＭＡＰ管理部２５は、enter関数が呼び出されると、ＭＡＰ管理情報３４に、対応するエントリを追加し、leave関数が呼び出されると、ＭＡＰ管理情報３４から対応するエントリを削除する。
【００３２】
なお、カーネル管理領域３２以外の領域は暗黙のうちにUNMANAGED状態であるとし、メモリアロケート管理情報３３およびＭＡＰ管理情報３４の何れにおいても明示的に管理しないようにしている。
【００３３】
また、メモリアロケート管理情報３３のデータ構造例としてテーブル構造のものを例に挙げて説明したが、メモリアロケート管理情報３３のデータ構造はテーブル構造でなくてもよい。例えば、リスト形式の情報やビットマップ形式の情報であっても構わない。同様に、ＭＡＰ管理情報３４のデータ構造もテーブル構造でなくても構わない。
【００３４】
キャッシュ／メモリ管理部２６は、close_private_memoryが呼び出されたとき、キャッシュ２２内の該当するキャッシュラインの内容を対応するメモリ領域にライトバックする。また、キャッシュ／メモリ管理部２６は、close関数が呼び出されたとき、対応するキャッシュラインを無効化する。
【００３５】
次に、第１の実施の形態のマルチコアプロセッサシステム１の動作を説明する。まず、動作の概要として、状態遷移の一例を説明する。図８は、あるメモリ領域の状態遷移の一例を説明するフローチャートである。
【００３６】
メモリ領域は、カーネル３１に管理されていないUNMANAGED状態となっている（Ｓ１）。すなわち、このメモリ領域はカーネル管理領域３２に含まれていない。次に、カーネル３１の管理下に置かれ、メモリ領域のＭＡＰの状態はINVALID状態に遷移する（Ｓ２）。すなわち、このメモリ領域はカーネル管理領域３２に追加される。次に、ユーザタスク２７がallocate_public_memoryを呼び出すと、ＭＡＰ管理部２５の動作により、このメモリ領域の状態はPUBLIC状態に遷移し、前記関数を呼び出したユーザタスク２７に割り当てられる（Ｓ３）。その後、ユーザタスク２７がopen_private_memoryを呼び出すと、このメモリ領域はPRIVATE状態に遷移し、ユーザタスク２７はこのメモリ領域に対してキャッシュ２２を利用した読み出し／書き込みアクセスを行う（Ｓ４）。この間、他のユーザタスク２７からのアクセスは許可されないため、アクセスは適切に行われる。そして、ユーザタスク２７がclose_private_memoryを呼び出すと、このメモリ領域はPUBLIC状態に戻される（Ｓ５）。この時、キャッシュ／メモリ管理部２６によって、対応するキャッシュラインは適切にメモリ領域に書き戻される。
【００３７】
その後、別のユーザタスク２７がこのメモリ領域を指定してopen_protected_memoryを呼び出すと、ＭＡＰ管理部２５により、このメモリ領域はPROTECTED状態に遷移し、open_protected_memoryを呼び出したユーザタスク２７はこのメモリ領域に対してキャッシュ２２を利用した読み出しアクセスを行う（Ｓ６）。なお、open_protected_memoryの呼び出しは、複数のユーザタスク２７が同時に実行することができる。つまり、PUBLIC状態のメモリ領域は、ＭＡＰ管理情報３４上には１つのユーザタスク２７に割り当てられているものとして登録されるが、実質的に１つ以上のユーザタスク２７に割り当てられていることに等しい。複数のユーザタスク２７から同時に呼び出された場合、当該メモリ領域は、呼び出した複数のユーザタスク２７に割り当てられる。
【００３８】
読み出しアクセスを終了したユーザタスク２７がclose_protected_memoryを呼び出すと、このメモリ領域はPUBLIC状態に戻される（Ｓ７）。最後に、何れかのユーザタスク２７がfree_public_memoryを呼び出すと、このメモリ領域はINVALID状態に遷移する（Ｓ８）。そして、leave_memory_access_protocolを呼び出し、カーネルの管理下から除外されてUNMANAGED状態となり（Ｓ９）、一連の動作が終了となる。
【００３９】
このように、第１の実施の形態によれば、キャッシュ２２を利用するアクセスのみ許可されるメモリ３を用いて、ソフトウェア機構によってキャッシュ２２の一貫性を維持しつつ、複数コア２１間でデータを共有することができる。
【００４０】
次に、状態遷移関数２３が含む１０個の関数が呼び出されたときのマルチコアプロセッサシステム１の動作を個別に説明する。
図９は、allocate_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がallocate_private_memoryを呼び出すと、メモリアロケート管理部２４は、isAllocated変数が“false”となっているメモリ領域（すなわちINVALID状態のメモリ領域）のうちから引数“size”で指定されたサイズの連続したメモリ領域を“true”とし、ユーザタスク２７に割り当てる（Ｓ１１）。連続したINVALID状態の領域がなかったなどにより、指定されたサイズのメモリ領域の割り当てが正常に行われなかった場合（Ｓ１２、Ｎｏ）、メモリアロケート管理部２４は、NULLを返し（Ｓ１３）、動作が終了となる。
【００４１】
指定されたサイズのメモリ領域の割り当てが正常に行われた場合（Ｓ１２、Ｙｅｓ）、ＭＡＰ管理部２５は、割り当て先のユーザタスク２７のタスクＩＤと、状態“PRIVATE”と、割り当てられたメモリ領域の先頭アドレスおよびサイズと、からなるエントリをＭＡＰ管理情報３４に登録することによって、割り当てられたメモリ領域をINVALID状態からPRIVATE状態に遷移させる（Ｓ１４）。そして、メモリアロケート管理部２４は、割り当てたメモリ領域の先頭アドレスを返し（Ｓ１５）、動作が終了となる。
【００４２】
図１０は、free_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がfree_private_memoryを呼び出すと、メモリアロケート管理部２４は、引数“addr”が示すアドレスを先頭アドレスとし、引数“size”が示すサイズを備えるメモリ領域のisAllocated変数を“true”から“false”に変更することによって、このメモリ領域を解放する（Ｓ２１）。また、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４から対応するエントリを削除することによって、指定されたメモリ領域をPRIVATE状態からINVALID状態に遷移させ（Ｓ２２）、動作が終了となる。
【００４３】
図１１は、allocate_public_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がallocate_public_memoryを呼び出すと、メモリアロケート管理部２４は、INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を“true”とし、ユーザタスク２７に割り当てる（Ｓ３１）。指定されたサイズのメモリ領域の割り当てが正常に行われなかった場合（Ｓ３２、Ｎｏ）、メモリアロケート管理部２４はNULLを返し（Ｓ３３）、動作が終了となる。
【００４４】
指定されたサイズのメモリ領域の割り当てが正常に行われた場合（Ｓ３２、Ｙｅｓ）、ＭＡＰ管理部２５は、割り当て先のユーザタスク２７のタスクＩＤと、状態“PUBLIC”と、割り当てられたメモリ領域の先頭アドレスおよびサイズと、からなるエントリをＭＡＰ管理情報３４に登録することによって、割り当てられたメモリ領域をINVALID状態からPUBLIC状態に遷移させる（Ｓ３４）。そして、メモリアロケート管理部２４は、割り当てたメモリ領域の先頭アドレスを返し（Ｓ３５）、動作が終了となる。
【００４５】
図１２は、free_public_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がfree_public_memoryを呼び出すと、メモリアロケート管理部２４は、引数“addr”と引数“size”とで指定されるメモリ領域のisAllocated変数を“true”から“false”に変更することによって、この指定されたメモリ領域を解放する（Ｓ４１）。また、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４から対応するエントリを削除することによって、指定されたメモリ領域をPUBLIC状態からINVALID状態に遷移させ（Ｓ４２）、動作が終了となる。
【００４６】
図１３は、open_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がopen_private_memoryを呼び出すと、ＭＡＰ管理部２５は、引数“addr”と引数“size”とにより指定されるＭＡＰ管理情報３４に登録されているメモリ領域の状態をPUBLIC状態からPRIVATE状態に変更する（Ｓ５１）。そして、ＭＡＰ管理部２５は、状態を変更したメモリ領域の先頭アドレスを返し（Ｓ５２）、動作が終了となる。
【００４７】
図１４は、close_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がclose_private_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”と引数“size”とで指定されたメモリ領域が乗っているキャッシュラインを無効化するとともに、ライトバックを行う（Ｓ６１）。そして、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４に登録されている当該メモリ領域の状態をPRIVATE状態からPUBLIC状態に変更する（Ｓ６２）。そして、ＭＡＰ管理部２５は、状態を変更したメモリ領域の先頭アドレスを返し（Ｓ６３）、動作が終了となる。
【００４８】
図１５は、open_protected_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がopen_protected_memoryを呼び出すと、ＭＡＰ管理部２５は、引数“addr”と引数“size”とにより指定されるＭＡＰ管理情報３４に登録されているメモリ領域の状態をPUBLIC状態からPROTECTED状態に変更する（Ｓ７１）。そして、ＭＡＰ管理部２５は、状態を変更したメモリ領域の先頭アドレスを返し（Ｓ７２）、動作が終了となる。
【００４９】
図１６は、close_protected_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がclose_protected_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”と引数“size”とで指定されたメモリ領域が乗っている全てのコアのキャッシュラインを無効化する（Ｓ８１）。そして、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４に登録されている当該メモリ領域の状態をPROTECTED状態からPUBLIC状態に変更する（Ｓ８２）。そして、ＭＡＰ管理部２５は、状態を変更したメモリ領域の先頭アドレスを返し（Ｓ８３）、動作が終了となる。
【００５０】
図１７は、enter_memory_access_protocolが呼び出されたときの動作を説明するフローチャートである。カーネル３１がenter_memory_access_protocolを実行すると、メモリアロケート管理部２４は、引数“addr”と引数“size”とにより指定されたメモリ領域のエントリを作成してメモリアロケート管理情報３３に登録することによって、当該メモリ領域をUNMANAGED状態からINVALID状態に遷移させ（Ｓ９１）、動作が終了する。
【００５１】
図１８は、leave_memory_access_protocolが呼び出されたときの動作を説明するフローチャートである。カーネル３１がleave_memory_access_protocolを実行すると、メモリアロケート管理部２４は、引数“addr”と引数“size”とにより指定されたメモリ領域のエントリをメモリアロケート管理情報３３から削除することによって、当該メモリ領域をINVALID状態からUNMANAGED状態に遷移させ（Ｓ１０１）、動作が終了する。
【００５２】
なお、カーネル３１は、例えば、INVALID状態のメモリ領域が少なくなってくると、enter_memory_access_protocolを呼び出し、INVALID状態のメモリ領域が過剰となると、leave_memory_access_protocolを呼び出すようにするとよい。また、カーネル３１は、Ｓ１１において指定されたサイズのINVALID状態のメモリ領域を割り当てることができなかったとき（すなわちＳ１２、Ｎｏのとき）、enter_memory_access_protocolを呼び出して同サイズのINVALID状態のメモリ領域を確保するようにしてもよい。
【００５３】
以上述べたように、第１の実施の形態によれば、メモリアロケート管理部２４およびＭＡＰ管理部２５は協働して、カーネル管理領域３２を、コア２１に割り当てられていないINVALID状態（第１の状態）と、コア２１のうちの１つに割り当てられ、キャッシュ２２を利用した読み出しおよび書き込みが実行されるPRIVATE状態（第２の状態）と、１つ以上のプロセッサコアに割り当てられ、読み出しおよび書き込みが禁止されているPUBLIC状態（第３の状態）と、に分類し、各状態間の遷移を実行する。また、キャッシュ／メモリ管理部２６は、ＭＡＰ管理部２５がPRIVATE状態からPUBLIC状態に遷移させる際、対応するキャッシュラインをライトバックするように構成した。よって、キャッシュ２２を利用するアクセスのみ許されるメモリ領域にかかるキャッシュの一貫性をソフトウェアで維持することができる。つまり、シャドー領域を持たないメモリを備えるマルチコアプロセッサシステムであっても、ソフトウェアによってキャッシュの一貫性を維持することができる。なお、PUBLIC状態と、PRIVATE状態またはPROTECTED状態との間の遷移は、どちらか一方が可能であればよい。
【００５４】
また、ＭＡＰ管理部２５は、１つ以上のコア２１に割り当てられ、読み出しアクセスが実行されるPROTECTED状態（第４の状態）とPUBLIC状態との間の遷移を実行するように構成したので、PROTECTED状態に遷移させることによって複数コア２１からの同時読み出しを実行することが可能となる。
【００５５】
また、メモリアロケート管理部２４は、自マルチコアプロセッサ２に割り当てられていないUNMANAGED領域からPUBLIC状態のメモリ領域を確保／解放するように構成したので、カーネル管理領域３２を動的に増減させることができる。
【００５６】
なお、以上の説明においては、マルチコアプロセッサ２がカーネルプログラム３１を実行することにより、状態遷移関数２３と、メモリアロケート管理部２４と、ＭＡＰ管理部２５と、キャッシュ／メモリ管理部２６と、を生成するとして説明したが、これらのうちのいくつかをカーネルプログラム３１以外のプログラムにより実現するようにしてもよい。例えば、状態遷移関数２３とＭＡＰ管理部２５とをミドルウェアによって実現するようにしても構わない。
【００５７】
（第２の実施の形態）
図２に示すメモリを採用した場合、カーネル管理領域として利用できるメモリ領域がシャドー領域を持つメモリ領域内に限定されてしまう。そこで、第２の実施の形態では、シャドー領域を持つメモリ領域（第２メモリ領域）と、シャドー領域を持たないメモリ領域（第１メモリ領域）とにカーネル管理領域を確保することができるようにした。
【００５８】
第２の実施の形態のマルチコアプロセッサシステムの構成は、第１の実施の形態と同様であるが、メモリにロードされるカーネルプログラムが異なる。なお、同等の構成要素については、詳細な説明を省略する。
【００５９】
図１９は、第２の実施の形態のメモリのメモリ構造を説明する図である。第２の実施の形態のメモリは、シャドー領域を持つメモリ領域（第２メモリ領域）と、シャドー領域を持たないメモリ領域（第１メモリ領域）とが確保されており、双方のメモリ領域がカーネル管理領域３２として使用できるように構成されている。第２の実施の形態では、上記のメモリ領域のうちのどちらにカーネル管理領域３２が確保されてもキャッシュ２２の一貫性を維持することができるように、ＭＡＰの構成が工夫されている。
【００６０】
図２０は、第２の実施の形態のＭＡＰを説明する図である。第２の実施の形態のＭＡＰは、シャドー領域を持たないメモリ領域にアクセスするための第１の実施の形態のＭＡＰに、シャドー領域を持つメモリ領域にアクセスするための以下の４つの状態が追加されて構成されている。
（ｆ）EXT_INVALID状態（第５の状態）
カーネル５１によるユーザタスクへの割り当てがなされておらず、これから割り当てることが可能な状態をEXT_INVALID状態と定義する。
（ｇ）EXT_PRIVATE状態（第６の状態）
キャッシュ２２を利用した読み出し／書き込みアクセスが実行される状態をEXT_PRIVATE状態と定義する。この状態に遷移させた１つのユーザタスクのみが読み出し／書き込みアクセスできる。
（ｈ）EXT_PUBLIC状態（第７の状態）
キャッシュを利用しない読み出し／書き込みアクセスが実行される状態をEXT_PUBLIC状態と定義する。ユーザタスクは、この状態に遷移させることによって別のユーザタスクとデータを共有することができる。（ｃ）PUBLIC状態と異なる点は、キャッシュを利用しない読み出し／書き込みアクセスを実行できることである。
（ｉ）EXT_PROTECTED状態
キャッシュ２２を利用した読み出しアクセスが実行される状態をEXT_PROTECTED状態と定義する。この状態の領域には書き込みアクセスは一切できない。この状態に遷移させた１つ以上のユーザタスクのみが、キャッシュ２２を利用した読み出しアクセスを許可される。
【００６１】
第２の実施の形態のマルチコアプロセッサシステムの機能構成は、図４に示した第１の実施形態のマルチプロセッサシステムと同様である。マルチコアプロセッサ２は、カーネルプログラム３１を実行することにより、状態遷移関数２３と、メモリアロケート管理部２４と、ＭＡＰ管理部２５と、キャッシュ／メモリ管理部２６と、を生成する。また、マルチコアプロセッサ２は、ユーザタスク２７を実行する。
【００６２】
状態遷移関数２３は、第１の実施の形態にて説明した関数（１）〜（１０）に加え、以下の１０個の関数を含む。
（１１）allocate_ext_private_memory(size_t  size)
allocate_ext_private_memory関数は、EXT_INVALID状態のメモリ領域から引数“size”で指定されるサイズのEXT_PRIVATE状態のメモリ領域を確保するための関数である。
（１２）free_ext_private_memory(void  *addr,  size_t  size)
free_ext_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PRIVATE状態のメモリ領域をEXT_INVALID状態に解放するための関数である。
（１３）allocate_ext_public_memory(size_t  size)
allocate_ext_public_memory関数は、EXT_INVALID状態のメモリ領域から引数“size”で指定されるサイズのEXT_PUBLIC状態のメモリ領域を確保するための関数である。
（１４）free_ext_public_memory(void  *addr,  size_t  size)
free_ext_public_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PUBLIC状態のメモリ領域をEXT_INVALID状態に解放するための関数である。引数“addr”はシャドー領域内のアドレスで指定される。
（１５）open_ext_private_memory(void  *addr,  size_t  size)
open_ext_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PUBLIC状態のメモリ領域をEXT_PRIVATE状態に遷移させるための関数である。引数“addr”はシャドー領域内のアドレスで指定される。
（１６）close_ext_private_memory(void  *addr,  size_t  size)
close_ext_private_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PRIVATE状態のメモリ領域をEXT_PUBLIC状態に遷移させるための関数である。
（１７）open_ext_protected_memory(void  *addr,  size_t  size)
open_ext_protected_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PUBLIC状態のメモリ領域をEXT_PROTECTED状態に遷移させるための関数である。引数“addr”はシャドー領域内のアドレスで指定される。
（１８）close_ext_protected_memory(void  *addr,  size_t  size)
close_ext_protected_memory関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_PROTECTED状態のメモリ領域をEXT_PUBLIC状態に遷移させるための関数である。
（１９）enter_ext_memory_access_protocol(void  *addr,  size_t  size)
enter_ext_memory_access_protocol関数は、先頭アドレス“addr”、サイズ“size”で指定されるUNMANAGED状態のメモリ領域をEXT_INVALID状態に遷移させるための関数である。
（２０）leave_ext_memory_access_protocol(void  *addr,  size_t  size)
leave_ext_memory_access_protocol関数は、先頭アドレス“addr”、サイズ“size”で指定されるEXT_INVALID状態のメモリ領域をUNMANAGED状態に遷移させるための関数である。
【００６３】
なお、第２の実施の形態では、（１）allocate_private_memory、（３）allocate_public_memory、（１１）allocate_ext_private_memory、（１３）allocate_ext_public_memoryを総称してallocate関数ということがある。また、（２）free_private_memory、（４）free_public_memory、（１２）free_ext_private_memory、（１４）free_ext_public_memoryを総称してfree関数ということがある。また、（５）open_private_memory、（７）open_protected_memory、（１５）open_ext_private_memory、（１７）open_ext_protected_memoryを総称してopen関数ということがある。また、（６）close_private_memory、（８）close_protected_memory、（１６）close_ext_private_memory、（１８）close_ext_protected_memoryを総称してclose関数ということがある。
【００６４】
allocate関数、free関数、enter関数およびleave関数は、ユーザタスク２７により呼び出され、enter関数（enter_memory_access_protocol、enter_ext_memory_access_protocol）およびleave関数（leave_memory_access_protocol、leave_ext_memory_access_protocol）はカーネル５１が自身で呼び出す。
【００６５】
メモリアロケート管理部２４は、第１の実施の形態と同様のデータ構造のメモリアロケート管理情報３３を更新管理する。なお、メモリアロケート管理部２４は、メモリ３のうちのシャドー領域を持つメモリ領域の範囲を認識しており、enter_memory_access_protocolが呼び出されたとき、UNMANAGED状態でかつシャドー領域を持たないメモリ領域をINVALID状態に遷移させる。一方、enter_ext_memory_access_protocolが呼び出されたとき、UNMANAGED状態でかつシャドー領域を持つメモリ領域をEXT_INVALID状態に遷移させる。
【００６６】
ＭＡＰ管理部２５は、図２０に示したＭＡＰに基づいてカーネル管理領域３２内のメモリ領域の状態を管理する。具体的には、ＭＡＰ管理部２５は、ユーザタスク２７に割り当てられたメモリ領域、すなわちisAllocated変数が“true”となっている領域毎に、メモリ領域の状態を、PUBLIC状態、PRIVATE状態、PROTECTED状態、EXT_PUBLIC状態、EXT_PRIVATE状態およびEXT_PROTECTED状態の６つの状態に分類してＭＡＰ管理情報３４に登録する。また、allocate／free関数およびopen／close関数の呼び出しに対応してＭＡＰ管理情報３４を更新管理する。ＭＡＰ管理情報３４のデータ構造は図７に示したＭＡＰ管理情報３４のデータ構造と同じである。
【００６７】
なお、メモリアロケート管理情報３３およびＭＡＰ管理情報３４の何れにおいてもINVALID状態とEXT_INVALID状態とを区別して管理していないが、これらの二つの状態を何れか一方の情報によって区別して管理するようにしてもよい。例えば、メモリアロケート管理情報３３の各エントリにシャドー領域の有無を示す情報ビットを備えさせ、isAllocated変数が“false”となっているメモリ領域がEXT_INVALID状態であるかINVALID状態であるかを識別できるようにしてもよい。また、ＭＡＰ管理情報３４においてINVALID状態またはEXT_INVALID状態となっているメモリ領域を管理するようにしてもよい。
【００６８】
キャッシュ／メモリ管理部２６は、close_private_memory、close_ext_private_memoryが呼び出されたとき、キャッシュ２２内の該当するキャッシュラインの内容を対応するメモリ領域にライトバックする。また、キャッシュ／メモリ管理部２６は、close関数が呼び出されたとき、対応するキャッシュラインを無効化する。
【００６９】
さらに、キャッシュ／メモリ管理部２６は、allocate_public_memory、close_private_memory、close_protected_memoryが呼び出されたとき、引数“addr”で指定されるメモリ領域の（先頭）アドレスを対応するシャドー領域のアドレスに変換する。また、キャッシュ／メモリ管理部２６は、free_public_memory、open_private_memory、open_protected_memory、が呼び出されたとき、引数“addr”で指定されるシャドー領域のアドレスを、対応するメモリ領域のアドレスに変換する。
【００７０】
次に、第２の実施の形態のマルチコアプロセッサシステム１の動作を説明する。図２１は、allocate_ext_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がallocate_ext_private_memoryを呼び出すと、メモリアロケート管理部２４は、isAllocated変数が“false”となっているシャドー領域を持つメモリ領域（すなわちEXT_INVALID状態のメモリ領域）のうちから引数“size”で指定されたサイズの連続したメモリ領域を“true”とし、ユーザタスク２７に割り当てる（Ｓ１１１）。連続したEXT_INVALID状態のメモリ領域がなかったなどにより、指定されたサイズのメモリ領域の割り当てが正常に行われなかった場合（Ｓ１１２、Ｎｏ）、メモリアロケート管理部２４は、NULLを返し（Ｓ１１３）、動作が終了となる。
【００７１】
指定されたサイズのメモリ領域の割り当てが正常に行われた場合（Ｓ１１２、Ｙｅｓ）、ＭＡＰ管理部２５は、割り当て先のユーザタスク２７のタスクＩＤと、状態“EXT_PRIVATE”と、割り当てられたメモリ領域の先頭アドレスおよびサイズと、からなるエントリをＭＡＰ管理情報３４に登録することによって、割り当てられたメモリ領域をEXT_INVALID状態からEXT_PRIVATE状態に遷移させる（Ｓ１１４）。そして、メモリアロケート管理部２４は、割り当てたメモリ領域の先頭アドレスを返し（Ｓ１１５）、動作が終了となる。
【００７２】
図２２は、free_ext_private_memoryが呼び出されたときの動作を説明するフローチャートである。図示するように、ユーザタスク２７がfree_ext_private_memoryを呼び出すと、メモリアロケート管理部２４は、引数“addr”が示すアドレスを先頭アドレスとし、引数“size”が示すサイズを備えるメモリ領域のisAllocated変数を“true”から“false”に変更することによって、このメモリ領域を解放する（Ｓ１２１）。また、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４から対応するエントリを削除することによって、指定されたメモリ領域をEXT_PRIVATE状態からEXT_INVALID状態に遷移させ（Ｓ１２２）、動作が終了となる。
【００７３】
図２３は、allocate_ext_public_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がallocate_ext_public_memoryを呼び出すと、メモリアロケート管理部２４は、EXT_INVALID状態のメモリ領域のうちから引数“size”で指定されたサイズの連続したメモリ領域を“true”とし、ユーザタスク２７に割り当てる（Ｓ１３１）。指定されたサイズのメモリ領域の割り当てが正常に行われなかった場合（Ｓ１３２、Ｎｏ）、メモリアロケート管理部２４は、NULLを返し（Ｓ１３３）、動作が終了となる。指定されたサイズのメモリ領域の割り当てが正常に行われた場合（Ｓ１３２、Ｙｅｓ）、キャッシュ／メモリ管理部２６は、指定されたメモリ領域の先頭アドレスをシャドー領域のアドレスに変換する（Ｓ１３４）。
【００７４】
続いて、ＭＡＰ管理部２５は、割り当て先のユーザタスク２７のタスクＩＤと、状態“EXT_PUBLIC”と、割り当てられたメモリ領域の先頭アドレス（変換前の先頭アドレス）およびサイズと、からなるエントリをＭＡＰ管理情報３４に登録することによって、割り当てられたメモリ領域をEXT_INVALID状態からEXT_PUBLIC状態に遷移させる（Ｓ１３５）。そして、メモリアロケート管理部２４は、割り当てられたメモリ領域の変換後の先頭アドレスを返し（Ｓ１３６）、動作が終了となる。
【００７５】
図２４は、free_ext_public_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がfree_ext_public_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”で指定されるシャドー領域のアドレスを、シャドー領域を持つメモリ領域のアドレスに変換する（Ｓ１４１）。そして、メモリアロケート管理部２４は、変換後のアドレスと引数“size”とで指定されるメモリ領域のisAllocated変数を“true”から“false”に変更することによって、この指定されたメモリ領域を解放する（Ｓ１４２）。また、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４から対応するエントリを削除することによって、指定されたメモリ領域をEXT_PUBLIC状態からEXT_INVALID状態に遷移させ（Ｓ１４３）、動作が終了となる。
【００７６】
図２５は、open_ext_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がopen_ext_private_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”で指定されるシャドー領域のアドレスを、シャドー領域を持つメモリ領域のアドレスに変換する（Ｓ１５１）。そして、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４に登録されている、変換されたアドレスと引数“size”で指定されるメモリ領域の状態をEXT_PUBLIC状態からEXT_PRIVATE状態に変更する（Ｓ１５２）。そして、ＭＡＰ管理部２５は、変換後のメモリ領域の先頭アドレスを返し（Ｓ１５３）、動作が終了となる。
【００７７】
図２６は、close_ext_private_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がclose_ext_private_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”と引数“size”とで指定されたメモリ領域が乗っているキャッシュラインを無効化するとともに、ライトバックを行う（Ｓ１６１）。そして、キャッシュ／メモリ管理部２６は、指定されたメモリ領域のアドレスをシャドー領域のアドレスに変換する（Ｓ１６２）。そして、ＭＡＰ管理部２５は、ＭＡＰ管理情報３４に登録されている当該メモリ領域の状態をEXT_PRIVATE状態からEXT_PUBLIC状態に変更する（Ｓ１６３）。そして、ＭＡＰ管理部２５は、変換後の先頭アドレスを返し（Ｓ１６４）、動作が終了となる。
【００７８】
図２７は、open_ext_protected_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がopen_ext_protected_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”により指定されるシャドー領域のアドレスをシャドー領域を持たないメモリ領域のアドレスに変換する（Ｓ１７１）。そして、ＭＡＰ管理部２５は、変換したアドレスと引数“size”とにより指定されるＭＡＰ管理情報３４に登録されているメモリ領域の状態をEXT_PUBLIC状態からEXT_PROTECTED状態に変更する（Ｓ１７２）。そして、ＭＡＰ管理部２５は、変換後のアドレスを返し（Ｓ１７３）、動作が終了となる。
【００７９】
図２８は、close_ext_protected_memoryが呼び出されたときの動作を説明するフローチャートである。ユーザタスク２７がclose_ext_protected_memoryを呼び出すと、キャッシュ／メモリ管理部２６は、引数“addr”と引数“size”とで指定されたメモリ領域が乗っている全てのコアのキャッシュラインを無効化する（Ｓ１８１）。そして、キャッシュ／メモリ管理部２６は、指定されたメモリ領域のアドレスをシャドー領域のアドレスに変換し（Ｓ１８２）、ＭＡＰ管理情報３４に登録されている当該メモリ領域の状態をEXT_PROTECTED状態からEXT_PUBLIC状態に変更する（Ｓ１８３）。そして、ＭＡＰ管理部２５は、変換後のアドレスを返し（Ｓ１８４）、動作が終了となる。
【００８０】
図２９は、enter_ext_memory_access_protocolが呼び出されたときの動作を説明するフローチャートである。カーネル５１がenter_ext_memory_access_protocolを実行すると、メモリアロケート管理部２４は、引数“addr”と引数“size”とにより指定されたメモリ領域のエントリを作成してメモリアロケート管理情報３３に登録することによって、当該メモリ領域をUNMANAGED状態からEXT_INVALID状態に遷移させ（Ｓ１９１）、動作が終了となる。
【００８１】
図３０は、leave_ext_memory_access_protocolが呼び出されたときの動作を説明するフローチャートである。カーネル３１がleave_ext_memory_access_protocolを実行すると、メモリアロケート管理部２４は、引数“addr”と引数“size”とにより指定されたメモリ領域のエントリをメモリアロケート管理情報３３から削除することによって、当該メモリ領域をEXT_INVALID状態からUNMANAGED状態に遷移させ（Ｓ２０１）、動作が終了となる。
【００８２】
以上述べたように、第２の実施の形態によれば、メモリアロケート管理部２４およびＭＡＰ管理部２５は協働して、シャドー領域を持つメモリ領域に確保されたカーネル管理領域３２を、コア２１に割り当てられていないEXT_INVALID状態（第５の状態）と、コア２１のうちの１つに割り当てられ、キャッシュ２２を利用した読み出しおよび書き込みが実行されるEXT_PRIVATE状態（第６の状態）と、１つ以上のコア２１に割り当てられ、キャッシュ２２を利用しない読み出しおよび書き込みが実行されるEXT_PUBLIC状態（第７の状態）と、に分類し、EXT_INVALID状態、EXT_PRIVATE状態およびEXT_PUBLIC状態の間の遷移を実行し、キャッシュ／メモリ管理部２６は、ＭＡＰ管理部２５がEXT_PRIVATE状態からEXT_PUBLIC状態に遷移させる際、対応するキャッシュラインをライトバックするように構成したので、シャドー領域を持つメモリ領域とシャドー領域を持たないメモリ領域の両方にカーネル管理領域３２を置くことができるので、シャドー領域を持つメモリ領域のみメインメモリとして使用するシステムやシャドー領域を持たないメモリ領域のみメインメモリとして使用するシステムに比べてメインメモリとして使用できるメモリ領域を大きくすることができる。
【００８３】
また、メモリアロケート管理部２４は、自マルチコアプロセッサに割り当てられていないUNMANAGED領域からEXT_INVALID状態のメモリ領域を確保／解放するように構成したので、シャドー領域を持つメモリ領域に確保したカーネル管理領域３２を動的に増減することができるようになる。
【００８４】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明との均等の範囲に含まれる。
【符号の説明】
【００８５】
１  マルチコアプロセッサシステム、２  マルチコアプロセッサ、３  メモリ、２１  コア、２２  キャッシュ、２３  状態遷移関数、２４  メモリアロケート管理部、２５  ＭＡＰ管理部、２６  キャッシュ／メモリ管理部、２７  ユーザタスク、３１  カーネルプログラム、３２  カーネル管理領域、３３  メモリアロケート管理情報、３４  ＭＡＰ管理情報。
【図１】
0005121896.tif 000002
【図２】
0005121896.tif 000003
【図３】
0005121896.tif 000004
【図４】
0005121896.tif 000005
【図５】
0005121896.tif 000006
【図６】
0005121896.tif 000007
【図７】
0005121896.tif 000008
【図８】
0005121896.tif 000009
【図９】
0005121896.tif 000010
【図１０】
0005121896.tif 000011
【図１１】
0005121896.tif 000012
【図１２】
0005121896.tif 000013
【図１３】
0005121896.tif 000014
【図１４】
0005121896.tif 000015
【図１５】
0005121896.tif 000016
【図１６】
0005121896.tif 000017
【図１７】
0005121896.tif 000018
【図１８】
0005121896.tif 000019
【図１９】
0005121896.tif 000020
【図２０】
0005121896.tif 000021
【図２１】
0005121896.tif 000022
【図２２】
0005121896.tif 000023
【図２３】
0005121896.tif 000024
【図２４】
0005121896.tif 000025
【図２５】
0005121896.tif 000026
【図２６】
0005121896.tif 000027
【図２７】
0005121896.tif 000028
【図２８】
0005121896.tif 000029
【図２９】
0005121896.tif 000030
【図３０】
0005121896.tif 000031