(57)【要約】【課題】オーバーランが発生した場合に、アプリケーションの強制終了を抑制することを目的とする。【解決手段】メモリ管理プログラムは、コンピュータに、メモリ内の第１領域を確保する命令を検知した場合、第１領域を示す情報を記録し、第１領域へのデータの書き込み命令を検知した場合、書き込み命令と第１領域を示す情報とに基づいて、データを第１領域内に書き込み可能であるか判定し、データを第１領域内に書き込み可能でないと判定した場合、メモリ内における第１領域とは異なる第２領域を確保し、データの一部分を第１領域に書き込み、データの残りの部分を第２領域に書き込む指示を出力する処理を実行させる。【選択図】図１３
2019139330.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
メモリ内の第１領域を確保する命令を検知した場合、前記第１領域を示す情報を記録し、
前記第１領域へのデータの書き込み命令を検知した場合、前記書き込み命令と前記第１領域を示す情報とに基づいて、前記データを前記第１領域内に書き込み可能であるか判定し、
前記データを前記第１領域内に書き込み可能でないと判定した場合、前記メモリ内における前記第１領域とは異なる第２領域を確保し、前記データの一部分を前記第１領域に書き込み、前記データの残りの部分を前記第２領域に書き込む指示を出力する、
処理を実行させることを特徴とするメモリ管理プログラム。
【請求項２】
前記コンピュータに、
前記データを前記第１領域内に書き込み可能でないと判定した場合、前記第２領域を示す情報を、前記第１領域を示す情報に対応付けて記録する、
処理を実行させることを特徴とする請求項１記載のメモリ管理プログラム。
【請求項３】
前記コンピュータに、
前記データを前記第１領域内に書き込み可能でないと判定した場合、前記第２領域への前記データの書き込みに関する情報を出力する、
処理を実行させることを特徴とする請求項１または２に記載のメモリ管理プログラム。
【請求項４】
前記コンピュータに、
前記書き込み命令を検知した場合、前記書き込み命令に含まれる書き込み先頭アドレスに前記データのサイズを加算した値と、前記第１領域の先頭アドレスとの差分が、前記第１領域のサイズより大きい場合、前記データを前記第１領域内に書き込み可能でないと判定する、
処理を実行させることを特徴とする請求項１乃至３のうち何れか１項に記載のメモリ管理プログラム。
【請求項５】
前記コンピュータに、
前記メモリに書き込まれた前記データに対する読み込み命令を検知した場合、前記読み込み命令と、前記第１領域を示す情報とに基づいて、読み込み対象領域のうちの少なくとも一部が前記第２領域に含まれるかを判定し、
前記読み込み対象領域のうちの少なくとも一部が前記第２領域に含まれると判定した場合、前記データのうちの少なくとも一部を、前記第１領域を示す情報に対応付けられた前記第２領域を示す情報に基づいて特定した前記第２領域から読み込む指示を出力する、
処理を実行させることを特徴とする請求項２に記載のメモリ管理プログラム。
【請求項６】
前記コンピュータに、
前記読み込み対象領域のうちの少なくとも一部が前記第２領域に含まれると判定した場合、前記第２領域からの前記データの読み込みに関する情報を出力する、
処理を実行させることを特徴とする請求項５に記載のメモリ管理プログラム。
【請求項７】
前記コンピュータに、
前記読み込み命令を検知し、読み込み先頭アドレスから前記第１領域の先頭アドレスを減算した値が前記第１領域のサイズより大きい場合、前記読み込み対象領域の全範囲が前記第２領域に含まれると判定し、
前記読み込み先頭アドレスから前記第１領域の先頭アドレスを減算した値が前記第１領域のサイズ以下であり、かつ、前記読み込み先頭アドレスから前記第１領域の先頭アドレスを減算した値に読み込み対象データサイズを加算した値が、前記第１領域のサイズより大きい場合、前記読み込み対象領域の一部が前記第２領域に含まれると判定する、
処理を実行させることを特徴とする請求項５または６に記載のメモリ管理プログラム。
【請求項８】
コンピュータが、
メモリ内の第１領域を確保する命令を検知した場合、前記第１領域を示す情報を記録し、
前記第１領域へのデータの書き込み命令を検知した場合、前記書き込み命令と前記第１領域を示す情報とに基づいて、前記データを前記第１領域内に書き込み可能であるか判定し、
前記データを前記第１領域内に書き込み可能でないと判定した場合、前記メモリ内における前記第１領域とは異なる第２領域を確保し、前記データの一部分を前記第１領域に書き込み、前記データの残りの部分を前記第２領域に書き込む指示を出力する、
処理を実行することを特徴とするメモリ管理方法。
【請求項９】
メモリ内の第１領域を確保する命令が検知された場合、前記第１領域を示す情報を記録する記録部と、
前記第１領域へのデータの書き込み命令が検知された場合、前記書き込み命令と前記第１領域を示す情報とに基づいて、前記データを前記第１領域内に書き込み可能であるか判定する書き込み判定部と、
前記データを前記第１領域内に書き込み可能でないと判定された場合、前記メモリ内における前記第１領域とは異なる第２領域を確保し、前記データの一部分を前記第１領域に書き込み、前記データの残りの部分を前記第２領域に書き込む指示を出力する書き込み指示部と、
を備えることを特徴とするメモリ管理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ管理プログラム、メモリ管理方法、およびメモリ管理装置に関する。
【背景技術】
【０００２】
プログラム設計ミス等により、メモリへの書き込み対象のデータサイズが予め確保されたメモリ領域のサイズを超えた場合、メモリオーバーラン（以下、オーバーランと称する）が発生する。そして、Operating System（OS）は、オーバーランを検知した場合、例外処理として、例えば、オーバーランを発生させたアプリケーションを強制終了させる。
【０００３】
関連する技術として、動的メモリ確保用のアルゴリズムの実行の命令の発行をフックし、動的メモリ確保用のアルゴリズムの実行で確保されたアドレスの領域内の内容を検査する技術が提案されている（例えば、特許文献１を参照）。
【０００４】
また、関連する技術として、ファイルサーバアプリケーション部のファイルＩ／Ｏ発行要求をフックし、フックしたファイルＩ／Ｏ発行要求からアクセス対象となるファイルの情報を取得する技術が提案されている（例えば、特許文献２を参照）。
【０００５】
また、関連する技術として、ファイル更新時において管理テーブルを更新し、管理テーブルの内容から次回の処理でオーバフローの可能性があると判断した時にファイル領域を拡張する技術が提案されている（例えば、特許文献３を参照）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１６−４２３１８号公報
【特許文献２】特開２０１３−１９６０６６号公報
【特許文献３】特開平５−２３３３９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
オーバーランが発生したことによりアプリケーションが強制終了した場合、アプリケーションを使用するユーザの業務に支障をきたす可能性がある。
【０００８】
オーバーランを防止するために、例えば、メモリ確保の際に必要なサイズに余裕分のサイズを加算したメモリ領域をアプリケーションが確保することが考えられる。しかし、余裕分のサイズをどのくらい確保すればオーバーランを防止できるかをメモリ確保の際に判定することは困難である。また、メモリの容量に余裕がない場合、余裕分のメモリを確保することは困難である。
【０００９】
１つの側面として、本発明は、オーバーランが発生した場合に、アプリケーションの強制終了を抑制することを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、メモリ管理プログラムは、コンピュータに、メモリ内の第１領域を確保する命令を検知した場合、前記第１領域を示す情報を記録し、前記第１領域へのデータの書き込み命令を検知した場合、前記書き込み命令と前記第１領域を示す情報とに基づいて、前記データを前記第１領域内に書き込み可能であるか判定し、前記データを前記第１領域内に書き込み可能でないと判定した場合、前記メモリ内における前記第１領域とは異なる第２領域を確保し、前記データの一部分を前記第１領域に書き込み、前記データの残りの部分を前記第２領域に書き込む指示を出力する処理を実行させる。
【発明の効果】
【００１１】
１つの側面によれば、オーバーランが発生した場合に、アプリケーションの強制終了を抑制することができる。
【図面の簡単な説明】
【００１２】
【図１】実施形態におけるシステムの全体構成の一例を示す。
【図２】メモリ管理部の一例を示す図である。
【図３】第１領域管理テーブルの一例を示す図である。
【図４】第２領域管理テーブルの一例を示す図である。
【図５】複数回拡張が行われた場合の第２領域管理テーブルの一例を示す図である。
【図６】メモリ領域の拡張方法を示す図である。
【図７】トレーステーブルの一例を示す図である。
【図８】第２領域へのデータの書き込みに関する情報の一例を示す図である。
【図９】第２領域からのデータの読み込みに関する情報の一例を示す図である。
【図１０】実施形態の設定処理の一例を示すフローチャートである。
【図１１】メモリ管理部の処理の一例を示すフローチャートである。
【図１２】図１１のステップＳ２０３におけるメモリ確保監視処理の一例を示すフローチャートである。
【図１３】図１１のステップＳ２０５におけるメモリ書き込み監視処理の一例を示すフローチャートである。
【図１４】図１１のＳ２０７におけるメモリ読み込み監視処理の一例を示すフローチャート（その１）である。
【図１５】図１１のＳ２０７におけるメモリ読み込み監視処理の一例を示すフローチャート（その２）である。
【図１６】実施例における監視対象アプリケーションに用いられるソースコードである。
【図１７】実施例におけるメモリ確保処理に関するアセンブラコードを示す図である。
【図１８】実施例のメモリ確保処理におけるトレーステーブルを示す図である。
【図１９】実施例における第１領域管理テーブルを示す図である。
【図２０】実施例における確保されたメモリ領域を示す図である。
【図２１】実施例におけるメモリ書き込み処理に関するアセンブラコードを示す図である。
【図２２】実施例のメモリ書き込み処理におけるトレーステーブルを示す図である。
【図２３】実施例における書き込み処理後の第２領域管理テーブルと第１領域管理テーブルとを示す図である。
【図２４】実施例におけるメモリ領域の拡張方法を示す図である。
【図２５】実施例におけるメモリ読み込み処理に関するアセンブラコードである。
【図２６】実施例のメモリ読み込み処理におけるトレーステーブルを示す図である。
【図２７】実施例の読み込み処理におけるメモリ領域を示す図である。
【図２８】情報処理装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【００１３】
以下、図面を参照して、実施形態について説明する。図１は、実施形態におけるシステムの全体構成の一例を示す。実施形態におけるシステムは、情報処理装置１と表示装置２とを含む。情報処理装置１は、コンピュータの一例である。
【００１４】
情報処理装置１は、ＯＳ１１とメモリ管理部１２と管理情報記憶部１３と設定部１４とアプリケーション１５−１〜アプリケーション１５−ｎとを含む。以下、アプリケーション１５−１〜アプリケーション１５−ｎを区別しない場合、アプリケーション１５と称する。
【００１５】
ＯＳ１１は、アプリケーション１５からの命令に応じて、メモリ確保、メモリへのデータ書き込み、およびメモリからのデータ読み込み等の処理を行う。また、ＯＳ１１は、メモリ管理部１２からの指示に応じた処理を行う。
【００１６】
メモリ管理部１２は、アプリケーション１５によるメモリ使用状況を管理する。また、メモリ管理部１２は、アプリケーション１５からＯＳ１１に対するメモリアクセスに関する命令をフックし、所定の条件に応じて、フックした命令と異なる命令をＯＳ１１に出力する。
【００１７】
メモリ管理部１２は、例えば、アプリケーション１５の実行ファイルからアセンブラコードを取得し、解析を行うことにより、アプリケーション１５からＯＳ１１への命令をフックする。以下、アプリケーション１５の実行ファイルからアセンブラコードを取得し、解析を行うことをアセンブラ解析と称することがある。メモリ管理部１２は、例えば、アプリケーション１５のＯＳ１１に対する処理を監視するフィルタドライバとして動作する。メモリ管理部１２の詳細については、後述する。
【００１８】
管理情報記憶部１３は、メモリ管理部１２によるメモリ管理に用いられる各種管理情報を記憶する。管理情報の詳細については、後述する。
【００１９】
設定部１４は、メモリ管理に関する各種設定を行う。設定部１４は、情報処理装置１に、フックモジュールを登録する。フックモジュールは、メモリ管理部１２により実現されるプログラムモジュールである。
【００２０】
アプリケーション１５は、ＯＳ１１上で動作するソフトウェアである。情報処理装置１に搭載されるアプリケーション１５は、一つであってもよいし、複数であってもよい。
【００２１】
表示装置２は、情報処理装置１と通信可能であり、情報処理装置１から出力された情報を表示する。表示装置２は、例えば、メモリ管理部１２が生成した情報を表示する。表示装置２は、情報処理装置１に含まれていてもよい。
【００２２】
図２は、メモリ管理部１２の一例を示す図である。メモリ管理部１２は、検知部２１と記録部２２と書き込み判定部２３と書き込み指示部２４と読み込み判定部２５と読み込み指示部２６と出力部２７とを含む。
【００２３】
検知部２１は、監視対象であるアプリケーション１５が、メモリを確保する命令、メモリへのデータ書き込み命令、またはメモリからのデータ読み込み命令をＯＳ１１に出力したことを検知する。検知部２１は、例えば、アプリケーション１５からＯＳ１１への命令をフックすることにより検知を行う。以下、監視対象であるアプリケーション１５を監視対象アプリケーションと称する。
【００２４】
記録部２２は、検知部２１がメモリ内の領域（第１領域）を確保する命令を検知した場合、第１領域を示す情報を第１領域管理テーブルに記録する。第１領域管理テーブルは、管理情報記憶部１３に記憶される。
【００２５】
書き込み判定部２３は、検知部２１がメモリの第１領域へのデータの書き込み命令を検知した場合、書き込み命令と、第１領域管理テーブルに記録された第１領域を示す情報とに基づいて、データを第１領域内に書き込み可能であるか判定する。以下、書き込み命令において書き込み対象として特定されているデータを書き込み対象データと称する。
【００２６】
書き込み指示部２４は、書き込み判定部２３が書き込み対象データを第１領域内に書き込み可能でないと判定した場合、メモリ内における第１領域とは異なる第２領域を確保する指示をＯＳ１１に出力する。さらに、書き込み指示部２４は、書き込み対象データの一部分を前記第１領域に書き込み、残りの部分を前記第２領域に書き込む指示をＯＳ１１に出力する。
【００２７】
ＯＳ１１は、書き込み指示部２４からの指示に基づいて、新たに第２領域を確保し、データの一部分を第１領域に書き込み、残りの部分を第２領域に書き込む。
【００２８】
記録部２２は、書き込み判定部２３が書き込み対象データを第１領域に書き込み可能でないと判定した場合、第２領域を示す情報を、第１領域を示す情報に対応付けて第２領域管理テーブルに記録する。第２領域を示す情報は、例えば、第２領域の先頭アドレスおよび確保したメモリサイズである。第２領域管理テーブルは、管理情報記憶部１３に記憶される。
【００２９】
出力部２７は、書き込み判定部２３が、書き込み対象データを第１領域内に書き込み可能でないと判定した場合、第２領域へのデータの書き込みに関する情報を出力する。
【００３０】
なお、本実施形態では、書き込み指示部２４が、第２領域にデータを書き込むことをＯＳ１１に指示した場合に、オーバーランが発生したとみなすこととする。
【００３１】
読み込み判定部２５は、検知部２１が読み込み命令を検知した場合、読み込み命令と、第１領域を示す情報とに基づいて、読み込み対象領域のうちの少なくとも一部が第２領域に含まれるかを判定する。以下、読み込み命令において読み込み対象として特定されているデータを読み込み対象データと称する。
【００３２】
読み込み指示部２６は、読み込み対象領域のうちの少なくとも一部が第２領域に含まれると判定した場合、読み込み対象データのうちの少なくとも一部を、第２領域から読み込む指示をＯＳ１１に出力する。読み込み指示部２６は、第１領域を示す情報に対応付けられた第２領域を示す情報に基づいてＯＳ１１に指示する第２領域を特定する。
【００３３】
出力部２７は、読み込み判定部２５が、読み込み対象領域のうちの少なくとも一部が第２領域に含まれると判定した場合、第２領域からのデータの読み込みに関する情報を出力する。
【００３４】
出力部２７は、例えば、第２領域へのデータの書き込みまたは第２領域からのデータの読み込みに関する情報を生成して、表示装置２に表示させてもよい。また、出力部２７は、情報処理装置１と通信可能な他の情報処理装置等（例えば、管理用サーバ）に、生成した情報を送信してもよい。
【００３５】
図３は、第１領域管理テーブルの一例を示す図である。図３に示すように、第１領域管理テーブルは、モジュール名とハンドル名とＢａｓｅアドレスとサイズとリンクIdentification（ID）とを含む。第１領域管理テーブルに記録されるハンドル名、Ｂａｓｅアドレスおよびサイズは、第１領域を示す情報の一例である。第１領域管理テーブルの各項目は、検知部２１がメモリ内の第１領域を確保する命令を検知した際に、記録部２２により記録される。
【００３６】
「モジュール名」は、メモリ確保命令をＯＳ１１に出力するプログラムのモジュール名を示す。「ハンドル名」は、メモリ確保に用いられるハンドル名を示す。「ｂａｓｅアドレス」は、確保されるメモリの先頭アドレスを示す。「サイズ」は、確保されるメモリのサイズ［ｂｙｔｅ］を示す。「リンクＩＤ」は、第１領域と第２領域とを対応付ける情報の一例である。
【００３７】
なお、第１領域管理テーブルに記録される情報は、図３に示す情報に限られない。例えば、第１領域管理テーブルに記録される情報は、確保される第１領域の終端アドレスを含んでいてもよい。
【００３８】
図４は、第２領域管理テーブルの一例を示す図である。第２領域管理テーブルは、リンクＩＤとＢａｓｅアドレスとサイズとを含む。Ｂａｓｅアドレスおよびサイズは、第２領域を示す情報の一例である。記録部２２は、第２領域が確保された場合、第２領域管理テーブルの各項目を記録する。
【００３９】
「リンクＩＤ」は、図３に示す第１領域管理テーブル内のリンクＩＤに対応している。記録部２２は、拡張元の第１領域のＢａｓｅアドレスおよびサイズに対応付けられたリンクＩＤと同じリンクＩＤを第２領域のＢａｓｅアドレスおよびサイズに対応付けて記録する。
【００４０】
「Ｂａｓｅアドレス」は、第２領域のメモリの先頭アドレスを示す。「サイズ」は、第２領域のメモリサイズ［ｂｙｔｅ］を示す。
【００４１】
なお、第２領域管理テーブルに記録される情報は、図４に示す情報に限られない。例えば、第２領域管理テーブルに記録される情報は、確保される第２領域の終端アドレスを含んでいてもよい。
【００４２】
第１領域管理テーブルと第２領域管理テーブルとは一つのテーブルであってもよい。例えば、記録部は、第２領域が確保された場合に、第２領域のＢａｓｅアドレスおよびサイズを、第１領域を示す情報と対応づけて第１領域管理テーブル内に記録してもよい。
【００４３】
図５は、複数回拡張が行われた場合の第２領域管理テーブルの一例を示す図である。図５（ａ）に示す第２領域管理テーブル１は、１回目の拡張（第２領域の確保）が行われた際に生成されるテーブルであり、図４に示す第２領域管理テーブルにリンクＩＤ’が追加された構成である。記録部２２は、１回目の拡張が行われた際に、第２領域管理テーブル１に、リンクＩＤ、Ｂａｓｅアドレス、およびサイズを記録する。
【００４４】
図５（ｂ）に示す第２領域管理テーブル２は、２回目の拡張が行われた際に生成されるテーブルである。第２領域管理テーブル２は、リンクＩＤ’とリンクＩＤ’’とＢａｓｅアドレスとサイズとを含む。第２領域管理テーブル２のリンクＩＤ’は、第２領域管理テーブル１のリンクＩＤ’に対応する。すなわち、リンクＩＤ’は、１回目に確保された第２領域と２回目に確保された第２領域とを対応付ける情報である。
【００４５】
例えば、１回目の第２領域の確保が行われた後に、第１領域と第２領域の合計サイズを超えるデータの書き込み命令が出力された場合に、別の第２領域が確保され、記録部２２は、第２領域管理テーブル２を生成する。そして、記録部２２は、第２領域管理テーブル２のリンクＩＤ’、Ｂａｓｅアドレス、およびサイズを記録する。また、記録部２２は、第２領域管理テーブル１のリンクＩＤ’に第２領域管理テーブル２に記録したリンクＩＤ’と同一のＩＤを記録する。
【００４６】
リンクＩＤ’’は、３回目の第２領域の確保が行われた場合に、２回目に確保された第２領域と、３回目に確保された第２領域とを対応付けるために記録される。よって、記録部２２は、２回目の第２領域の確保が行われた時点では、リンクＩＤ’’を記録しない。
【００４７】
図６は、メモリ領域の拡張方法を示す図である。図６に示す例では、メモリを確保する命令に応じて、ＯＳ１１が第１領域Ａ、第１領域Ｂ、および第１領域Ｃを確保したとする。また、監視対象アプリケーションから、第１領域Ａのサイズを超えるデータの書き込み命令が出力され、ＯＳ１１が第１領域Ａに対応する第２領域Ａを確保したとする。また、監視対象アプリケーションから、第１領域Ｂのサイズを超えるデータの書き込み命令が出力され、ＯＳ１１が第１領域Ｂに対応する第２領域Ｂを確保したとする。すなわち、第１領域Ａと第２領域Ａには、一つのデータが分割して記憶されている。また、第１領域Ｂと第２領域Ｂには、一つのデータが分割して記憶されている。
【００４８】
図６に示すように、第２領域が確保された場合、第２領域と拡張元の第１領域とはメモリ上で連続した領域にならない可能性がある。本実施形態では、図３〜図５に示すように、第１領域管理テーブルおよび第２領域管理テーブルにおいて、リンクＩＤにより第１領域を示す情報と第２領域を示す情報とが対応付けられている。そのため、読み込み指示部２６は、読み込み対象領域の少なくとも一部が第２領域に含まれる場合、読み込み対象領域に含まれる第２領域を特定し、特定した第２領域からデータを読み込むことをＯＳ１１に指示することができる。
【００４９】
図７は、トレーステーブルの一例を示す図である。トレーステーブルは、レジスタとハンドルとの対応関係を示すテーブルである。記録部２２は、メモリアクセスに用いられたハンドルのハンドル名と、そのメモリアクセスに関する情報が記憶されたレジスタのレジスタ名とを対応付けてトレーステーブルに記録する。トレーステーブルは、例えば、管理情報記憶部１３に記憶される。
【００５０】
図７に示すｇ_ｈＭｅｍ１００、ｇ_ｈＭｅｍ２００およびｇ_ｈＭｅｍ３００およびは、ハンドル名の例である。また、図７に示すｒｃｘおよびｒａｘは、レジスタ名の例である。図７に示す例ではｇ_ｈＭｅｍ２００とｒｃｘとが対応し、ｇ_ｈＭｅｍ２００とｒｃｘとが対応している。
【００５１】
メモリ管理部１２は、トレーステーブルを参照することにより、レジスタに記憶されている値が、どのハンドルに関する値かを容易に特定することができる。
【００５２】
図８は、第２領域へのデータの書き込みに関する情報の一例を示す図である。出力部２７は、書き込み判定部２３が書き込み対象データを第１領域に書き込み可能でないと判定した場合に、図８の例に示す、データの書き込みに関する情報を出力する。
【００５３】
図８に示す「時刻」は、例えば、書き込み指示部２４が、ＯＳ１１に第２領域への書き込み指示を行ったタイミングである。「イベント」は、発生したイベント内容を示す。出力部２７は、第２領域への書き込みの場合、例えば、「オーバーラン発生」と記述する。「詳細情報」には、例えば、書き込みが行われる第２領域の先頭アドレスとサイズが記述される。「スタック情報」には、書き込みを実行したモジュール名および関数名、モジュールが使用するスタック領域のアドレスが記述される。図８に示す「スタック情報」は、モジュール「ｍｏｄ_４.ｄｌｌ」における関数「ＷｒｉｔｅＭｅｍ」が実行する書き込み処理において、オーバーランが発生したことを示している。
【００５４】
「スタック情報」には、オーバーランを発生させたモジュールおよび関数と、呼び出し元のモジュールおよび関数が順に記述される。すなわち、図８に示す情報は、モジュール「ｍｏｄ_３.ｄｌｌ」における関数「ｆｕｎｃｔｉｏｎ３」が、モジュール「ｍｏｄ_４.ｄｌｌ」における関数「ＷｒｉｔｅＭｅｍ」を呼び出したことを示している。また、図８に示す情報は、モジュール「ｍｏｄ_２.ｄｌｌ」における関数「ｆｕｎｃｔｉｏｎ２」が、モジュール「ｍｏｄ_３.ｄｌｌ」における関数「ｆｕｎｃｔｉｏｎ３」を呼び出したことを示している。また、図８に示す情報は、モジュール「ｍｏｄ_１.ｄｌｌ」における関数「ｆｕｎｃｔｉｏｎ１」がモジュール「ｍｏｄ_２.ｄｌｌ」における関数「ｆｕｎｃｔｉｏｎ２」を呼び出したことを示している。
【００５５】
アプリケーション１５によるオーバーランが発生し、ＯＳ１１が例外を発生させてアプリケーションを異常終了させた場合、オーバーランの発生タイミングと例外の発生タイミングが一致しない。従って、情報が出力されなかった場合、オーバーランを行ったタイミングを特定することが困難である。また、情報が出力されなかった場合、オーバーランを発生させたモジュール、関数、書き込まれたメモリ領域のアドレスおよびサイズ等を特定することが困難である。
【００５６】
本実施形態の情報処理装置１は、第２領域への書き込みに関する情報を出力することにより、オーバーランの発生タイミング、オーバーランを発生させたモジュール、関数、書き込まれたメモリ領域のアドレスおよびサイズ等を明示することができる。
【００５７】
図９は、第２領域からのデータの読み込みに関する情報の一例を示す図である。図９に示す「時刻」は、例えば、読み込み指示部２６が、ＯＳ１１に第２領域からの読み込み指示を行ったタイミングである。「イベント」は、発生したイベント内容を示す。出力部２７は、第２領域からの読み込みの際に情報を出力する場合、例えば、「オーバーラン領域読み込み」と記述する。「詳細情報」には、例えば、第２領域の先頭アドレスと読み込み対象データサイズとが記述される。
【００５８】
「スタック情報」には、読み込みを実行したモジュール名および関数名、モジュールが使用するスタック領域のアドレスが記述される。図９に示す情報は、モジュール「ｍｏｄ_４.ｄｌｌ」における関数「ＲｅａｄＭｅｍ」が実行する読み込み処理において、オーバーランが発生したことを示している。また、図８と同様に、オーバーラン領域への読み込みを発生させたモジュールおよび関数と、呼び出し元のモジュールおよび関数が順に記述される。
【００５９】
本実施形態の情報処理装置１は、第２領域からのデータ読み込みに関する情報を出力することにより、読み込みタイミング、第２領域からの読み込みを実行したモジュール、関数、読み込まれたメモリ領域のアドレスおよびサイズ等を明示することができる。
【００６０】
以下、本実施形態における情報処理装置１の処理の流れについて説明する。
図１０は、実施形態の設定処理の一例を示すフローチャートである。設定部１４は、メモリ管理に関する各種設定を行う（ステップＳ１０１）。設定部１４は、例えば、ユーザの操作に応じて、監視対象アプリケーション名、および情報出力形式等を記録した設定ファイルを生成する。
【００６１】
設定部１４は、情報処理装置１に、フックモジュールを登録する（ステップＳ１０２）。フックモジュールは、メモリ管理部１２により実現されるプログラムモジュールである。設定部１４は、例えば、ユーザの操作に応じて、フックモジュールを情報処理装置１にインストールして、フックモジュールを実行可能な状態とする。
【００６２】
図１１は、メモリ管理部１２の処理の一例を示すフローチャートである。図１１に示す処理は、メモリ管理部１２により実現されるフックモジュールが起動する際に開始する。なお、監視対象アプリケーションが複数存在する場合、メモリ管理部１２は、監視対象アプリケーション毎に、図１１に示す処理を実行する。
【００６３】
検知部２１は、監視対象アプリケーションが起動したかを判定する（ステップＳ２０１）。検知部２１は、例えば、起動したアプリケーションが監視対象であるかをプロセスＩＤ、または設定ファイルに記録された監視対象アプリケーション名等に基づいて判定する。検知部２１が、監視対象アプリケーションが起動していないと判定した場合（ステップＳ２０１でＮＯ）、処理は、ステップＳ２０２に移行しない。
【００６４】
検知部２１が、監視対象アプリケーションが起動したと判定した場合（ステップＳ２０１でＹＥＳ）、処理は、ステップＳ２０２に移行する。
【００６５】
監視対象アプリケーションがメモリ内の領域（第１領域）を確保する命令をＯＳ１１に出力したことを検知部２１が検知した場合（ステップＳ２０２でＹＥＳ）、メモリ管理部１２は、メモリ確保監視処理を実行する（ステップＳ２０３）。ステップＳ２０３のメモリ確保監視処理について、詳細は後述する。ステップＳ２０２でＮＯの場合、処理は、ステップＳ２０４に移行する。
【００６６】
監視対象アプリケーションがメモリの第１領域へのデータ書き込み命令をＯＳ１１に出力したことを検知部２１が検知した場合（ステップＳ２０４でＹＥＳ）、メモリ管理部１２は、メモリ書き込み監視処理を実行する（ステップＳ２０５）。ステップＳ２０５のメモリ書き込み監視処理について、詳細は後述する。ステップＳ２０４でＮＯの場合、処理は、ステップＳ２０６に移行する。
【００６７】
監視対象アプリケーションがメモリに書き込まれたデータに対する読み込み命令をＯＳ１１に出力したことを検知部２１が検知した場合（ステップＳ２０６でＹＥＳ）、メモリ管理部１２は、メモリ読み込み監視処理を実行する（ステップＳ２０７）。メモリ読み込み監視処理について、詳細は後述する。ステップＳ２０６でＮＯの場合、処理は、ステップＳ２０８に移行する。
【００６８】
検知部２１は、監視対象アプリケーションが停止したか判定する（ステップＳ２０８）。監視対象のアプリケーションが停止していないと判定された場合（ステップＳ２０８でＮＯ）、処理は、ステップＳ２０２に戻る。
【００６９】
監視対象アプリケーションが停止していると判定された場合（ステップＳ２０８でＹＥＳ）、検知部２１は、監視終了指示を受けたか判定する（ステップＳ２０９）。監視終了指示は、例えば、ユーザの操作に基づいて行われる。
【００７０】
メモリ管理部１２は、監視終了指示を受けていない場合（ステップＳ２０９でＮＯ）、処理をステップＳ２０１に戻す。メモリ管理部１２は、監視終了指示を受けた場合（ステップＳ２０９でＹＥＳ）、処理を終了する。
【００７１】
図１２は、図１１のステップＳ２０３におけるメモリ確保監視処理の一例を示すフローチャートである。
【００７２】
記録部２２は、第１領域を示す情報を、第１領域管理テーブルに記録する（ステップＳ３０１）。記録部２２は、例えば、図３に示す第１領域管理テーブルに列を追加する。そして、記録部２２は、第１領域を示す情報として、メモリ確保命令を実行したモジュール名、メモリ確保に用いられたハンドル名、確保するメモリのＢａｓｅアドレス、確保するメモリのサイズを記録する。
【００７３】
記録部２２は、メモリ確保に用いられたハンドル名に対応するトレーステーブルが存在するか判定する（ステップＳ３０２）。ステップＳ３０２でＮＯの場合、記録部２２は、メモリ確保に用いられたハンドル名に対応するトレーステーブルを作成する（ステップＳ３０３）。トレーステーブルは、例えば、図７に示すテーブルであり、作成された時点では、ハンドル名が記録されており、レジスタ名が記録されていない。
【００７４】
ステップＳ３０２でＹＥＳの場合またはステップＳ３０３の処理後、記録部２２は、メモリ確保に用いられたハンドル名に対応するトレーステーブルに、確保するメモリのＢａｓｅアドレスが記憶されたレジスタのレジスタ名を記録する（ステップＳ３０４）。なお、確保するメモリのＢａｓｅアドレスは、ＯＳ１１の処理により予めレジスタに記憶されているとする。
【００７５】
記録部２２は、ステップＳ３０４で記録したレジスタ名が他のトレーステーブルに記録されている場合、そのレジスタ名を削除する（ステップＳ３０５）。
【００７６】
図１３は、図１１のステップＳ２０５におけるメモリ書き込み監視処理の一例を示すフローチャートである。書き込み判定部２３は、書き込み命令における書き込み先頭アドレスが、どのハンドルに対応するメモリ領域（第１領域）内に存在するかを、第１領域管理テーブルに基づいて特定する（ステップＳ４０１）。書き込み判定部２３は、例えば、書き込み命令をフックして、書き込み命令に含まれる書き込み先頭アドレスを取得する。そして、書き込み判定部２３は、書き込み先頭アドレスが、第１領域管理テーブルにおけるいずれかのハンドルのＢａｓｅアドレスから、Ｂａｓｅアドレス＋サイズまでの間に存在する場合、書き込みアドレスがそのハンドルのメモリ領域内であると判定する。第１領域管理テーブルに第１領域の終端アドレスが含まれている場合、書き込み判定部２３は、書き込み先頭アドレスが、Ｂａｓｅアドレスから終端アドレスまでの間に含まれているかを判定してもよい。以下、ステップＳ４０１で書き込み判定部２３が特定した、書き込みに使用されるハンドルを書き込み対象ハンドルと称する。
【００７７】
書き込み判定部２３は、書き込み先頭アドレスに書き込み対象データサイズを加算した値が記憶されたレジスタを、例えば、アセンブラ解析により特定する（ステップＳ４０２）。なお、書き込み先頭アドレスに書き込み対象データサイズを加算した値は、ＯＳ１１の処理により予めレジスタに記憶されているとする。
【００７８】
記録部２２は、ステップＳ４０１で特定した書き込み対象ハンドルのトレーステーブルに、ステップＳ４０２で特定したレジスタのレジスタ名を記録する（ステップＳ４０３）。すなわち、記録部２２は、書き込み対象ハンドルと、ステップＳ４０２で特定したレジスタのレジスタ名とを対応付けて記録する。レジスタ名は、レジスタを示す情報の一例である。
【００７９】
書き込み判定部２３は、レジスタに記憶された値と第１領域管理テーブルにおいて書き込み対象ハンドルに対応付けられているＢａｓｅアドレスとの差分であるｏｆｆｓｅｔ１を算出する（ステップＳ４０５）。レジスタの値は、上述のように、書き込み先頭アドレスに書き込み対象データサイズを加算した値である。
【００８０】
なお、書き込み判定部２３は、例えば、トレーステーブルに書き込み先頭アドレスと書込みデータサイズをそれぞれ記憶している場合は、書き込み先頭アドレスと書き込みデータサイズとをレジスタからそれぞれ取得し、取得した書き込み先頭アドレスと書き込みデータサイズとを加算して、ステップＳ４０５の算出に用いてもよい。
【００８１】
書き込み判定部２３は、第１領域管理テーブルを参照して、書き込み対象データが第１領域内に書き込み可能であるか判定する（ステップＳ４０６）。書き込み判定部２３は、例えば、第１領域管理テーブルを参照して、ｏｆｆｓｅｔ１が、書き込み対象ハンドルの第１領域のサイズ以下である場合、書き込み対象データが第１領域に書き込み可能であると判定する（ステップＳ４０６でＹＥＳ）。また、書き込み判定部２３は、第１領域管理テーブルを参照して、ｏｆｆｓｅｔ１が、書き込み対象ハンドルの第１領域のサイズより大きい場合、書き込み対象データが第１領域に書き込み可能でないと判定する（ステップＳ４０６でＮＯ）。
【００８２】
ステップＳ４０６でＮＯの場合、書き込み指示部２４は、第１領域とは異なる第２領域を確保することと、書き込み対象データの一部分を第１領域に書き込み、残りの部分を第２領域に書き込むことを、ＯＳ１１に指示する（ステップＳ４０７）。ステップＳ４０７で確保される第２領域は、ｏｆｆｓｅｔ１から書き込み対象ハンドルのサイズを減算したサイズの領域である。書き込み指示部２４は、例えば、書き込み対象データを、第１領域に書き込み可能な第１部分と残りの部分である第２部分とに分割し、第１部分を第１領域に書き込み、第２部分を第２領域に書き込みことをＯＳ１１に指示する。ＯＳ１１は、書き込み指示部２４からの指示に基づいて、書き込みを行う。
【００８３】
記録部２２は、第２領域管理テーブルを作成する（ステップＳ４０８）。そして、記録部２２は、第２領域を示す情報を、第１領域を示す情報に対応付けて記録する（ステップＳ４０９）。記録部２２は、例えば、第１領域管理テーブルにおいて書き込み対象ハンドルに対応付けてリンクＩＤを記録し、第２領域管理テーブルにおいて、そのリンクＩＤと第２領域のＢａｓｅアドレスおよびサイズとを対応付けて記録する。
【００８４】
出力部２７は、第２領域へのデータの書き込みに関する情報を出力する（ステップＳ４１０）。出力部２７は、例えば、図８に示す情報を生成し、表示装置２に表示させる、または所定の領域に記憶する。
【００８５】
以上のように、書き込み判定部２３は、書き込み対象データのサイズが予め確保されたメモリ領域のサイズを超えた場合、新たに第２領域を確保するとともに第２領域にデータを書き込むことをＯＳ１１に指示する。そのため、本実施形態の情報処理装置１は、アプリケーションの強制終了を抑制することができる。
【００８６】
また、出力部２７は、第２領域へのデータ書き込みに関する情報を出力するので、オーバーランの発生タイミング、オーバーランを発生させたモジュール、関数、書き込まれたメモリ領域のアドレスおよびサイズ等を明示することができる。
【００８７】
図１４および図１５は、図１１のＳ２０７におけるメモリ読み込み監視処理の一例を示すフローチャートである。読み込み判定部２５は、読み込み命令をフックして読み込みに用いられるハンドルを特定し、第１領域管理テーブルから、そのハンドルに対応するｂａｓｅアドレスとサイズを取得する（ステップＳ５０１）。以下、ステップＳ５０１で特定されたハンドルを読み込み対象ハンドルと称する。
【００８８】
記録部２２は、読み込み先頭アドレスが記憶されたレジスタをアセンブラ解析により特定し、特定したレジスタのレジスタ名を読み込み対象ハンドルと対応付けてトレーステーブルに記憶する（ステップＳ５０２）。なお読み込み先頭アドレスは、ＯＳ１１の処理により予めレジスタに記憶されているとする。
【００８９】
読み込み判定部２５は、トレーステーブルから読み込み対象ハンドルのレジスタを特定し、そのレジスタに記憶されたデータを取得する（ステップＳ５０３）。すなわち、読み込み判定部２５は、読み込み命令における読み込み先頭アドレスをレジスタから取得する。
【００９０】
読み込み判定部２５は、読み込み対象データサイズが記憶されたレジスタをアセンブラ解析により特定し、レジスタから読み込み対象データサイズを取得する（ステップＳ５０４）。なお、読み込み対象データサイズは、ＯＳ１１の処理により予めレジスタに記憶されているとする。
【００９１】
読み込み判定部２５は、下記の式によりｏｆｆｓｅｔ２を計算する（ステップＳ５０５）。
ｏｆｆｓｅｔ２＝読み込み先頭アドレス−読み込み対象ハンドルのｂａｓｅアドレス
【００９２】
読み込み判定部２５は、読み込み対象領域の全範囲が第２領域に含まれるかを判定する（ステップＳ５０６）。読み込み判定部２５は、ｏｆｆｓｅｔ２が読み込み対象ハンドルの第１領域のサイズより大きい場合、読み込み対象データが第１領域に含まれず、読み込み対象データの全範囲が第２領域に含まれていると判定する（ステップＳ５０６でＹＥＳ）。読み込み判定部２５は、ｏｆｆｓｅｔ２が読み込み対象ハンドルについて確保された第１領域のサイズ以下である場合、読み込み対象データの少なくとも一部が第１領域に含まれていると判定する（ステップＳ５０６でＮＯ）。
【００９３】
ステップＳ５０６でＮＯの場合、読み込み判定部２５は、読み込み対象領域の一部が第２領域に含まれるかを判定する（ステップＳ５０７）。読み込み判定部２５は、ｏｆｆｓｅｔ２と読み込み対象データサイズを加算した値が第１領域のサイズ以下である場合、読み込み末尾アドレスが第１領域に含まれるので、読み込み対象データが第１領域にのみ記憶されていると判定する（ステップＳ５０７でＮＯ）。読み込み判定部２５は、ｏｆｆｓｅｔ２と読み込み対象データサイズを加算した値が第１領域のサイズより大きい場合、読み込み末尾アドレスが第２領域に含まれるので、読み込み対象領域の一部が第２領域に含まれると判定する（ステップＳ５０７でＹＥＳ）。
【００９４】
ステップＳ５０７でＮＯの場合、メモリ読み込み監視処理が終了する。すなわち、読み込み指示部２６からＯＳ１１へ指示を出力せず、ＯＳ１１は、アプリケーション１５からの命令に基づいて、読み込み処理を実行する。
【００９５】
ステップＳ５０７でＹＥＳの場合、読み込み指示部２６は、読み込み先頭アドレスから第１領域の末尾のアドレスまでデータを読み込むことをＯＳ１１に指示する（ステップＳ５０８）。読み込み指示部２６は、例えば、第１領域の末尾のアドレスを第１領域管理テーブルのｂａｓｅアドレスとサイズを加算することにより算出し、ステップＳ５０８の処理に用いる。
【００９６】
そして、読み込み指示部２６は、第２領域の先頭アドレスから、読み込み残データを読み込むことをＯＳ１１に指示する（ステップＳ５０９）。読み込み指示部２６は、例えば、第２領域の先頭アドレスと読み込み残データサイズをＯＳ１１に指示する。読み込み残データサイズは、読み込み対象データサイズから、第１領域で読み込むサイズを減算した値である。読み込み指示部２６は、例えば、第１領域管理テーブルのリンクＩＤと第２領域管理テーブルのリンクＩＤに基づいて、第１領域に対応する第２領域を特定する。そして、読み込み指示部２６は、第２領域管理テーブルから、その第２領域の先頭アドレス（Ｂａｓｅアドレス）を取得し、ステップＳ５０９の処理に用いる。
【００９７】
ＯＳ１１は、読み込み指示部２６からの指示に基づいて、読み込み対象データの読み込みを行う。
【００９８】
出力部２７は、第２領域からのデータの読み込みに関する情報を出力する（ステップＳ５１０）。出力部２７は、例えば、図９に示す情報を生成して、表示装置２に出力する、または所定の領域に記憶する。
【００９９】
ステップＳ５０６でＹＥＳの場合、読み込み指示部２６は、第２領域内における新たな読み込み先頭アドレスから読み込み対象データを読み込むことＯＳ１１に指示する（図１５のステップＳ５１１）。読み込み判定部２５は、新たな読み込み先頭アドレスを下記式により算出して、ステップＳ５１１の処理に用いる。
新たな読み込み先頭アドレス＝ｏｆｆｓｅｔ２−第１領域のサイズ＋第２領域のｂａｓｅアドレス
【０１００】
読み込み指示部２６は、例えば、第１領域管理テーブルのリンクＩＤと第２領域管理テーブルのリンクＩＤに基づいて、第１領域に対応する第２領域を特定する。そして、読み込み指示部２６は、第２領域管理テーブルから、その第２領域のＢａｓｅアドレスを取得し、上記式に用いる。
【０１０１】
ＯＳ１１は、読み込み指示部２６からの指示に基づいて、読み込み対象データの読み込みを行う。
【０１０２】
読み込み指示部２６は、ステップＳ５１１において、例えば、読み込み先頭アドレスが記憶されていたレジスタの値を、新たな読み込み先頭アドレスに書き換えてもよい。
【０１０３】
出力部２７は、第２領域からのデータの読み込みに関する情報を出力する（ステップＳ５１２）。出力部２７は、例えば、図９に示す情報を生成して、表示装置２に出力する、または所定の領域に記憶する。
【０１０４】
以上のように、読み込み指示部２６は、読み込み対象領域の少なくとも一部が第２領域に含まれる場合、ＯＳ１１に読み込み対象領域を示し、読み込みを行う指示を送る。書き込み監視処理において第２領域管理テーブルが記録されているため、読み込み指示部２６は、読み込み対象領域が第２領域を含む場合であっても、適切な領域をＯＳ１１に指示することができる。
【０１０５】
以下、実施例について説明する。
図１６は、実施例における監視対象アプリケーションに用いられるソースコードである。図１６に示すソースコードは、Ｃ言語で記述されているが、監視対象アプリケーションに用いられるソースコードは、他のプログラミング言語で記述されていてもよい。なお、図１６に示すソースコードは、監視対象アプリケーションに用いられるソースコードの一部である。また、図１６に示す「／／メモリ確保」、「／／メモリ書き込み」、および「／／メモリ読み込み」は、処理内容を説明するためのコメントであり、コンパイルの際にスキップされる。
【０１０６】
本実施例では、監視対象アプリケーションが、メモリ確保処理において、ハンドル「ｇ_ｈＭｅｍ１００」、「ｇ_ｈＭｅｍ２００」、および「ｇ_ｈＭｅｍ３００」を用いてそれぞれ１００ｂｙｔｅのメモリを確保する（１−１、１−２、１−３）。
【０１０７】
また、監視対象アプリケーションは、メモリ書き込み処理において、ハンドル「ｇ_ｈＭｅｍ１００」に対応するメモリに３００ｂｙｔｅのデータを書き込む（１−４）。また、監視対象アプリケーションは、ハンドル「ｇ_ｈＭｅｍ２００」に対応するメモリに２５０ｂｙｔｅのデータを書き込む（１−５）。
【０１０８】
また、監視対象アプリケーションは、メモリ読み込み処理において、ハンドル「ｇ_ｈＭｅｍ１００」に対応する第１領域のＢａｓｅアドレスに２８０を加算したアドレスから１０ｂｙｔｅのデータを読み込む（１−６）。監視対象アプリケーションは、メモリ読み込み処理において、ハンドル「ｇ_ｈＭｅｍ２００」に対応する第１領域のＢａｓｅアドレスに１８０を加算したアドレスから３０ｂｙｔｅのデータを読み込む（１−７）。
【０１０９】
図１７は、実施例におけるメモリ確保処理に関するアセンブラコードを示す図である。図１７に示すソースコードは、アセンブラ解析により得られたコードであり、図１６の１−１、１−２、および１−３に対応している。「ｒａｘ」は、メモリ確保の際に用いられるレジスタの一例であり、他のレジスタが用いられてもよい。なお、図１７に示すソースコードは、メモリ確保処理に関する全ソースコードではなく、一部のソースコードが省略されている。
【０１１０】
図１８は、実施例のメモリ確保処理におけるトレーステーブルを示す図である。記録部２２は、図１７の２−１に示す処理が行われた際に、図１８（ａ）に示すように、ハンドル名「ｇ_ｈＭｅｍ１００」とレジスタ名「ｒａｘ」とを対応付けて記録する。
【０１１１】
記録部２２は、図１７の２−２に示す処理が行われた際に、図１８（ｂ）に示すように、ハンドル名「ｇ_ｈＭｅｍ２００」とレジスタ名「ｒａｘ」とを対応付けて記録する。また、記録部２２は、ハンドル「ｇ_ｈＭｅｍ１００」に対応付けられたレジスタ名「ｒａｘ」を削除する。
【０１１２】
記録部２２は、図１７の２−３に示す処理が行われた際に、図１８（ｃ）に示すように、ハンドル名「ｇ_ｈＭｅｍ３００」とレジスタ名「ｒａｘ」とを対応付けて記録する。また、記録部２２は、ハンドル名「ｇ_ｈＭｅｍ２００」に対応付けられたレジスタ名「ｒａｘ」を削除する。
【０１１３】
図１９は、実施例における第１領域管理テーブルを示す図である。図１６、図１７に示すプログラムによりメモリ確保が実行された場合に、記録部２２は、図１９に示す第１領域管理テーブルを記録する。なお、図１９に示す例では、説明を容易にするために、Ｂａｓｅアドレスとして、１６進数によるアドレスではなく所定アドレスからの距離を１０進数で示したアドレスを用いている。例えば、「Ａｄｄｒ１００」は、所定アドレスからの距離が１００ｂｙｔｅであるアドレスを示す。例えば、「Ａｄｄｒ２００」は、所定アドレスからの距離が２００ｂｙｔｅであるアドレスを示す。例えば、「Ａｄｄｒ３００」は、所定アドレスからの距離が３００ｂｙｔｅであるアドレスを示す。
【０１１４】
図２０は、実施例における確保されたメモリ領域を示す図である。図２０に示す「第１領域Ａ」は、ハンドル「ｇ_ｈＭｅｍ１００」に対応する第１領域である。「第１領域Ｂ」は、ハンドル「ｇ_ｈＭｅｍ２００」に対応する第１領域である。「第１領域Ｃ」は、ハンドル「ｇ_ｈＭｅｍ３００」に対応する第１領域である。
【０１１５】
図２１は、実施例におけるメモリ書き込み処理に関するアセンブラコードを示す図である。図２１に示すソースコードは、アセンブラ解析により得られたコードであり、図１６の１−４、１−５に対応している。なお、図２１に示すソースコードは、メモリ書き込み処理に関する全ソースコードではなく、一部のソースコードが省略されている。例えば、図２１に示すソースコードでは、「Ｆｕｎｃ  ｗｒｉｔｅｍｅｍ」の後に、書き込み先頭アドレスに書き込み対象データサイズを加算した値をレジスタｒｃｘに書き込むコードが記述されているとするが、図示を省略している。
【０１１６】
図２２は、実施例のメモリ書き込み処理におけるトレーステーブルを示す図である。記録部２２は、図２１の３−１に示す処理が行われた際に、図２２（ａ）に示すように、ハンドル名「ｇ_ｈＭｅｍ１００」とレジスタ名「ｒｃｘ」とを対応付けて記録する。そして、ｒｃｘに、書き込み先頭アドレスに書き込み対象データサイズを加算した値「４００」が書き込まれたとする。書き込み判定部２３は、図２１の３−３に示す処理が行われた際に、第１領域管理テーブルにおいて「ｇ_ｈＭｅｍ１００」に対応付けられたレジスタｒｃｘの値を取得する。
【０１１７】
書き込み判定部２３は、取得したレジスタｒｃｘの値と、第１領域管理テーブルにおいてｇ_ｈＭｅｍ１００に対応付けられているＢａｓｅアドレスとの差分であるｏｆｆｓｅｔ１を以下のように算出する。
ｏｆｆｓｅｔ１＝４００−１００＝３００
【０１１８】
ｏｆｆｓｅｔ１は、書き込み対象ハンドルのサイズである１００より大きいため、書き込み判定部２３は、書き込み対象データを第１領域内に書き込み可能ではないと判定する。
【０１１９】
書き込み指示部２４は、ｏｆｆｓｅｔ１から書き込み対象ハンドルの第１領域のサイズである「１００ｂｙｔｅ」を減算したサイズ「２００ｂｙｔｅ」の第２領域を新たに確保することをＯＳ１１に指示する。さらに、書き込み指示部２４は、書き込み対象データの一部分を第１領域に書き込み、残りの部分を第２領域に書き込むことを、ＯＳ１１に指示する。
【０１２０】
記録部２２は、図２１の３−２に示す処理が行われた際に、図２２（ｂ）に示すように、書き込み対象ハンドル「ｇ_ｈＭｅｍ２００」とレジスタ名「ｒｃｘ」とを対応付けて記録する。また、記録部２２は、書き込み対象ハンドル「ｇ_ｈＭｅｍ１００」に対応付けられたレジスタｒｃｘを削除する。そして、レジスタ「ｒｃｘ」に、書き込み先頭アドレスに書き込み対象データサイズを加算した値「４５０」が書き込まれたとする。書き込み判定部２３は、図２１の３−３に示す処理が行われた際に、第１領域管理テーブルにおいて書き込み対象ハンドル「ｇ_ｈＭｅｍ２００」に対応付けられたレジスタ「ｒｃｘ」の値を取得する。
【０１２１】
書き込み判定部２３は、取得したレジスタ「ｒｃｘ」の値と、第１領域管理テーブルにおいてハンドル「ｇ_ｈＭｅｍ２００」に対応付けられているＢａｓｅアドレスとの差分であるｏｆｆｓｅｔ１を以下のように算出する。
ｏｆｆｓｅｔ１＝４５０−２００＝２５０
【０１２２】
ｏｆｆｓｅｔ１は、書き込み対象ハンドルの第１領域のサイズである１００より大きいため、書き込み判定部２３は、書き込み対象データを第１領域内に書き込み可能ではないと判定する。
【０１２３】
書き込み指示部２４は、ｏｆｆｓｅｔ１から書き込み対象ハンドルのサイズを減算したサイズ「１５０ｂｙｔｅ」の第２領域を新たに確保することをＯＳ１１に指示する。さらに、書き込み指示部２４は、書き込み対象データの一部分を第１領域に書き込み、残りの部分を第２領域に書き込むことを、ＯＳ１１に指示する。
【０１２４】
図２３は、実施例における書き込み処理後の第２領域管理テーブルと第１領域管理テーブルとを示す図である。図２３（ａ）は、図１６、図２１に示すプログラムによりデータ書き込みが実行された際に、記録部２２が作成する第２領域管理テーブルである。図２３（ｂ）は、図１６、図２１に示すプログラムによりデータ書き込みが実行された際に、記録部２２が更新する第１領域管理テーブルである。
【０１２５】
上述のように、書き込み指示部２４は、書き込み対象ハンドル「ｇ_ｈＭｅｍ１００」による書き込み処理において、第２領域を確保することをＯＳ１１に指示する。そして、記録部２２は、書き込み対象ハンドル「ｇ_ｈＭｅｍ１００」に対応する第２領域を示す情報として、リンクＩＤ「ＩＤ＿Ａ」、Ｂａｓｅアドレス「Ａｄｄｒ１０００」、およびサイズ「２００」をそれぞれ記録する。
【０１２６】
記録部２２は、第１領域管理テーブルに書き込み対象ハンドル「ｇ_ｈＭｅｍ１００」と対応付けて、第２領域管理テーブルに記録したリンクＩＤと同じリンクＩＤ「ＩＤ＿Ａ」を記録する。
【０１２７】
また、書き込み指示部２４は、書き込み対象ハンドル「ｇ_ｈＭｅｍ２００」による書き込み処理において、第２領域を確保することをＯＳ１１に指示する。そして、記録部２２は、書き込み対象ハンドル「ｇ_ｈＭｅｍ２００」に対応する第２領域を示す情報として、リンクＩＤ「ＩＤ＿Ｂ」、第２領域のＢａｓｅアドレス「Ａｄｄｒ１２００」、サイズ「１５０」をそれぞれ記録する。
【０１２８】
そして、記録部２２は、第１領域管理テーブルにおいて、書き込み対象ハンドル「ｇ_ｈＭｅｍ２００」と対応付けて、第２領域管理テーブルのリンクＩＤと同じリンクＩＤ「ＩＤ＿Ｂ」を記録する。
【０１２９】
図２４は、実施例におけるメモリ領域の拡張方法を示す図である。本実施例では、ハンドル「ｇ_ｈＭｅｍ１００」に対応する第１領域Ａと、新たに確保された第２領域Ａとが対応している。すなわち、書き込み処理において、第１領域Ａが拡張されて、ハンドル「ｇ_ｈＭｅｍ１００」に第１領域Ａおよび第２領域Ａが対応した状態となる。また、本実施例では、ハンドル「ｇ_ｈＭｅｍ２００」に対応する第１領域Ｂと、新たに確保された第２領域Ｂとが対応している。すなわち、書き込み処理において、第１領域Ｂが拡張されて、ハンドル「ｇ_ｈＭｅｍ２００」に第１領域Ｂおよび第２領域Ｂが対応した状態となる。
【０１３０】
図２５は、実施例におけるメモリ読み込み処理に関するアセンブラコードである。図２５に示すソースコードは、アセンブラ解析により得られたコードであり、図１６の１−６および１−７に対応している。なお、図２５に示すソースコードは、メモリ読み込み処理に関する全ソースコードではなく、一部のソースコードが省略されている。
【０１３１】
図２６は、実施例のメモリ読み込み処理におけるトレーステーブルを示す図である。記録部２２は、図２５の４−１に示す処理が行われた際に、図２６（ａ）に示すように、ハンドル「ｇ_ｈＭｅｍ１００」とレジスタ名「ｒｃｘ」を対応付けて記録する。そして、レジスタ「ｒｃｘ」に、読み込み先頭アドレスを示す値「Ａｄｄｒ３８０」が書き込まれたとする。
【０１３２】
読み込み判定部２５は、図２５の４−３に示す処理が行われた際に、トレーステーブルから、読み込み対象ハンドル「ｇ_ｈＭｅｍ１００」に対応付けられたレジスタ名「ｒｃｘ」を特定する。そして、読み込み判定部２５は、レジスタ「ｒｃｘ」に記憶されている読み込み先頭アドレス「Ａｄｄｒ３８０」を取得する。読み込み判定部２５は、図２５の４−４に示す処理が行われた際に、読み込み対象データサイズが記憶されたレジスタｒ８を特定し、ｒ８から読み込み対象データサイズ「１０」を取得する。
【０１３３】
読み込み判定部２５は、下記の式により、ｏｆｆｓｅｔ２を算出する。
ｏｆｆｓｅｔ２＝読み込み先頭アドレス−読み込み対象ハンドルのｂａｓｅアドレス＝３８０−１００＝２８０
【０１３４】
算出されたｏｆｆｓｅｔ２は、読み込み対象ハンドルについて確保された第１領域のサイズより大きいため、読み込み判定部２５は、読み込み対象領域の全範囲が第２領域に含まれていると判定する。
【０１３５】
読み込み指示部２６は、第２領域内における新たな読み込み先頭アドレスから読み込み対象データを取得することＯＳ１１に指示する。読み込み判定部２５は、新たな読み込み先頭アドレスを下記式により算出する。
新たな読み込み先頭アドレス＝ｏｆｆｓｅｔ２−第１領域サイズ＋第２領域のｂａｓｅアドレス＝２８０−１００＋１０００＝１１８０（Ａｄｄｒ１１８０）
【０１３６】
また、記録部２２は、図２１の４−２に示す処理が行われた際に、図２６（ｂ）に示すように、ハンドル「ｇ_ｈＭｅｍ２００」とレジスタ名「ｒｃｘ」を対応付けて記録する。記録部２２は、ハンドル「ｇ_ｈＭｅｍ１００」に対応付けられていたレジスタ名「ｒｃｘ」を削除する。そして、レジスタｒｃｘに、読み込み先頭アドレスを示す値「Ａｄｄｒ２８０」が書き込まれたとする。
【０１３７】
読み込み判定部２５は、図２５の４−３に示す処理が行われた際に、トレーステーブルから、読み込み対象ハンドル「ｇ_ｈＭｅｍ２００」に対応付けられたレジスタ名「ｒｃｘ」を特定し、ｒｃｘに記憶されている読み込み先頭アドレス「Ａｄｄｒ２８０」を取得する。読み込み判定部２５は、図２５の４−４に示す処理が行われた際に、読み込み対象データサイズが記憶されたレジスタｒ８を特定し、ｒ８から読み込み対象データサイズ「３０」を取得する。
【０１３８】
読み込み判定部２５は、下記の式により、ｏｆｆｓｅｔ２を算出する。
ｏｆｆｓｅｔ２＝読み込み先頭アドレス−読み込み対象ハンドルのｂａｓｅアドレス＝２８０−２００＝８０
【０１３９】
算出されたｏｆｆｓｅｔ２「８０」は、第１領域のサイズ「１００」より小さい。また、ｏｆｆｓｅｔ２と読み込み対象データサイズを加算した値「１１０」（８０＋３０）が第１領域のサイズ「１００」より大きい。よって、読み込み判定部２５は、読み込み対象領域の一部が第２領域に含まれていると判定する。
【０１４０】
読み込み指示部２６は、読み込み先頭アドレス「Ａｄｄｒ２８０」から第１領域の末尾のアドレス「３００」までデータを読み込むことをＯＳ１１に指示する。
【０１４１】
読み込み指示部２６は、第１領域管理テーブルにおいて読み込み対象ハンドル「ｇ_ｈＭｅｍ２００」に対応するリンクＩＤ「ＩＤ＿Ｂ」を参照し、第２領域管理テーブルでリンクＩＤ「ＩＤ＿Ｂ」に対応するＢａｓｅアドレス「Ａｄｄｒ１２００」を取得する。そして、読み込み指示部２６は、第２領域管理テーブルから取得した第２領域のＢａｓｅアドレス「Ａｄｄｒ１２００」から、読み込み残データを読み込むことをＯＳ１１に指示する。読み込み残データサイズは、読み込み対象データサイズ「３０」から、第１領域で読み込むサイズ「２０」を減算した値「１０」である。よって、読み込み指示部２６は、例えば、第２領域の先頭アドレス「Ａｄｄｒ１２００」と読み込み残データサイズ「１０」をＯＳ１１に指示する。
【０１４２】
図２７は、実施例の読み込み処理におけるメモリ領域を示す図である。図２７において、「ａ」は、ハンドル「ｇ_ｈＭｅｍ１００」による読み込みが行われる領域である。上述のように、読み込み指示部２６の指示により、ＯＳ１１は、新たな読み込み先頭アドレス「Ａｄｄｒ１１８０」からサイズ「１０」のデータを読み込む。
【０１４３】
なお、図２７に示す「ａ’」は、読み込み命令における読み込み先頭アドレスが、「Ａｄｄｒ３８０」であり、本実施形態の読み込み処理を行わなかった場合に読み込まれる領域である。監視対象アプリケーションからの命令には、第２領域に読み込み対象データが書き込まれていることが考慮されていない。よって、本実施形態の読み込み処理を行わなかった場合、図２７の「ａ’」のように、実際の読み込み対象データが記憶された領域とは異なる領域から読み込みが行われるおそれがある。
【０１４４】
また、例えば、読み込み命令における読み込み先頭アドレスの指定が、「Ａｄｄｒ１００＋８０」、「Ａｄｄｒ２００＋８０」、または「Ａｄｄｒ３００＋８０」であった場合、本実施形態の読み込み処理を行わなかった場合に読み込まれる領域は同じである。しかし、第２領域の確保が行われている場合、実際の読み込み対象データが記憶された領域は異なる可能性がある。
【０１４５】
図２７において、「ｂ１」および「ｂ２」は、ハンドル「ｇ_ｈＭｅｍ２００」による読み込みが行われる領域である。読み込み指示部２６は、読み込み先頭アドレス「Ａｄｄｒ２８０」から第１領域の末尾のアドレス「Ａｄｄｒ３００」まで領域「ｂ１」を読み込むことをＯＳ１１に指示する。さらに、読み込み指示部２６は、第２領域管理テーブルから取得した第２領域の先頭アドレス「Ａｄｄｒ１２００」から、読み込み残データサイズ「１０」の領域「ｂ２」を読み込むことをＯＳ１１に指示する。そして、ＯＳ１１は、図２７に示す「ｂ１」および「ｂ２」から、データの読み込みを行う。
【０１４６】
なお、上述の処理において、メモリ管理部１２は、ＯＳ１１によりレジスタに記憶された各種アドレスやデータサイズ等を取得するが、そのような例には限られない。例えば、メモリ管理部１２は、アプリケーション１５からＯＳに送られるコマンドを参照することにより各種アドレスやデータサイズ等を取得してもよい。すなわち、レジスタに各種アドレスやデータサイズ等が記憶されていない場合でも、メモリ管理部１２は、各種アドレスやデータサイズ等を取得することができる。
【０１４７】
次に、情報処理装置１のハードウェア構成の一例を説明する。
図２８は、情報処理装置１のハードウェア構成の一例を示す図である。図２８の例に示すように、情報処理装置１において、バス１００に、プロセッサ１１１とメモリ１１２と補助記憶装置１１３と通信インタフェース１１４と媒体接続部１１５と入力装置１１６と出力装置１１７とが接続される。
【０１４８】
プロセッサ１１１は、メモリ１１２に展開されたプログラムを実行する。実行されるプログラムには、実施形態における処理を行うメモリ管理プログラムが適用されてもよい。本実施形態における「レジスタ」は、例えば、プロセッサ１１１内の記憶回路であってもよい。
【０１４９】
メモリ１１２は、例えば、Random Access Memory(RAM)である。本実施形態における「メモリ」には、図２８におけるメモリ１１２が適用される。
【０１５０】
補助記憶装置１１３は、種々の情報を記憶する記憶装置であり、例えばハードディスクドライブや半導体メモリ等が適用されてもよい。補助記憶装置１１３に実施形態の処理を行うメモリ管理プログラムが記憶されていてもよい。
【０１５１】
通信インタフェース１１４は、Local Area Network（LAN）、Wide Area Network（WAN）等の通信ネットワークに接続され、通信に伴うデータ変換等を行う。出力部２７が他の情報処理装置等に情報を送信する場合、通信インタフェース１１４を介して、情報を送信する。
【０１５２】
媒体接続部１１５は、可搬型記録媒体１１８が接続可能なインタフェースである。可搬型記録媒体１１８には、光学式ディスク（例えば、Compact Disc(CD)やDigital Versatile Disc(DVD))、半導体メモリ等が適用されてもよい。可搬型記録媒体１１８に実施形態の処理を行うメモリ管理プログラムが記録されていてもよい。
【０１５３】
入力装置１１６は、例えば、キーボード、ポインティングデバイス等であり、ユーザからの指示及び情報等の入力を受け付ける。
【０１５４】
出力装置１１７は、例えば、表示装置、プリンタ、スピーカ等であり、ユーザへの問い合わせ又は指示、及び処理結果等を出力する。図１に示す表示装置２には、図２８に示す出力装置１１７が適用されてもよい。
【０１５５】
図１に示す管理情報記憶部１３は、メモリ１１２、補助記憶装置１１３または可搬型記録媒体１１８等により実現されてもよい。図１に示すメモリ管理部１２、および設定部１４は、メモリ１１２に展開されたメモリ管理プログラムをプロセッサ１１１が実行することにより実現されてもよい。
【０１５６】
メモリ１１２、補助記憶装置１１３および可搬型記録媒体１１８は、コンピュータが読み取り可能であって非一時的な有形の記憶媒体であり、信号搬送波のような一時的な媒体ではない。
【０１５７】
＜その他＞
本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で様々な変更、追加、省略が行われてもよい。
【符号の説明】
【０１５８】
１    情報処理装置
２    表示装置
１１    ＯＳ
１２    メモリ管理部
１３    管理情報記憶部
１４    設定部
１５−１〜１５−ｎ    アプリケーション
２１    検知部
２２    記録部
２３    書き込み判定部
２４    書き込み指示部
２５    読み込み判定部
２６    読み込み指示部
２７    出力部
１００    バス
１１１    プロセッサ
１１２    メモリ
１１３    補助記憶装置
１１４    通信インタフェース
１１５    媒体接続部
１１６    入力装置
１１７    出力装置
１１８    可搬型記録媒体
【図１】
2019139330.tif 000003
【図２】
2019139330.tif 000004
【図３】
2019139330.tif 000005
【図４】
2019139330.tif 000006
【図５】
2019139330.tif 000007
【図６】
2019139330.tif 000008
【図７】
2019139330.tif 000009
【図８】
2019139330.tif 000010
【図９】
2019139330.tif 000011
【図１０】
2019139330.tif 000012
【図１１】
2019139330.tif 000013
【図１２】
2019139330.tif 000014
【図１３】
2019139330.tif 000015
【図１４】
2019139330.tif 000016
【図１５】
2019139330.tif 000017
【図１６】
2019139330.tif 000018
【図１７】
2019139330.tif 000019
【図１８】
2019139330.tif 000020
【図１９】
2019139330.tif 000021
【図２０】
2019139330.tif 000022
【図２１】
2019139330.tif 000023
【図２２】
2019139330.tif 000024
【図２３】
2019139330.tif 000025
【図２４】
2019139330.tif 000026
【図２５】
2019139330.tif 000027
【図２６】
2019139330.tif 000028
【図２７】
2019139330.tif 000029
【図２８】
2019139330.tif 000030