(57)【要約】【課題】プロセッサにおいて、スタック領域のオーバーフローに伴いスタック領域を拡張する処理にかかる時間の短縮を図る。【解決手段】プロセッサ１は、処理を実行する処理実行部１００と、処理の実行に伴いデータがスタック操作されるスタック領域を複数備えるメモリ２００と、スタック領域におけるスタック操作の開始位置を示す第１のアドレスデータを格納する第１のレジスタ１１０と、複数のスタック領域のうち処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを格納する第２のレジスタ３４０と、スタック操作が行われるスタック領域がオーバーフローすると判定すると、第２のアドレスデータに基づいて生成したアドレスデータを第１のレジスタ１１０に格納する制御部４００とを有する。【選択図】図１
2011039659.tif 000002
【特許請求の範囲】
【請求項１】
処理を実行する処理実行部と、
前記処理の実行に伴いデータがスタック操作されるスタック領域を複数備えるメモリと、
前記スタック領域における前記スタック操作の開始位置を示す第１のアドレスデータを格納する第１のレジスタと、
前記複数のスタック領域のうち前記処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを格納する第２のレジスタと、
前記スタック操作が行われる前記スタック領域がオーバーフローすると判定すると、前記第２のアドレスデータに基づいて生成したアドレスデータを前記第１のレジスタに格納する制御部とを有することを特徴とするプロセッサ。
【請求項２】
前記複数のスタック領域は、第１及び第２のスタック領域を含み、前記データが前記第１のスタック領域から前記第２のスタック領域に渡って連続して積み重ねられている場合に、前記第１のスタック領域の位置を示す第３のアドレスデータを格納する第３のレジスタを有し、
前記制御部は、前記第２のスタック領域がアンダーフローすると判定すると、前記第３のアドレスデータに基づいて生成したアドレスデータを前記第１のレジスタに格納することを特徴とする請求項１に記載のプロセッサ。
【請求項３】
前記第２のアドレスデータを生成して前記第２のレジスタに格納し、前記第３のアドレスデータを生成して前記第３のレジスタに格納するメモリ管理実行部を有することを特徴とする請求項２に記載のプロセッサ。
【請求項４】
前記メモリは、前記複数のスタック領域の使用状態を示す管理テーブルを備え、
前記メモリ管理実行部は、前記管理テーブルに基づいて前記空きスタック領域を探索して前記第２のアドレスデータを生成することを特徴とする請求項３に記載のプロセッサ。
【請求項５】
前記空きスタック領域の探索は、前記スタック操作が行われる前記スタック領域の消費量に応じて開始されることを特徴とする請求項４に記載のプロセッサ。
【請求項６】
処理実行部が処理を実行するに伴いデータがスタック操作されるメモリ内に設けられた複数のスタック領域のうち、前記処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを、メモリ管理実行部が生成して第２のレジスタに格納し、
制御部が、前記スタック操作が行われる前記スタック領域がオーバーフローすると判定すると、前記第２のアドレスデータに基づいて生成したアドレスデータを、前記スタック操作の開始位置を示すアドレスデータを格納する第１のレジスタに格納することを特徴とするプロセッサの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スタック領域を備えるメモリを有するプロセッサ、及び、このプロセッサの制御方法に関する。
【背景技術】
【０００２】
プログラムにより処理実行部が処理を実行するのに伴いデータがスタック操作されるスタック領域を複数備えたメモリを有するプロセッサが従来知られている。スタック領域は、処理の単位である例えばスレッドに対応してそれぞれ設けられている。
【０００３】
スレッドの実行によるスタック領域の消費量が、対応するスタック領域の記憶容量よりも大きくなる場合、スタック領域がオーバーフローしてしまう可能性があった。この場合、このスタック領域に連続して設けられている別のスレッドに割り当てられたスタック領域にデータが積み重ねられてしまう可能性があった。
【０００４】
この対策として、スタック操作が行われるスタック領域がオーバーフローする際に、処理の実行に用いられていない空きスタック領域を用いるようにしてスタック領域を拡張する構成が知られていた。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００３−２７１４４８号公報
【特許文献２】特開平７−７８０９２号公報
【特許文献３】特開２００８−１０２８７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来の構成では、スタック領域を拡張するための処理に時間が掛かってしまう可能性があった。
上記の点を鑑みて、本発明は、スタック領域を拡張するための処理時間を短縮することが可能なプロセッサ及びプロセッサの制御方法を提供することを目的とする。
【課題を解決するための手段】
【０００７】
上記目的を達成するために以下のようなプロセッサが提供される。
このプロセッサは、処理を実行する処理実行部と、前記処理の実行に伴いデータがスタック操作されるスタック領域を複数備えるメモリと、前記スタック領域における前記スタック操作の開始位置を示す第１のアドレスデータを格納する第１のレジスタと、前記複数のスタック領域のうち前記処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを格納する第２のレジスタと、前記スタック操作が行われる前記スタック領域がオーバーフローすると判定すると、前記第２のアドレスデータに基づいて生成したアドレスデータを前記第１のレジスタに格納する制御部とを有する。
【発明の効果】
【０００８】
開示のプロセッサ及びプロセッサの制御方法によれば、スタック領域のオーバーフローに伴うスタック領域を拡張するための処理の時間を短縮することが可能となる。
【図面の簡単な説明】
【０００９】
【図１】一実施形態に係るプロセッサを示す図。
【図２】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図３】一実施形態に係るプロセッサのメモリの記憶領域の一例を示す説明図。
【図４】一実施形態に係るプロセッサのメモリの記憶領域の一例を示す説明図。
【図５】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図６】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図７】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図８】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図９】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図１０】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図１１】一実施形態に係るプロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図。
【図１２】一実施形態に係るプロセッサのスタックポインタ制御部の動作を説明するフローチャート。
【図１３】一実施形態に係るプロセッサのメモリ管理実行部の動作を説明するフローチャート。
【発明を実施するための形態】
【００１０】
プロセッサの一実施形態について説明する。
図１は、一実施形態に係るプロセッサを示す図である。
プロセッサ１は、処理を実行する処理実行部１００と、処理実行部１００に設けられたスタックポインタレジスタ１１０とを有する。さらに、プロセッサ１は、複数のスタック領域を備えたメモリ２００と、メモリ管理部３００と、スタックポインタレジスタ１１０を制御するスタックポインタ制御部４００とを有する。
【００１１】
処理実行部１００とメモリ管理部３００とは、データバス５００を介してメモリ２００と接続されている。
また、データバス５００には周辺モジュール６００が接続されている。
【００１２】
まず、処理実行部１００の詳細を説明する。
処理実行部１００は、プログラムにより、複数の処理、例えばスレッドを実行する。処理実行部１００は、例えば複数のスレッドを並行して実行するマルチスレッドに対応している。
【００１３】
処理実行部１００は、各スレッドの実行に伴い対応するメモリ２００内のスタック領域をそれぞれ利用し、スタック領域にデータを積み重ねたりスタック領域からデータを取り出したりするデータのスタック操作を行う。
【００１４】
ここで、スタック領域にデータを積み重ねることをｐｕｓｈと称し、スタック領域からデータを取り出すことをｐｏｐと称することもある。
スタックポインタレジスタ１１０は、スタック領域におけるスタック操作の開始位置を指すスタックポインタのアドレスデータを格納する。
【００１５】
なお、スタックポインタレジスタ１１０は、例えば３２ビット長である。
例えば、処理実行部１００によるスタック領域へのデータの積み重ねやスタック領域からのデータの取り出しが４番地単位で行われる場合、スタックポインタが指す位置は４番地間隔となる。この場合、スタックポインタレジスタ１１０が例えば３２ビット長であれば、下位２ビットが０に固定される。
【００１６】
さらに、処理実行部１００は、複数の汎用レジスタ１２０と、ステータスレジスタ１３０と、プログラムカウンタレジスタ１４０とを有し、スレッドの実行はこれらのレジスタを用いて行われる。各レジスタは例えば３２ビット長である。
【００１７】
次に、メモリ２００の詳細を説明する。
図２は、プロセッサのメモリの記憶領域の一例と各レジスタの値を示す説明図である。
図２に示すように、メモリ２００は複数のスタック領域２１１、２１２、２１３、２１４を備えている。
【００１８】
各スタック領域２１２、２１４は、処理実行部１００が実行するスレッドに対応してそれぞれ設けられている。
各スレッドの実行に伴い、対応している各スタック領域２１２、２１４においてデータのスタック操作が行われる。
【００１９】
また、スタック領域２１３は、スレッドの実行に用いられていない空きスタック領域である。
さらに、スタック領域２１１には、各スタック領域２１１〜２１４の使用状態を示す管理テーブル２３０が格納されている。
【００２０】
図２では、スレッドＩＤ＝５の実行にスタック領域２１２が用いられ、スレッドＩＤ＝３の実行にスタック領域２１４が用いられている。
各スタック領域２１１〜２１４は、例えば１ページ単位の記憶容量を有する。１ページ分の記憶容量は例えば１０２４バイトである。１番地当たりの記憶容量は例えば１バイトである。
【００２１】
図２では、スタック領域２１１に０ｘ６０００番地〜０ｘ６３ＦＦ番地が割り当てられ、スタック領域２１２に０ｘ５Ｃ００番地〜０ｘ５ＦＦＦ番地が割り当てられている。さらに、スタック領域２１３に０ｘ５８００番地〜０ｘ５ＢＦＦ番地が割り当てられ、スタック領域２１４に０ｘ５４００番地〜０ｘ５７ＦＦ番地が割り当てられている。
【００２２】
データのスタック操作は、スタックポインタＳＰが指す番地を開始位置として行われる。
データがスタック領域２１１〜２１４に積み重ねられる場合、データは番地が小さい方に向けて順番に連続して積み重ねられる。
【００２３】
反対に、データがスタック領域２１１〜２１４から取り出される場合は、データは、積み重ねられる方向とは逆の方向、即ち、番地が大きい方に向けて順番に連続して取り出される。
【００２４】
図２では、スタックポインタＳＰは、例えば０ｘ５ＥＦＣ番地を指している。
この場合、データは０ｘ５ＥＦＣ番地から０ｘ５Ｃ００番地に向けて順番に連続して積み重ねられる。また、データは０ｘ５ＥＦＣ番地から０ｘ５ＦＦＦ番地に向けて順番に連続して取り出される。
【００２５】
データは例えば４番地間隔で順番に積み重ねられる。例えば、１番地当たりの記憶容量が１バイトの場合、データは４バイト単位で積み重ねられる。この場合、データの取り出しも４番地間隔、即ち４バイト単位で行われる。
【００２６】
管理テーブル２３０は、各スタック領域２１１〜２１４の使用状態を示すデータを有している。即ち、管理テーブル２３０は、スタック領域２１１〜２１４がどのスレッドに利用されているか、もしくは、空きスタック領域かどうか等を示すデータを有している。
【００２７】
各スタック領域２１１〜２１４の使用状態は、例えば、１バイトのデータで管理されている。例えば、スタック領域２１１〜２１４が使用されている場合は、対応するスレッドのＩＤ番号に基づいて０ｘ００〜０ｘｆｅというデータで管理され、スタック領域が使用されていない場合は、０ｘｆｆというデータで管理されている。
【００２８】
図２では、管理テーブル２３０は、スタック領域２１１、スタック領域２１２、スタック領域２１３、スタック領域２１４の使用状態を示すデータを有している。
ここで、各スタック領域２１１〜２１４の使用状態は、例えば、番地が大きい方から順番に、０ｘ００、０ｘ０５、０ｘｆｆ、０ｘ０３というデータで管理されている。ここで、０ｘ００は管理テーブル２３０が格納されていることを示す。
【００２９】
次にメモリ管理部３００の詳細を説明する。
図１に示すように、メモリ管理部３００は、メモリ管理実行部３１０と、レジスタＳＰ＿ｈｅａｄ３２０と、レジスタＳＰ＿ｌａｓｔ３３０とを有する。さらに、メモリ管理部３００は、レジスタＳＰ＿ｎｅｘｔ３４０と、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１と、レジスタＳＰ＿ｐｒｅｖ３５０と、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１と、管理テーブルバッファ３６０とを有する。
【００３０】
レジスタＳＰ＿ｈｅａｄ３２０及びレジスタＳＰ＿ｌａｓｔ３３０は、例えば３２ビット長であり、下位１０ビットは０固定とされる。
レジスタＳＰ＿ｈｅａｄ３２０には、管理テーブル２３０が管理しているスタック領域のうち最も番地の大きいスタック領域のアドレスデータが格納される。
【００３１】
レジスタＳＰ＿ｌａｓｔ３３０には、管理テーブル２３０が管理しているスタック領域のうち最も番地の小さいスタック領域のアドレスデータが格納される。
例えば、図２の場合、最も番地が大きいスタック領域は管理テーブル２３０が格納されているスタック領域２１１なので、レジスタＳＰ＿ｈｅａｄ３２０には、例えば、図２のように、０ｘ６０００番地を示すアドレスデータが格納される。
【００３２】
また、図２の場合、最も番地が小さいスタック領域はスレッドＩＤ＝３の実行に用いられるスタック領域２１４なので、レジスタＳＰ＿ｌａｓｔ３３０には、例えば、図２のように、０ｘ５４００番地を示すアドレスデータが格納される。
【００３３】
レジスタＳＰ＿ｎｅｘｔ３４０及びレジスタＳＰ＿ｐｒｅｖ３５０は、例えば３２ビット長であり、下位１０ビットは０固定とされる。
レジスタＳＰ＿ｎｅｘｔ３４０には、スレッドの実行に用いられていない空きスタック領域のアドレスデータが格納される。
【００３４】
図３は、レジスタＳＰ＿ｎｅｘｔの設定例を示す図である。
図３に示す例では、メモリ２００の番地が大きい方から順番に、スタック領域２１１、スタック領域２１２、スタック領域２１３、スタック領域２１４が設けられている。
【００３５】
スタック領域２１２は、スレッドの実行に伴い現在スタック操作が行われているカレントスタック領域である。ここで、スタックポインタＳＰはスタック領域２１２内のある番地を指している。スタック領域２１１及びスタック領域２１３は、別のスレッドの実行に用いられているスタック領域である。スタック領域２１４はスレッドの実行に用いられていない空きスタック領域である。
【００３６】
この場合、レジスタＳＰ＿ｎｅｘｔ３４０には、空きスタック領域であるスタック領域２１４のアドレスデータとして、例えば０ｘ３８００番地を示すアドレスデータが格納される。
【００３７】
一方、レジスタＳＰ＿ｐｒｅｖ３５０には、スレッドの実行に伴いデータがあるスタック領域から他のスタック領域に渡って連続して積み重ねられている場合に、前段のスタック領域のアドレスデータが格納される。
【００３８】
図４は、レジスタＳＰ＿ｐｒｅｖの設定例を示す図である。
図４に示す例では、スタック領域２１４は、スレッドの実行に伴い現在スタック操作が行われているカレントスタック領域であり、スタック領域２１２は、同じスレッドの実行に用いられている前段のスタック領域である。
【００３９】
つまり、あるスレッドの実行に伴いデータがスタック領域２１２から、スタック領域２１３を飛ばして、スタック領域２１４に渡って連続して積み重ねられている。
ここで、スタックポインタＳＰはスタック領域２１４内のある番地を指している。
【００４０】
スタック領域２１１及びスタック領域２１３は、別のスレッドの実行に用いられているスタック領域である。
この場合、前段のスタック領域はスタック領域２１２なので、レジスタＳＰ＿ｐｒｅｖ３５０には、スタック領域２１２のアドレスデータとして、例えば０ｘ４０００番地を示すアドレスデータが格納される。
【００４１】
レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１には、レジスタＳＰ＿ｎｅｘｔ３４０の有効フラグが格納される。レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１には、レジスタＳＰ＿ｎｅｘｔ３４０が有効の場合は例えば１が格納され、無効の場合は例えば０が格納される。
【００４２】
レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１には、レジスタＳＰ＿ｐｒｅｖ３５０の有効フラグが格納される。ＳＰ＿ｐｒｅｖ＿ｖ３５１には、レジスタＳＰ＿ｐｒｅｖ３５０が有効の場合は例えば１が格納され、無効の場合は例えば０が格納される。
【００４３】
図１に示すように、管理テーブルバッファ３６０はデータバス５００を介してメモリ２００に接続されている。
管理テーブルバッファ３６０には、メモリ２００に格納されている管理テーブル２３０がバッファリングされて格納される。
【００４４】
次に、メモリ管理実行部３１０の詳細を説明する。
図１に示すように、メモリ管理実行部３１０は、管理テーブルバッファ３６０を介してメモリ２００に接続されている。
【００４５】
メモリ管理実行部３１０は、処理実行部１００と独立して動作する。
メモリ管理実行部３１０は、メモリ２００にアクセスし、例えば、図２に示したようなスタック領域２１１に格納されている管理テーブル２３０を参照する。また、メモリ管理実行部３１０は、メモリ２００にアクセスし、スタック領域２１１に格納されている管理テーブル２３０の一部もしくは全部を管理テーブルバッファ３６０にバッファリングする。
【００４６】
ここで、メモリ管理実行部３１０は、参照対象のデータが管理テーブルバッファ３６０に格納された管理テーブル２３０にある場合はそれを参照する。また、メモリ管理実行部３１０は、参照対象のデータが管理テーブルバッファにない場合にはメモリ２００にアクセスしてメモリ２００内のスタック領域に格納されている管理テーブル２３０を参照する。
【００４７】
プロセッサ１では、管理テーブルバッファ３６０に管理テーブル２３０をバッファリングしているため、管理テーブル２３０を参照する度にメモリ２００にアクセスする必要が無く、管理テーブル２３０の参照にかかる時間を短縮することが可能となる。
【００４８】
さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｈｅａｄ３２０及びレジスタＳＰ＿ｌａｓｔ３３０に格納されているアドレスデータに基づいて、メモリ２００内の管理テーブル２３０の更新作業を実行する。
【００４９】
また、メモリ管理実行部３１０は、スタックポインタ制御部４００からスタック領域の解放要求があった場合、レジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータが示すスタック領域を解放するべく、メモリ２００内の管理テーブル２３０を更新する。
【００５０】
さらに、メモリ管理実行部３１０は、管理テーブル２３０のデータに基づいて、レジスタＳＰ＿ｈｅａｄ３２０、レジスタＳＰ＿ｌａｓｔ３３０、レジスタＳＰ＿ｎｅｘｔ３４０、レジスタＳＰ＿ｐｒｅｖ３５０に格納すべきアドレスデータを生成する。そして、メモリ管理実行部３１０は、生成したアドレスデータを各レジスタに格納する。
【００５１】
さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１及びレジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグの設定を行う。
また、メモリ管理実行部３１０は、処理実行部１００にアクセスしてスタック領域の消費量を監視している。
【００５２】
さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１及びレジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグを監視している。
メモリ管理実行部３１０は、スレッドの実行に伴いスタック領域の消費量が規定値を超えたと判定し、かつ、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが無効を示す場合、次の処理を実行する。
【００５３】
即ち、メモリ管理実行部３１０は、管理テーブル２３０のデータに基づいて空きスタック領域を探索して空きスタック領域のアドレスデータを生成し、生成したアドレスデータをレジスタＳＰ＿ｎｅｘｔ３４０に格納する。
【００５４】
なお、この処理は、処理実行部１００の処理の実行と並行して行われる。
この時、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグを有効とする。
【００５５】
図５及び図６は、スタック領域の消費量増大時の様子を示す図である。
メモリ２００の記憶領域が図５の場合を例に説明する。
図５に示す例では、スタック領域２１２は、スレッドの実行に伴い現在スタック操作が行われているカレントスタック領域であり、スタック領域２１１及びスタック領域２１３は、別のスレッドの実行に用いられているスタック領域である。スタック領域２１４はスレッドの実行に用いられていない空きスタック領域である。
【００５６】
ここで、スタックポインタＳＰは規定値よりも大きい番地、例えば０ｘ４３ＦＣ番地を指している。即ち、スタック領域２１２の消費量は規定値を超えていない。
また、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグは０であり、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグは０である。
【００５７】
この状態からスタック操作が進みスタック領域２１２の消費量が増大した様子を図６に示す。
スタック操作が進みスタック領域２１２の消費量が規定値を超えた場合、メモリ管理実行部３１０は管理テーブル２３０にアクセスして空きスタック領域を探索する。
【００５８】
ここで、スタックポインタＳＰは、例えば０ｘ４１８０番地を指している。
空きスタック領域はスタック領域２１４なので、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ３４０にスタック領域２１４のアドレスデータとして、例えば０ｘ３８００番地を示すアドレスデータを格納する。
【００５９】
さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に有効を示すフラグとして１を格納する。
さらに、メモリ管理実行部３１０は、スタック領域２１４がスタック領域２１２の拡張スタック領域、即ち、次段のスタック領域とされたことを反映するべく、管理テーブル２３０を更新する。
【００６０】
メモリ管理実行部３１０は、スレッドの実行に伴うスタック領域の消費量が規定値を下回ったと判定し、かつ、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１が無効を示す場合、次の処理を実行する。
【００６１】
即ち、メモリ管理実行部３１０は、管理テーブル２３０のデータに基づいて前段のスタック領域を探索して前段のスタック領域のアドレスデータを生成し、生成したアドレスデータをレジスタＳＰ＿ｐｒｅｖ３５０に格納する。
【００６２】
なお、この処理は、処理実行部１００の処理の実行と並行して行われる。
この時、メモリ管理実行部３１０は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグを有効とする。
【００６３】
図７及び図８は、スタック領域の消費量減少時の様子を示す図である。
図７に示す例では、スタック領域２１４は、スレッドの実行に伴い現在スタック操作が行われているカレントスタック領域であり、スタック領域２１２は、同じスレッドの実行に用いられている前段のスタック領域である。また、スタック領域２１１及びスタック領域２１３は、別のスレッドの実行に用いられているスタック領域である。
【００６４】
ここで、スタックポインタＳＰは規定値よりも小さい番地、例えば０ｘ３８０４番地を指している。即ち、スタック領域２１４の消費量は規定値を下回っていない。
また、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグは０であり、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグは０である。
【００６５】
この状態からスタック操作が進み、スタック領域２１４の消費量が減少した様子を図８に示す。
スタック操作が進み、スタック領域２１４の消費量が規定値を下回った場合、メモリ管理実行部３１０は管理テーブル２３０にアクセスして前段のスタック領域を探索する。
【００６６】
ここで、スタックポインタＳＰは、例えば０ｘ３Ａ２０番地を指している。
前段のスタック領域はスタック領域２１２なので、メモリ管理実行部３１０は、レジスタＳＰ＿ｐｒｅｖ３５０にスタック領域２１２のアドレスデータとして、例えば０ｘ４０００番地を示すアドレスデータを格納する。
【００６７】
さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に有効を示すフラグとして１を格納する。
次に、スタックポインタ制御部４００の詳細を説明する。
【００６８】
スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ３４０及びレジスタＳＰ＿ｐｒｅｖ３５０のアドレスデータに基づいてアドレスデータを生成し、生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００６９】
また、スタックポインタ制御部４００は、スタックポインタレジスタ１１０のアドレスデータに基づいてアドレスデータを生成し、生成したアドレスデータをレジスタＳＰ＿ｎｅｘｔ３４０及びレジスタＳＰ＿ｐｒｅｖ３５０に格納する。
【００７０】
さらに、スタックポインタ制御部４００は、処理実行部１００にアクセスしてスタック操作命令の有無及びスタック領域の消費量を監視する。また、スタックポインタ制御部４００は、処理実行部１００にスタック操作開始命令を行う。
【００７１】
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１及びレジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグを監視している。
スタックポインタ制御部４００は、処理実行部１００からスタック操作命令があると、スタック領域がオーバーフローするかどうか、もしくは、アンダーフローするかどうかを判定する。
【００７２】
スタックポインタ制御部４００は、スタック領域がオーバーフローすると判定し、かつ、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが有効な場合、次の処理を行う。
即ち、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ３４０に格納されたアドレスデータに基づいて空きスタック領域を示すアドレスデータを生成する。さらに、スタックポインタ制御部４００は、生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００７３】
これにより、スタックポインタＳＰは空きスタック領域を指す。
このため、データのスタック操作がスタック領域から空きスタック領域に切り替えられるので、スタック領域がオーバーフローしてしまうことを回避することが可能となる。
【００７４】
つまり、空きスタック領域をスタック領域の拡張領域とすることが可能となる。
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に無効を示すフラグを格納する。
【００７５】
また、スタックポインタ制御部４００は、スタックポインタレジスタ１１０のアドレスデータに基づいて、現在スタック操作が行われているスタック領域を示すアドレスデータを生成し、生成したアドレスデータをレジスタＳＰ＿ｐｒｅｖ３５０に格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に有効を示すフラグを格納する。
【００７６】
ここで、アドレスデータのレジスタＳＰ＿ｐｒｅｖ３５０への格納は、例えば、スタックポインタレジスタ１１０が３２ビット長の場合、スタックポインタレジスタ１１０の上位２２ビットをレジスタＳＰ＿ｐｒｅｖ３５０に上書きすることで行われる。
【００７７】
その後、スタックポインタ制御部４００は処理実行部１００にスタック操作を行うよう命令し、これにより、空きスタック領域のスタックポインタＳＰが指す番地からデータが積み重ねられる。
【００７８】
例えば、図９及び図１０に示す場合を例にして、スタック領域のオーバーフロー時のスタックポインタ制御部４００の動作を説明する。
図９は、図６の状態からスタック操作が進みスタック領域２１２の消費量が増大した状態を示したもので、スタックポインタＳＰは、例えば０ｘ４００４番地を指している。
【００７９】
この状態からスタック操作が行われてスタック領域の例えば０ｘＣ番地分の領域にデータが積み重ねられる場合、０ｘ４０００番地よりも小さい番地までデータが積み重ねられてしまい、スタック領域２１２はオーバーフローしてしまう。
【００８０】
スタックポインタ制御部４００はスタック領域２１２がオーバーフローすると判定すると、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグは１なので、次の処理を行う。
即ち、図１０に示すように、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ３４０に格納されたアドレスデータに基づいて空きスタック領域である次段のスタック領域２１４を示すアドレスデータを生成する。さらに、スタックポインタ制御部４００は生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００８１】
ここでは、スタックポインタ制御部４００は、スタックポインタレジスタ１１０の値から０ｘＣ減じた値に、上位２２ビットをレジスタＳＰ＿ｎｅｘｔ３４０の値で置き換えた値を生成し、スタックポインタレジスタ１１０に格納する。
【００８２】
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に無効を示すフラグとして０を格納する。
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ３５０に現在スタック操作が行われているスタック領域２１２を示すアドレスデータとして０ｘ４０００番地を示すアドレスデータを格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に有効を示すフラグとして１を格納する。
【００８３】
スタックポインタ制御部４００は、あるスレッドに対応するデータがあるスタック領域から他のスタック領域に渡って連続して積み重ねられている場合に、後段のスタック領域がアンダーフローするかどうかを判定する。
【００８４】
スタックポインタ制御部４００は、後段のスタック領域がアンダーフローすると判定すると、次の処理を実行する。
即ち、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが有効な場合、レジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータが示すスタック領域を解放するようメモリ管理実行部３１０に要求する。
【００８５】
次に、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが有効な場合、レジスタＳＰ＿ｐｒｅｖ３５０に格納されたアドレスデータに基づいて前段のスタック領域を示すアドレスデータを生成する。さらに、スタックポインタ制御部４００は、生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００８６】
これにより、スタックポインタＳＰは、前段のスタック領域を指す。
このため、データのスタック操作が後段のスタック領域から前段のスタック領域に切り替えられるので、後段のスタック領域がアンダーフローしてしまうことを回避することが可能となる。
【００８７】
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に無効を示すフラグを格納する。
また、スタックポインタ制御部４００は、スタックポインタレジスタ１１０のアドレスデータに基づいて、現在スタック操作が行われている後段のスタック領域を示すアドレスデータを生成する。さらにスタックポインタ制御部４００は、生成したアドレスデータをレジスタＳＰ＿ｎｅｘｔ３４０に格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に有効を示すフラグを格納する。
【００８８】
ここで、アドレスデータのレジスタＳＰ＿ｎｅｘｔ３４０への格納は、例えば、スタックポインタレジスタ１１０が３２ビット長の場合、スタックポインタレジスタ１１０の上位２２ビットをレジスタＳＰ＿ｎｅｘｔ３４０に上書きすることで行われる。
【００８９】
この後、スタックポインタ制御部４００は処理実行部１００にスタック操作を行うよう命令し、これにより、スタックポインタＳＰが指す前段のスタック領域の番地からデータが取り出される。
【００９０】
例えば、図１０及び図１１に示す場合を例にして、スタック領域のアンダーフロー時のスタックポインタ制御部４００の動作を説明する。
図１０に示す状態からスタック操作が行われ、スタック領域２１４から０ｘ２８番地分のデータを取り出す場合、３ＢＦＦ番地よりも大きい番地までデータが取り出されてしまい、スタック領域２１４はアンダーフローしてしまう。
【００９１】
スタックポインタ制御部４００は、スタック領域２１４がアンダーフローすると判定すると、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグは１なので、次の処理を行う。
即ち、図１１に示すように、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ３５０に格納されたアドレスデータに基づいて前段のスタック領域２１２を示すアドレスデータを生成し、生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００９２】
ここでは、スタックポインタ制御部４００は、スタックポインタレジスタ１１０の値に０ｘ２８加算した値に、上位２２ビットをレジスタＳＰ＿ｐｒｅｖ３５０の値で置き換えた値を生成し、スタックポインタレジスタ１１０に格納する。
【００９３】
さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に無効を示すフラグとして０を格納する。
また、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ３４０に現在スタック操作が行われているスタック領域２１４を示すアドレスデータとして０ｘ３８００番地を示すアドレスデータを格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に有効を示すフラグとして１を格納する。
【００９４】
このように、プロセッサ１では、スタックポインタ制御部４００は、スタック領域がオーバーフローすると判定すると、レジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータに基づいて生成したアドレスデータをスタックポインタレジスタ１１０に格納する。
【００９５】
この構成によれば、スタック領域のオーバーフロー発生時、複雑な処理を施すことなく、予めレジスタに格納されているデータに基づいてスタックポインタレジスタ１１０のデータを書き換える処理だけで、スタック領域の拡張を行うことが可能となる。
【００９６】
これにより、プロセッサ１では、スタック領域の拡張に伴う処理時間を低減することが可能となる。
さらに、プロセッサ１では、メモリ管理実行部３１０は、スタック領域の消費量が規定値を超えたと判定した時に、空きスタック領域を探索する。また、メモリ管理実行部３１０は、スタック領域の消費量が規定値を下回ったと判定した時に、前段のスタック領域を探索する。
【００９７】
この構成によれば、スタック領域の消費量が小さくスタック領域のオーバーフローが発生する可能性が低い段階で、メモリ管理実行部３１０が空きスタック領域の探索を行うことを防ぐことが可能となる。さらに、この構成によれば、スタック領域の消費量が大きくスタック領域のアンダーフローが発生する可能性が低い段階で、メモリ管理実行部３１０が前段のスタック領域の探索を行うことを防ぐことが可能となる。
【００９８】
これにより、プロセッサ１では、メモリ管理実行部３１０による処理の量を低減することが可能となる。
以下、フローチャートを用いて、プロセッサ１の動作をまとめる。
【００９９】
図１２は、プロセッサのスタックポインタ制御部の動作を説明するフローチャートである。
スタックポインタ制御部４００は、処理実行部１００からスタック操作命令があると、スタック領域がオーバーフローするかどうかを判定する（ステップＳ１００）。
【０１００】
スタック領域がオーバーフローすると判定した場合、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが有効かどうかを判定する（ステップＳ１１０）。
【０１０１】
レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが有効でなければ、スタックポインタ制御部４００はステップＳ１１０を繰り返す。
レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが有効（例えば１）である場合、スタックポインタ制御部４００は次の処理を行う。
【０１０２】
即ち、スタックポインタ制御部４００は、スタックポインタレジスタ１１０のアドレスデータに基づいて生成されたアドレスデータをレジスタＳＰ＿ｐｒｅｖ３５０に格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に有効を示すフラグ（例えば１）を格納する。
【０１０３】
次に、スタックポインタ制御部４００は、スタックポインタレジスタ１１０にレジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータに基づいて生成されたアドレスデータを格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に無効を示すフラグ（例えば０）を格納する（ステップＳ１２０）。
【０１０４】
ステップＳ１２０の後、スタックポインタ制御部４００は処理実行部１００にスタック操作開始命令を行う。
一方、ステップＳ１００にて、スタック領域がオーバーフローしないと判定された場合、スタックポインタ制御部４００は、スタック領域がアンダーフローするかどうかを判定する（ステップＳ１３０）。
【０１０５】
スタック領域がアンダーフローしないと判定された場合、スタックポインタ制御部４００は処理実行部１００にスタック操作開始命令を行う。
ステップＳ１３０にて、スタック領域がアンダーフローすると判定された場合、スタックポインタ制御部４００は、次の処理を行う。
【０１０６】
即ち、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３５１のフラグが有効な場合、レジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータが示す番地を含むスタック領域の解放をメモリ管理実行部３１０に要求する（ステップＳ１４０）。
【０１０７】
次に、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが有効（例えば１）かどうかを判定する（ステップＳ１５０）。
レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが有効ではない場合、スタックポインタ制御部４００はステップＳ１５０を繰り返す。
【０１０８】
レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが有効（例えば１）である場合、スタックポインタ制御部４００は、次の処理を行う。
即ち、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ３４０にスタックポインタレジスタ１１０のアドレスデータに基づいて生成されたアドレスデータを格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に有効を示すフラグ（例えば１）を格納する。
【０１０９】
次に、スタックポインタ制御部４００は、スタックポインタレジスタ１１０にレジスタＳＰ＿ｐｒｅｖ３５０のアドレスデータに基づいて生成されたアドレスデータを格納する。さらに、スタックポインタ制御部４００は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に無効を示すフラグ（例えば０）を格納する（ステップＳ１６０）。
【０１１０】
ステップＳ１６０の後、スタックポインタ制御部４００は処理実行部１００にスタック操作開始命令を行う。
ここで、例えば、ステップＳ１００とステップＳ１３０とは順番が入れ替わっても良い。
【０１１１】
次に、メモリ管理実行部３１０の動作について説明する。
図１３は、プロセッサのメモリ管理実行部の動作を説明するフローチャートである。
メモリ管理実行部３１０は、スタックポインタ制御部４００からのスタック領域の解放要求の有無を判定する（ステップＳ２１０）。
【０１１２】
スタック領域の解放要求が有る場合、レジスタＳＰ＿ｎｅｘｔ３４０のアドレスデータが示すスタック領域を解放する（ステップＳ２２０）。
その後、メモリ管理実行部３１０は初期状態に戻る（ステップＳ２００）。
【０１１３】
スタック領域の解放要求が無い場合、メモリ管理実行部３１０は、スタック領域の消費量が規定値以上かどうか、さらに、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが無効（例えば０）かどうかを判定する（ステップＳ２３０）。
【０１１４】
スタック消費量が規定値以上であり、かつ、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１のフラグが無効である場合、メモリ管理実行部３１０は、次の処理を行う。
即ち、メモリ管理実行部３１０は、管理テーブル２３０にアクセスして空きスタック領域を探索し、レジスタＳＰ＿ｎｅｘｔ３４０に空きスタック領域のアドレスデータを格納する。さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１に有効を示すフラグ（例えば１）を格納する（ステップＳ２４０）。
【０１１５】
その後、メモリ管理実行部３１０は初期状態に戻る（ステップＳ２００）。
スタックの消費量が規定値以上ではなく、もしくは、レジスタＳＰ＿ｎｅｘｔ＿ｖ３４１が無効ではない場合、メモリ管理実行部３１０は、スタックの消費量が規定値以下かどうか、さらに、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが無効（例えば０）かどうかを判定する（ステップＳ２５０）。
【０１１６】
スタック領域の消費量が規定値以下であり、かつ、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１のフラグが無効である場合、メモリ管理実行部３１０は、次の処理を行う。
即ち、メモリ管理実行部３１０は、管理テーブル２３０にアクセスして前段のスタック領域を探索し、レジスタＳＰ＿ｐｒｅｖ３５０に前段のスタック領域の位置を示すアドレスデータを格納する。さらに、メモリ管理実行部３１０は、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１に有効を示すフラグ（例えば１）を格納する（ステップＳ２６０）。
【０１１７】
その後、メモリ管理実行部３１０は初期状態に戻る（ステップＳ２００）。
スタックの消費量が規定値以下ではなく、もしくは、レジスタＳＰ＿ｐｒｅｖ＿ｖ３５１が無効ではない場合、メモリ管理実行部３１０は初期状態に戻る（ステップＳ２００）。
【０１１８】
以上説明した実施の形態に関し、さらに以下の付記を開示する。
（付記１）  処理を実行する処理実行部と、
前記処理の実行に伴いデータがスタック操作されるスタック領域を複数備えるメモリと、
前記スタック領域における前記スタック操作の開始位置を示す第１のアドレスデータを格納する第１のレジスタと、
前記複数のスタック領域のうち前記処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを格納する第２のレジスタと、
前記スタック操作が行われる前記スタック領域がオーバーフローすると判定すると、前記第２のアドレスデータに基づいて生成したアドレスデータを前記第１のレジスタに格納する制御部とを有することを特徴とするプロセッサ。
【０１１９】
（付記２）  前記複数のスタック領域は、第１及び第２のスタック領域を含み、前記データが前記第１のスタック領域から前記第２のスタック領域に渡って連続して積み重ねられている場合に、前記第１のスタック領域の位置を示す第３のアドレスデータを格納する第３のレジスタを有し、
前記制御部は、前記第２のスタック領域がアンダーフローすると判定すると、前記第３のアドレスデータに基づいて生成したアドレスデータを前記第１のレジスタに格納することを特徴とする付記１に記載のプロセッサ。
【０１２０】
（付記３）  前記第２のアドレスデータを生成して前記第２のレジスタに格納し、前記第３のアドレスデータを生成して前記第３のレジスタに格納するメモリ管理実行部を有することを特徴とする付記２に記載のプロセッサ。
【０１２１】
（付記４）  前記メモリは、前記複数のスタック領域の使用状態を示す管理テーブルを備え、
前記メモリ管理実行部は、前記管理テーブルに基づいて前記空きスタック領域を探索して前記第２のアドレスデータを生成することを特徴とする付記３に記載のプロセッサ。
【０１２２】
（付記５）  前記空きスタック領域の探索は、前記スタック操作が行われる前記スタック領域の消費量に応じて開始されることを特徴とする付記４に記載のプロセッサ。
（付記６）  前記メモリ管理実行部は、前記管理テーブルに基づいて前記第１のスタック領域を探索して前記第３のアドレスデータを生成することを特徴とする付記４又は５に記載のプロセッサ。
【０１２３】
（付記７）  前記第１のスタック領域の探索は、前記スタック操作が行われる前記スタック領域の消費量に応じて開始されることを特徴とする付記６に記載のプロセッサ。
（付記８）  前記処理実行部と前記メモリ管理実行部とは、それぞれ独立して動作することを特徴とする付記３〜７のいずれか１つに記載のプロセッサ。
【０１２４】
（付記９）  処理実行部が処理を実行するに伴いデータがスタック操作されるメモリ内に設けられた複数のスタック領域のうち、前記処理の実行に用いられていない空きスタック領域の位置を示す第２のアドレスデータを、メモリ管理実行部が生成して第２のレジスタに格納し、
制御部が、前記スタック操作が行われる前記スタック領域がオーバーフローすると判定すると、前記第２のアドレスデータに基づいて生成したアドレスデータを、前記スタック操作の開始位置を示すアドレスデータを格納する第１のレジスタに格納することを特徴とするプロセッサの制御方法。
【０１２５】
（付記１０）  前記処理実行部の前記処理の実行と並行して、前記メモリ管理実行部は前記第２のアドレスデータを生成して前記第２のレジスタに格納することを特徴とする付記９に記載のプロセッサの制御方法。
【０１２６】
（付記１１）  前記複数のスタック領域が第１及び第２のスタック領域を含み、
前記データが前記第１のスタック領域から前記第２のスタック領域に渡って連続して積み重ねられている場合に、前記メモリ管理実行部は、前記第１のスタック領域の位置を示す第３のアドレスデータを生成して第３のレジスタに格納することを特徴とする付記９又は１０に記載のプロセッサの制御方法。
【０１２７】
（付記１２）  前記処理実行部の前記処理の実行と並行して、前記メモリ管理実行部は前記第３のアドレスデータを生成して前記第３のレジスタに格納することを特徴とする付記１１に記載のプロセッサの制御方法。
【符号の説明】
【０１２８】
１  プロセッサ
１００  処理実行部
１１０  スタックポインタレジスタ
１２０  汎用レジスタ
１３０  ステータスレジスタ
１４０  プログラムカウンタレジスタ
２００  メモリ
２１１、２１２、２１３、２１４  スタック領域
２３０  管理テーブル
３００  メモリ管理部
３１０  メモリ管理実行部
３２０  レジスタＳＰ＿ｈｅａｄ
３３０  レジスタＳＰ＿ｌａｓｔ
３４０  レジスタＳＰ＿ｎｅｘｔ
３４１  レジスタＳＰ＿ｎｅｘｔ＿ｖ
３５０  レジスタＳＰ＿ｐｒｅｖ
３５１  レジスタＳＰ＿ｐｒｅｖ＿ｖ
３６０  管理テーブルバッファ
４００  スタックポインタ制御部
５００  データバス
６００  周辺モジュール
【図１】
2011039659.tif 000003
【図２】
2011039659.tif 000004
【図３】
2011039659.tif 000005
【図４】
2011039659.tif 000006
【図５】
2011039659.tif 000007
【図６】
2011039659.tif 000008
【図７】
2011039659.tif 000009
【図８】
2011039659.tif 000010
【図９】
2011039659.tif 000011
【図１０】
2011039659.tif 000012
【図１１】
2011039659.tif 000013
【図１２】
2011039659.tif 000014
【図１３】
2011039659.tif 000015