(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-05-22
(45)【発行日】2023-05-30
(54)【発明の名称】半導体装置、制御方法およびプログラム
(51)【国際特許分類】
G06F 8/654 20180101AFI20230523BHJP
【FI】
G06F8/654
(21)【出願番号】P 2019121018
(22)【出願日】2019-06-28
【審査請求日】2022-05-13
(73)【特許権者】
【識別番号】000003193
【氏名又は名称】凸版印刷株式会社
(73)【特許権者】
【識別番号】000102728
【氏名又は名称】株式会社エヌ・ティ・ティ・データ
(74)【代理人】
【識別番号】100149548
【氏名又は名称】松沼 泰史
(74)【代理人】
【識別番号】100139686
【氏名又は名称】鈴木 史朗
(74)【代理人】
【識別番号】100169764
【氏名又は名称】清水 雄一郎
(74)【代理人】
【識別番号】100147267
【氏名又は名称】大槻 真紀子
(72)【発明者】
【氏名】荒井 和重
(72)【発明者】
【氏名】岩井 祐樹
【審査官】武田 広太郎
(56)【参考文献】
【文献】特開平04-052834(JP,A)
【文献】特開2010-113549(JP,A)
【文献】特開昭52-116029(JP,A)
【文献】米国特許出願公開第2004/0107416(US,A1)
【文献】特開平06-187143(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/654
(57)【特許請求の範囲】
【請求項1】
プログラムが記憶され、記憶されたデータの書き換えが不可能な第1記憶部と、
前記プログラムを実行する制御部と、
記憶されたデータの書き換えが可能な第2記憶部と、
前記第2記憶部に記憶される、前記プログラムにおけるエントリポイントの付加された関数モジュールの処理を置き換えるパッチを含むパッチモジュールと
を備え、
前記パッチモジュールにおける前記パッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する
場合には所定の第1のアドレスに、当該関数モジュールを置換する
場合には所定の第2のアドレスに、それぞ
れ設定されている
ことを特徴とする半導体装置。
【請求項2】
前記関数モジュールを前記パッチにより置換する場合、前記所定の
第2のアドレスが前記プログラムにおける当該関数モジュールを呼び出す関数の直後のコードであり、
一方、前記関数モジュールにおける所定の処理を前記パッチにより修正した後、当該関数モジュールの処理を継続する場合、前記所定の
第1のアドレスが前記エントリポイントの直後のアドレスである
ことを特徴とする請求項1に記載の半導体装置。
【請求項3】
前記関数モジュールを前記パッチにより置換する場合、前記リターン命令が参照するコールスタックにおける前記パッチの処理の終了後の戻り先が、前記プログラムにおける前記関数の直後のコードのアドレスに変更される
ことを特徴とする請求項2に記載の半導体装置。
【請求項4】
前記リターン命令における戻りアドレスが、前記所定の
第1のアドレスとして、前記関数の直後のコードのアドレスに設定されている
ことを特徴とする請求項2に記載の半導体装置。
【請求項5】
記憶されたデータの書き換えが不可能な第1記憶部に記憶された、エントリポイントが付加された関数モジュールを含むプログラムを制御部が実行する際、
前記エントリポイントにより呼び出されるパッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する
場合には所定の第1のアドレスに、当該関数モジュールを置換する
場合には所定の第2のアドレスに、それぞ
れ設定されている
ことを特徴とする制御方法。
【請求項6】
記憶されたデータの書き換えが不可能な第1記憶部に記憶された、エントリポイントが付加された関数モジュールを含むプログラムをコンピュータに実行させる際、
前記コンピュータを、
前記エントリポイントにより呼び出されるパッチの各々における処理終了後の戻り先に処理を戻す手段
として機能させ、前記パッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する
場合には所定の第1のアドレスに、当該関数モジュールを置換する
場合には所定の第2のアドレスに、それぞ
れ設定されている
プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、半導体装置、制御方法およびプログラムに関する。
【背景技術】
【0002】
近年、IC(integrated circuit)カードが多くの業種で用いられており、ICカードに組み込まれるオペレーティング・プログラムやアプリケーション・プログラムも用途に応じて多種多様である。
これらのプログラムは、ICカードの作成時において、書き換えできないプログラムコード(以下、ROM(read only memory)コードと示す)として、マスクROMやフラッシュメモリなどに書き込まれている。
【0003】
上述したように、出荷時に書き込まれたプログラムの書き換えができないことにより、ROMコードとして書き込まれているプログラムに不具合が見つかった場合、このICカードの不具合を修正したプログラムが書き込まれたICカードと交換する必要がある。
近年、一枚のICカードに対して多くの機能を持たせる場合が多く、プログラムのコード数が多くなり、プログラムの動作に不具合を生じる割合が高くなっている。
【0004】
このため、ROMコードの修正が発生する可能性が高いと推定される箇所に、修正プログラム(以下、パッチと示す)の適用をチェックする入り口(以下、エントリポイント)を設ける。
そして、パッチプログラムを書き換え可能なフラッシュメモリやEEPROM(electrically erasable programmable read only memory)にロードしておき、ROMコードの置き換えが必要であるか否かを、上記エントリポイントにおいて判定して、不具合のあったROMコードをパッチプログラムで置き換えて、プログラムのROMコードの修正を行っている(例えば、特許文献1参照)。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
上述したように、不具合を解消するために修正する必要のあるプログラムにおける関数モジュールのROMコードに代え、パッチプログラムが実行される(以下、パッチ処理と示す)場合、プログラムにおける監修モジュールのROMコードに設けられたエントリポイントから、外部装置からロードしてフラッシュメモリやEEPROMに書き込まれたパッチプログラムが呼び出される。
【0007】
そして、エントリポイントから呼び出されたパッチによるパッチ処理が終了した後、プログラムにおける関数モジュールのROMコードに処理が戻される。
このとき、処理は、プログラムの関数モジュールのROMコードにおける、エントリポイントが記述された直後のコードに戻され、当該コードから処理が継続される。
【0008】
しかしながら、パッチで修正した関数モジュールの処理において、エントリポイントの直後に戻った後、パッチの処理から継続して関数モジュールのROMコードにおける処理が行われることで、パッチで修正した修正内容が無効となる場合がある。すなわち、パッチの処理と関数モジュールのROMコードとの処理に不整合が存在する場合、新たな不具合が発生する場合がある。
このため、関数モジュールのROMコードの修正に対するパッチ処理が十分に反映されず、結果的に関数モジュールの不具合が完全に修正することができない。
【0009】
本発明は、このような状況に鑑みてなされたもので、関数モジュールを修正するパッチ処理において、関数モジュールにおけるパッチ修正後の継続される処理に不具合を発生させることなく、パッチ修正が反映された処理を行うことが可能な半導体装置、制御方法およびプログラムを提供する。
【課題を解決するための手段】
【0010】
上述した課題を解決するために、本発明の一態様は、プログラムが記憶され、記憶されたデータの書き換えが不可能な第1記憶部と、前記プログラムを実行する制御部と、記憶されたデータの書き換えが可能な第2記憶部と、前記第2記憶部に記憶される、前記プログラムにおけるエントリポイントの付加された関数モジュールの処理を置き換えるパッチを含むパッチモジュールとを備え、前記パッチモジュールにおける前記パッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する場合には所定の第1のアドレスに、当該関数モジュールを置換する場合には所定の第2のアドレスに、それぞれ設定されている半導体装置である。
【0011】
また、本発明の一態様は、上記半導体装置であって、前記関数モジュールを前記パッチにより置換する場合、前記所定の第2のアドレスが前記プログラムにおける当該関数モジュールを呼び出す関数の直後のコードであり、一方、前記関数モジュールにおける所定の処理を前記パッチにより修正した後、当該関数モジュールの処理を継続する場合、前記所定の第1のアドレスが前記エントリポイントの直後のアドレスである。
【0012】
また、本発明の一態様は、上記半導体装置であって、前記関数モジュールを前記パッチにより置換する場合、前記リターン命令が参照するコールスタックにおける前記パッチの処理の終了後の戻り先が、前記プログラムにおける前記関数の直後のコードのアドレスに変更される。
【0013】
また、本発明の一態様は、上記半導体装置であって、前記リターン命令における戻りアドレスが、前記所定の第1のアドレスとして、前記関数の直後のコードのアドレスに設定されている。
【0014】
また、本発明の一態様は、記憶されたデータの書き換えが不可能な第1記憶部に記憶された、エントリポイントが付加された関数モジュールを含むプログラムを制御部が実行する際、前記エントリポイントにより呼び出されるパッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する場合には所定の第1のアドレスに、当該関数モジュールを置換する場合には所定の第2のアドレスに、それぞれ設定されている制御方法である。
【0015】
また、本発明の一態様は、記憶されたデータの書き換えが不可能な第1記憶部に記憶された、エントリポイントが付加された関数モジュールを含むプログラムをコンピュータに実行させる際、前記コンピュータを、前記エントリポイントにより呼び出されるパッチの各々における処理終了後の戻り先に処理を戻す手段として機能させ、前記パッチの各々における処理終了後のリターン命令における戻り先が、当該パッチを呼び出した前記関数モジュールの処理を継続する場合には所定の第1のアドレスに、当該関数モジュールを置換する場合には所定の第2のアドレスに、それぞれ設定されているプログラムである。
【発明の効果】
【0016】
以上説明したように、本発明によれば、関数モジュールを修正するパッチ処理において、関数モジュールにおけるパッチ修正後の継続される処理に不具合を発生させることなく、パッチ修正が反映された処理を行うことが可能な半導体装置、制御方法およびプログラムを提供する。
【図面の簡単な説明】
【0017】
【
図1】本発明の一実施形態による半導体装置1の構成例を示すブロック図である。
【
図2】EEPROM132のパッチパラメータ領域に書き込まれるパッチパラメータ350の構成例を示す図である。
【
図3】プログラム150におけるエントリポイントの付加された関数モジュールの記述例を示す図である。
【
図4】エントリポイントモジュールにおけるパッチ関数により実行されるパッチモジュールの記述例を示す図である。
【
図5】プログラム150におけるパッチ処理移行への動作例を説明するフローチャートである。
【
図6】関数モジュールにおけるエントリポイントに対応したパッチが存在しない場合のパッチ処理の動作を説明する概念図である。
【
図7】関数モジュールにおけるエントリポイントに対応したパッチが存在し、戻り方式が継続方式であるパッチ処理の動作を説明する概念図である。
【
図8】エントリポイントモジュール700から読み出されるパッチモジュール800におけるパッチからの戻り処理の動作例を説明するフローチャートである。
【
図9】関数モジュールにおけるエントリポイントに対応したパッチが存在し、戻り方式が置換方式であるパッチ処理の動作を説明する概念図である。
【発明を実施するための形態】
【0018】
以下、本発明の一実施形態について、図面を参照して説明する。
図1は、本発明の一実施形態による半導体装置1の構成例を示すブロック図である。
図1において、半導体装置1は、CPU(central processing unit)、メモリなどを構成する半導体素子を用いたIC(integrated circuit)を備え、情報を処理および記憶する装置である。
半導体装置1は、ICカード、SIM(subscriber identity module)カードなどである。
図1に示す半導体装置1は、制御部11とデータ入出力部12と記憶部13とを備える。
【0019】
制御部11は、CPU111を備え、記憶部13に記憶されているプログラム(例えば、アプリケーションプログラムや後述するモジュールなどのプログラム)を実行することで、所定の処理を行う。
データ入出力部12は、所定のプロトコルに従って外部装置(不図示)とのデータの送受信を行う。
【0020】
記憶部13は、ROM131、EEPROM132及びRAM(random access memory)133を有する。
ROM131には、半導体装置1の製造の際に書き込まれる、ROMコードの形態のプログラム150が記憶されている。このプログラム150は、例えば、公共系、金融系及び交通系などの業界あるいはグループの提供するICカードで利用するサービスの処理を行うアプリケーションプログラムなどである。ROM131において、プログラム150はROMコードで書き込まれているため、不具合を有する関数モジュールが含まれていても書き換えることができない。本実施形態において、ROMコードでプログラムが記載された書き換え不能のROMとしてマスクROM131を用いているが、マスクROMに換えてフラッシュメモリなどの不揮発性メモリを用いてもよい。
【0021】
このため、上記プログラム150には、不具合が発生して修正することが予想される、あるいはアプリケーションの関係で書き換えることを前提とする関数モジュールに対してエントリポイントを付加させてある。
本実施形態においては、上記エントリポイントを識別するエントリポイント識別情報が、機能番号及び個別番号との組合せで形成されている。
機能番号は、プログラム150における関数モジュールの各々を機能(例えば、暗号機能、通信機能、数値計算機能などの各種機能)別に分類した機能グループを識別するグループ情報である。
個別番号は、機能番号が示す各々の機能グループにおいて、この機能グループに含まれるパッチのそれぞれを個別に識別するパッチ情報である。
【0022】
本実施形態において、エントリポイント識別情報は2バイト(xxyyh)で記述されており、機能番号がxxhの1バイト、個別番号がyyhの1バイトである。
例えば、暗号機能の機能番号が01hであり、暗号機能の機能グループにおける個別番号が02hである場合、エントリポイント識別情報は、0102hで表される。
また、本実施形態においては、1バイトの機能番号と1バイトの個別番号とで、エントリポイント識別情報が2バイトとして説明している。しかしながら、プログラムに含まれる関数モジュール(エントリポイントが付加される関数モジュール)の機能の種類の数と、機能グループにおけるパッチの数とにより、エントリポイント識別情報のバイト数を任意に設定する。
【0023】
EEPROM132には、パッチモジュール250とパッチパラメータ350とが記憶されている。EEPROM132は、書き換え可能な不揮発性メモリであれば何れでもよく、例えばフラッシュメモリを用いた構成としてもよい。
ここで、制御部11は、データ入出力部12を介して、外部装置からパッチモジュール250が供給された場合、パッチモジュール250と、このパッチモジュール250に対応したパッチパラメータ350をEEPROM132に書き込んで記憶させる。
【0024】
パッチモジュール250は、プログラム150において、不具合などで修正を必要とする関数モジュール、言い換えると、関数モジュールに付加されたエントリポイントに対応するパッチプログラムが、その関数モジュールの機能の種類で分類されてそれぞれの機能グループ単位に記述されている(詳細は後述)。
【0025】
パッチパラメータ350は、少なくとも、パッチ有無フラグと、パッチ機能フラグと、パッチ領域先頭アドレスとである。パッチパラメータ350は、EEPROM132における予め設定されたアドレスが既知のパッチパラメータ領域に書き込まれている。
図2は、EEPROM132のパッチパラメータ領域に書き込まれるパッチパラメータ350の構成例を示す図である。
【0026】
パッチ有無フラグ301は、エントリポイントが付加された関数モジュールの各々において、置き換えるパッチが存在する関数モジュールが少なくとも1個以上あるか否かを示すフラグである。パッチ有無フラグは、例えば、置き換えるパッチが存在する関数モジュールが少なくとも1個以上ある場合「ON」であり、一方、置き換えるパッチが存在する関数モジュールが無い場合「OFF」である。
【0027】
パッチ機能フラグ302、303及び304の各々は、関数モジュールを機能の種類毎に分類した機能グループにおいて、置き換えるパッチが存在する関数モジュールが少なくとも1個以上あるか否かを示すフラグである。パッチ機能フラグ302、303及び304の各々は、例えば、それぞれに対応する機能グループ毎に置き換えるパッチが存在する関数モジュールが少なくとも1個以上ある場合「ON」であり、一方、置き換えるパッチが存在する関数モジュールが全く無い場合「OFF」である。例えば、パッチ機能フラグ302は、機能番号00hの示す、例えばメイン機能の機能グループに対応したフラグである。パッチ機能フラグ303は、機能番号01hの示す、例えば通信機能の機能グループに対応したフラグである。パッチ機能フラグ304は、機能番号02hの示す、例えば暗号機能の機能グループに対応したフラグである。
【0028】
パッチ領域先頭アドレス305は、EEPROM132におけるパッチモジュール250が書き込まれた記憶領域の先頭アドレスを示している。
【0029】
RAM133は、制御部11がプログラム150を実行する際のメインメモリとして用いられる。
【0030】
図3は、プログラム150におけるエントリポイントの付加された関数モジュールの記述例を示す図である。
図3において、プログラム150は、例えば、メイン関数モジュール500、関数モジュール600、エントリポイントモジュール700などを備えている。
メイン関数モジュール500には、所定のアプリケーションの機能を実行するために必要な関数501や502などの複数の関数が記述されている。
関数モジュール600は、制御部11が実際に実行する関数501の機能に対応した処理を示す実体のコードが記述されている。
【0031】
関数501にエントリポイントが設定されている場合、関数モジュール600には、エントリポイント関数601のコードが付加されている。
エントリポイント関数601は、エントリポイントモジュール700を呼び出して実行させる関数である。
エントリポイントモジュール700には、制御部11が実際に実行するエントリポイント関数601の機能に対応した処理を示す実体のコードが記述されている。エントリポイントモジュール700には、第1分岐処理701、機能番号抽出処理702、第2分岐処理703が記述されている。ここで、第1分岐処理701は、パッチ有無フラグがONか否かを判定する処理である。機能番号抽出処理702は、エントリポイント識別情報から機能番号を抽出する処理である。第2分岐処理703は、パッチ機能フラグがONか否かを判定する処理である。
第2分岐処理703には、パッチ機能フラグがONの場合に、パッチモジュール800(
図4参照)を実行させるパッチ関数704が記述されている。
【0032】
図1に戻り、制御部11は、関数501を実行する際、関数501に記述されている関数501の実体である関数モジュール600の記憶されたアドレス(マスクROM131におけるアドレス)を読み込み、関数モジュール600を実行する。ここで、実体とは、制御部11が実際に実行する関数501の機能が記述されたROMコードを示している。
そして、制御部11は、関数モジュール600がエントリポイント関数601を含む場合、エントリポイント関数601に記述されたエントリポイントモジュール700を呼び出すアドレスを読み込み、エントリポイントモジュール700のROMコードの処理を実行する。
【0033】
このとき、制御部11は、エントリポイントモジュール700に記述された第1分岐処理701の記述の処理により、EEPROM132のパッチパラメータ領域におけるパッチパラメータ350のパッチ有無フラグを参照する。
そして、制御部11は、パッチ有無フラグがONであるか否かの判定を行い、ONであれば機能番号抽出処理702の記述の処理を実行し、一方、パッチ有無フラグがOFFであれば、関数モジュール600に戻る処理(return(リターン)処理)を行い、関数モジュール600に記述された処理を実行する。
【0034】
また、制御部11は、パッチ有無フラグがONである場合、エントリポイントモジュール700に記述された機能番号抽出処理702の処理により、エントリポイント識別情報から機能番号を抽出する。
そして、制御部11は、EEPROM132におけるパッチパラメータ領域に記憶されているパッチパラメータ350において、抽出した機能番号に対応するパッチ機能フラグを参照する。
制御部11は、参照したパッチ機能フラグがONであるか否かの判定を行い、ONであればパッチ関数704に対応してパッチモジュール800の処理を実行し、一方、パッチ機能フラグがOFFであれば、関数モジュール600に戻り、関数モジュール600に記述された処理を実行する。
【0035】
制御部11は、EEPROM132において、パッチモジュール800が記憶された記憶領域の先頭アドレスであるパッチ領域先頭アドレス305を、パッチパラメータ350から読み出す。
そして、制御部11は、パッチ領域先頭アドレス305の領域に記憶されているパッチモジュール800に記述された処理を実行する。
【0036】
図4は、エントリポイントモジュール700におけるパッチ関数により実行されるパッチモジュールの記述例を示す図である。パッチモジュールは、プログラム150の不具合を修正する必要が生じた際、制御部11が外部装置からパッチモジュール800(パッチモジュール250)のコードをロードして、EEPROM132に、パッチパラメータ350とともに書き込んで記憶させる。
図4において、パッチモジュール800には、制御部11が実際に実行するパッチ関数704の入れ替えるべき関数モジュールに対するパッチ処理を示す実体のコードが記述されている。すなわち、パッチモジュール800には、機能番号及び個別番号抽出処理801、パッチ機能フラグ確認処理802、第3分岐処理803、エントリポイント修正処理804、戻り方式選択805、戻り処理(return)807、第3分岐処理808、エントリポイント修正処理809、戻り方式選択810、戻り処理811、パッチ機能フラグ確認処理812などが記述されている。
【0037】
機能番号及び個別番号抽出処理801は、エントリポイント識別情報から、エントリポイントに付与されている機能番号及び個別番号の各々を抽出する処理である。
パッチ機能フラグ確認処理802及び812の各々は、それぞれ機能番号02h、06hのパッチ機能フラグがONであるか否かの判定を行う。このパッチ機能フラグ確認処理は、関数モジュールを置き換えるパッチが少なくとも1個が存在する機能グループに対応して設けられている。
【0038】
第3分岐処理803及び808の各々は、それぞれエントリー識別情報から抽出された個別番号が01h、03hであるか否かを判定している。この第3分岐処理は、機能ブロックにおける関数モジュールと置き換えるパッチに対応した個数が設けられている。
エントリポイント修正処理804及び809の各々は、それぞれエントリー識別情報から抽出された個別番号が01h、03hであった場合に、関数モジュールとパッチとを置き換えるパッチ処理として記述されている。
【0039】
戻り方式選択805及び810の各々は、エントリポイント修正処理804、809それぞれのパッチ処理の後に、処理が戻される戻り先アドレスの設定処理が記述されている。
本実施形態においては、例えば継続方式及び置換方式の各々2通りの戻り方式がある。
ここで、継続方式は、パッチ処理が終了した後、パッチモジュール800を呼び出した関数モジュール600のエントリポイント関数601の直後のコードのアドレスを、パッチモジュール800のパッチからの戻り先として設定する。
【0040】
この継続方式においては、関数モジュールにおける変数の宣言及び初期化や定数の設定など、関数の処理を実行する前処理の後にエントリポイント関数601が配置される。すなわち、継続方式の場合には、関数モジュールで使用される変数の宣言や初期化あるいは定数の設定などが変更されることが予想されるため、エントリポイント関数601が上記前処理後に付加される。そして、変数の宣言や初期化あるいは定数の設定などがパッチにより修正され、エントリポイント関数601の直後のコードから関数モジュールの処理が実行される。
【0041】
一方、置換方式は、パッチ処理が終了した後、パッチモジュール800を呼び出した関数モジュール600ではなく、この関数モジュール600を呼び出した関数501の直後のコードのアドレスを、パッチモジュール800のパッチからの戻り先として設定する。この置換方式においても、継続方式と同様に前処理後に付加される。そして、関数モジュール600の全体(前処理を含めた)がパッチにより置換され、関数501の直後のコードからプログラム150の処理が実行される。
【0042】
継続方式の場合、return関数(リターン命令)によるコールスタック(コールツリー)の参照により、パッチモジュール800を呼び出した、関数モジュール600のエントリポイント関数601の直後のコードのアドレスが戻り先となる。
このため、継続方式においては、特にパッチモジュール800におけるパッチからの戻り先を設定する必要が無い。
【0043】
一方、置換方式の場合、パッチモジュール800のパッチからのパッチ処理後の戻り先としては、メイン関数モジュール500における関数501の直後のコードのアドレスが設定される必要がある。
このため、コールスタックに関数モジュールを呼び出す毎に積まれる、return関数によって読み出される戻りアドレスが操作(変更)される。例えばコールツリーを3階層分遡る、すなわち2階層分の戻りアドレスを読み出して削除することで、メイン関数モジュール500における関数501の直後のコードのアドレスを、パッチモジュール800におけるパッチの処理の終了後の戻り先とする。
また、return関数に対して、直接に、戻り先としてメイン関数モジュール500における関数501の直後のコードのアドレスを設定して、パッチモジュール800のパッチから、メイン関数モジュール500における関数501の直後のコードに戻るようにしてもよい。
【0044】
上述した継続方式及び置換方式の構成により、継続方式の構成の場合、パッチには関数モジュール600における前処理を修正するコードのみが記述されることでパッチのコードサイズの増加を抑制することができる。
一方、置換方式の構成の場合、関数モジュール600の処理を全てパッチにより置換され、関数モジュール600のエントリポイント関数601に戻るのではなく、メイン関数モジュール500の関数501の直後のコードに戻るため、関数モジュール600に対した行った修正が確実に反映される。
【0045】
すなわち、従来のように、関数モジュール600におけるエントリポイント関数601の直後に戻り、修正内容と不整合な関数モジュールの処理がパッチ修正後に行われ、このパッチ処理の内容が無効になることがなくなり、関数モジュール600に対する修正が反映されなくなる従来の問題を解消することができる。
【0046】
図1に戻り、制御部11は、機能番号及び個別番号抽出処理801の記述に対応して、引数として得られたエントリポイント識別情報から、対応するエントリポイントの機能番号及び個別番号の各々を抽出する。
次に、制御部11は、EEPROM132のパッチパラメータ領域におけるパッチパラメータ350において、抽出した機能番号に対応するパッチ機能フラグを参照する。
そして、制御部11は、抽出した機能番号に対応したパッチ機能フラグ確認処理、例えば、機能番号が02hである場合、パッチ機能フラグ確認処理802を実行する。一方、制御部11は、抽出した機能番号が06hである場合にパッチ機能フラグ確認処理812を実行する。
【0047】
制御部11は、抽出した機能番号に対応するパッチ機能フラグ確認処理を実行し、抽出した機能番号の示すパッチ機能フラグがONであるか否かの判定を行う。
そして、制御部11は、抽出した機能番号の示すパッチ機能フラグがONである場合、第3分岐処理803、808、…などを順次実行し、抽出した個別番号に対応する第3分岐処理の有無を判定する。例えば、抽出した機能番号が02hであり、機能番号02hのパッチ機能フラグがONである場合、制御部11は、順次、第3分岐処理803、805、…において、抽出した個別番号と一致する第3分岐処理があるか否かの判定を行う。
【0048】
このとき、制御部11は、個別番号が01hか否かの判定を行う第3分岐処理803において、抽出した個別番号が01hである場合、第3分岐処理803に記述されたエントリポイント修正処理804を実行する。
そして、パッチ処理としてのエントリポイント修正処理804の処理が終了した後、戻り方式選択805が実行される。
【0049】
この戻り方式選択805が継続方式として設定されている場合、制御部11は、戻り方式選択805の処理として特になにも行わず、return関数(return806)の記述に従い、コールスタックにおける戻り先のアドレスである、エントリポイントモジュール700におけるパッチ関数704に戻り、パッチ関数704の戻り先のアドレスである関数モジュール600におけるエントリポイント関数601の直後のコードに戻り、当該コードから以降の関数モジュール600におけるコードの処理を継続して実行する。そして、制御部11は、関数モジュール600の処理が終了した後、メイン関数モジュール500の関数501の直後のコードに戻る。
【0050】
一方、戻り方式選択805が置換方式として設定されている場合、制御部11は、戻り方式選択805の処理として、コールスタックを処理して戻り先アドレスをメイン関数モジュール500の関数501の直後のコードに戻る。
このため、置換方式によって、関数モジュール600におけるエントリポイント関数601以降のコードの処理を行わず、パッチ処理を行った後、メイン関数モジュール500における関数501の直後のコードに戻るため、関数モジュール600がパッチに置換される。
【0051】
また、制御部11は、個別番号が03hか否かの判定を行う第3分岐処理808において、抽出した個別番号が03hである場合、第3分岐処理808に記述されたエントリポイント修正処理809を実行する。
一方、制御部11は、抽出した個別番号に対応する第3分岐処理が存在しない場合、メイン関数モジュール500に戻り、関数モジュール600の機能処理をコード記述に対応して実行する。
【0052】
上述したように、本実施形態は、関数モジュール600のエントリポイント関数601により、エントリポイントモジュール700を介して呼び出されたパッチモジュール800におけるパッチから戻る際の戻り先のアドレス設定の方式が、関数モジュール600の修正部分に対応して継続方式及び置換方式の各々として2通り用意されている。
これにより、本実施形態によれば、関数モジュール600に対する修正処理を行うコードの位置あるいは置き換え範囲に対応して、パッチモジュール800におけるパッチからの戻り先のアドレスを、パッチに記述される戻り方式選択のコードにより任意に設定することができ、置き換える際のパッチのサイズを小さくしたり、関数モジュールに対する修正処理の反映を確実とし、さらに修正を行った関数モジュールに関わる機能の処理速度を向上させることができる。
【0053】
すなわち、本実施形態によれば、継続方式及び置換方式により戻り先のアドレスが任意に設定可能な構成により、継続方式による戻り方式選択処理においては、例えば、パッチには関数モジュール600における前処理を修正するコードのみが記述され、パッチモジュール800における継続方式に対応する修正を行うパッチのコードサイズの増加を抑制することができる。
一方、置換方式による戻り方式選択処理においては、関数モジュール600のエントリポイント関数601の直後に戻るのではなく、メイン関数モジュール500の関数501の直後のコードに戻るため、関数モジュール600の処理の全てがパッチにより置換され、パッチ処理により関数モジュール600に対して行った修正が確実に反映させることができる。
【0054】
すなわち、従来のように、関数モジュール600におけるエントリポイント関数601の直後に戻り、修正内容と不整合な関数モジュールの処理がパッチ修正後に行われ、このパッチ処理の内容が無効になることがなくなり、関数モジュール600に対する修正が反映されなくなる従来の問題を解消することができる。
【0055】
また、本実施形態によれば、第1分岐処理により、メイン関数モジュール500においてエントリポイントが付加された関数の関数モジュールの中に、パッチと置き換える関数モジュールが少なくとも1個以上あるか否かをパッチ有無フラグで確認するため、置き換えを行う関数モジュールが無い場合、従来のようにテーブルを参照してエントリポイントに対応するパッチの有無を、テーブルのエントリポイント毎に確認する必要が無く、プログラムの処理速度を向上させることができる。
【0056】
また、本実施形態によれば、関数モジュールの機能の種類毎の機能グループに分類する機能番号と、機能グループ内におけるパッチを識別する個別番号とを組み合わせ、各エントリポイントを識別するエントリポイント識別情報を構成しているため、エントリポイント毎にそれぞれの属する機能グループに対応するパッチ機能フラグにより、パッチと置き換える関数モジュールが少なくとも1個以上あるか否かを判定するため、エントリポイントの属する機能ブロックの機能番号に対応したパッチ機能フラグがOFFである場合、従来のようにテーブルを参照してエントリポイントに対応するパッチの有無を、テーブルのエントリポイント毎に確認する必要が無く、プログラムの処理速度を向上させることができる。一方、エントリポイントの属する機能ブロックの機能番号に対応したパッチ機能フラグがONである場合、機能ブロックに属するパッチと置き換える関数モジュールに対応した個数の第3分岐処理により、エントリポイントの個別番号に対応するパッチ処理を検索する。
【0057】
また、本実施形態によれば、上記第1分岐処理、第2分岐処理及び第3分岐処理により、従来のようにエントリポイントに対するパッチの有無を、エントリポイントが存在する毎に、このエントリポイントと、テーブルにおける全てのエントリポイントの各々とを比較し、関数モジュールと置き換えるパッチを検索する処理を行わないため、プログラムにおける関数モジュールにおいてエントリポイントが付加された全ての関数モジュールと、当該関数モジュールと置き換えるパッチとの対応を示すテーブルを設ける必要がなくなり、エントリポイントが増加しても、従来のようにパッチのコード以外のパッチ処理に必要な記憶領域の増加を抑制することが可能となり、EEPROMなどの書き換え可能なメモリからなる記憶部における利用可能領域の圧迫を防止することができる。
【0058】
以下、
図5、
図6及び
図7を用いて、本実施形態における関数モジュールの修正を行うパッチ処理の動作を説明する、
図5は、メイン関数モジュール500におけるパッチ処理移行への動作例を説明するフローチャートである。
図6は、関数モジュールにおけるエントリポイントに対応したパッチが存在しない場合のパッチ処理の動作を説明する概念図である。
図6(a)は、パッチパラメータにおけるパッチ有無フラグ、パッチ先頭アドレス及びパッチ機能フラグの設定を示している。
図6(b)は、メイン関数モジュール500、関数モジュール600及びエントリポイントモジュール700のコードの記述例を示している。
図7は、関数モジュールにおけるエントリポイントに対応したパッチが存在し、戻り方式が継続方式であるパッチ処理の動作を説明する概念図である。
図7(a)は、パッチパラメータにおけるパッチ有無フラグ、パッチ先頭アドレス及びパッチ機能フラグの設定を示している。
図7(b)は、メイン関数モジュール500、関数モジュール600、エントリポイントモジュール700及びパッチモジュール800のコードの記述例を示している。
【0059】
制御部11は、プログラム150を実行し、メイン関数モジュール500における関数501の実体である関数モジュール600を呼び出して処理を行う。このとき、制御部11は、エントリポイント関数601(エントリポイント)の検出を行う(ステップS1)。
制御部11は、エントリポイント関数601の処理において、エントリポイントモジュール700を呼び出す。制御部11は、EEPROM132におけるパッチパラメータ350を参照し、パッチ有無フラグを読み込む(ステップS2)。
【0060】
制御部11は、読み込んだパッチ有無フラグがONであるか否かの判定を行う(ステップS3)。このとき、制御部11は、読み込んだパッチ有無フラグがONである(
図7(a)の記載、パッチ領域先頭アドレスとして、例えば、012345hが記述されている)場合、処理をステップS4へ進める。
一方、制御部11は、読み込んだパッチ有無フラグがOFFである(
図6(a)の記載、パッチ領域先頭アドレスが記述されていない)場合、処理を終了する。すなわち、制御部11は、関数モジュール600に戻り、関数モジュール500における関数501の処理を行う。
上述したステップS2及びステップS3が第1分岐処理である。
【0061】
制御部11は、エントリポイント関数601から引数として与えられるエントリポイント識別情報、例えばエントリポイント識別情報0201hから、2バイトにおける上位1バイトの機能番号02hを抽出する(ステップS4)。
制御部11は、EEPROM132におけるパッチパラメータ350を参照し、機能番号に対応する、すなわち機能番号02hに対応するパッチ機能フラグを読み込み、機能グループにパッチがある(関数モジュールに対してパッチが適用されている)ことを確認する(ステップS5)。
【0062】
制御部11は、パッチ機能フラグがONか否かにより、処理中の関数モジュールの属する機能グループ内にパッチが適用されている関数モジュールが有るか否かの判定を行う(ステップS6)。このとき、制御部11は、パッチ機能フラグがONである(機能番号の示す機能グループ内の関数モジュールにパッチが適用されている)場合、処理をステップS7へ進める。一方、制御部11は、パッチ機能フラグがOFFである(機能番号の示す機能グループ内の関数モジュールにパッチが適用されていない)場合、処理を終了する。すなわち、制御部11は、エントリポイントモジュール700から関数モジュール600に戻り、関数モジュール600における関数501の処理を行う。
上述したステップS5及びステップS6が第2分岐処理である。
【0063】
制御部11は、パッチ関数704を実行し、EEPROM132におけるパッチパラメータ350を参照し、パッチ領域先頭アドレス(012345h)を読み込み、このパッチ先頭アドレスによりパッチモジュール800を呼び出して、パッチ処理(第3分岐処理を含む)を行う(ステップS7)。
【0064】
以下、
図8、
図7及び
図9を用いて、本実施形態における戻り方式によるパッチ処理第3分岐処理の動作を説明する、
図8は、エントリポイントモジュール700から読み出されるパッチモジュール800におけるパッチからの戻り処理の動作例を説明するフローチャートである。
図9は、関数モジュールにおけるエントリポイントに対応したパッチが存在し、戻り方式が置換方式であるパッチ処理の動作を説明する概念図である。
図9(a)は、パッチパラメータにおけるパッチ有無フラグ、パッチ先頭アドレス及びパッチ機能フラグの設定を示している。
図9(b)は、メイン関数モジュール500、関数モジュール600、エントリポイントモジュール700及びパッチモジュール800のコードの記述例を示している。
【0065】
制御部11は、エントリポイントモジュール700において、機能番号及び個別番号抽出処理801により、エントリポイントモジュール700から引数として与えられるエントリポイント識別情報0201hから、上位1バイトの02hを機能番号として、下位1バイトの01hを個別番号として抽出する(ステップS11)。
【0066】
制御部11は、EEPROM132におけるパッチパラメータ350を参照し、抽出した機能番号02hに対応するパッチ機能フラグを読み込む。制御部11は、抽出した機能番号02hに対応するパッチ機能フラグ確認処理802を行う(ステップS12)。
【0067】
制御部11は、機能番号02hに対応するパッチ機能フラグがONであるか否かにより、分岐がある(機能番号02hに対応する機能グループにおいて関数モジュールと置き換えるパッチがあり、個別番号を検索するという分岐がある)か否かの判定を行う(ステップS13)。このとき、制御部11は、機能番号02hに対応するパッチ機能フラグがONである(個別番号を検索するという分岐がある)場合、処理をステップS14へ進める。一方、制御部11は、パッチ機能フラグがOFFである(個別番号を検索するという分岐がない)場合、処理を終了する。すなわち、制御部11は、パッチモジュール800から、エントリポイントモジュール700を介して関数モジュール600に戻り、関数モジュール600における関数501の処理を行う。
【0068】
制御部11は、パッチ機能フラグ確認処理802における第3分岐処理を順次行い、抽出した個別番号01hの第3分岐処理803の有無、すなわちパッチを適用するという分岐が有るかを確認する(ステップS14)。このとき、制御部11は、パッチを適用するという分岐としての第3分岐処理803がある場合、処理をステップS16へ進める。一方、制御部11は、パッチを適用するという分岐としての第3分岐処理803がない場合、処理を終了する。すなわち、制御部11は、パッチモジュール800から、エントリポイントモジュール700を介して関数モジュール600に戻り、関数モジュール600における関数501の処理を行う。
【0069】
制御部11は、関数モジュール600におけるエントリポイントに対応したパッチ処理、すなわち関数モジュール600におけるコードの修正処理を行う(ステップS15)。
【0070】
そして、制御部11は、マスクROM131におけるメイン関数モジュール500または関数モジュール600のいずれのROMコードに戻るかを判定するため、戻り方式の選択処理を行う(ステップS16)。
このとき、制御部11は、戻り方式として継続方式が設定されている(
図7)場合、戻り先アドレスがコールスタックに記載されたアドレスであるため、return関数がコールスタックにおけるアドレス、すなわち、エントリポイントモジュール700のパッチ関数704の直後に戻る。
【0071】
同様に、制御部11は、エントリポイントモジュール700のreturn関数がコールスタックに記載されたアドレスが示す関数モジュール600におけるエントリポイント関数601の直後のコードに戻る。そして、制御部11は、エントリポイント関数601の直後のコードから継続して、当該関数モジュールのコードの処理を行い、return関数がコールスタックにおけるアドレス、すなわち、メイン関数モジュール500の関数501の直後に戻る。
【0072】
一方、制御部11は、戻り方式として置換方式が設定されている(
図9)場合、戻り先アドレスがコールスタックに記載されたアドレスではなく、メイン関数モジュール500における関数501の直後のアドレスであるため、コールスタックにおいて戻り先として格納されているアドレスの変更処理を行う。このとき、制御部11は、置換方式によるコード記述に従い、エントリポイントモジュール700におけるパッチ関数704の直後のコードのアドレス、関数モジュール600におけるエントリポイント関数601の直後のコードのアドレスを削除する。
【0073】
これにより、制御部11は、コールスタックの次の戻り先のアドレスをメイン関数モジュール500の関数501の直後のアドレスに変更する。そして、制御部11は、エントリポイントモジュール700のパッチにおけるreturn関数を実行し、コールスタックに記載されたアドレスが示すメイン関数モジュール500における関数501の直後のコードに戻る。この処理により、関数モジュール600のコードがパッチモジュール800のコードに置換される置換方式のパッチ処理が行われる。
【0074】
以上、この発明の実施形態を図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【符号の説明】
【0075】
1…半導体装置
11…制御部
12…データ入出力部
13…記憶部
111…CPU
131…マスクROM
132…EEPROM
133…RAM
150…プログラム
250,800…パッチモジュール
350…パッチパラメータ
500…メイン関数モジュール
600…関数モジュール
700…エントリポイントモジュール