JP2009015428A - プログラム更新方法、情報処理装置、プログラムおよび記録媒体 - Google Patents

プログラム更新方法、情報処理装置、プログラムおよび記録媒体 Download PDF

Info

Publication number
JP2009015428A
JP2009015428A JP2007174068A JP2007174068A JP2009015428A JP 2009015428 A JP2009015428 A JP 2009015428A JP 2007174068 A JP2007174068 A JP 2007174068A JP 2007174068 A JP2007174068 A JP 2007174068A JP 2009015428 A JP2009015428 A JP 2009015428A
Authority
JP
Japan
Prior art keywords
plug
kernel
code
writing
jump
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2007174068A
Other languages
English (en)
Other versions
JP4931711B2 (ja
Inventor
Takashi Ikebe
隆 池邉
Satoshi Hinomura
聡 日野村
Masahiko Noguchi
昌彦 野口
Tetsuya Iwata
哲弥 岩田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nippon Telegraph and Telephone Corp
Original Assignee
Nippon Telegraph and Telephone Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nippon Telegraph and Telephone Corp filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2007174068A priority Critical patent/JP4931711B2/ja
Publication of JP2009015428A publication Critical patent/JP2009015428A/ja
Application granted granted Critical
Publication of JP4931711B2 publication Critical patent/JP4931711B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

【課題】カーネルに対してもバグ修正のプラグインをライブパッチで実現することを可能にしたプログラム更新方法を提供する。
【解決手段】カーネルの修正部分に対応するモジュールであるプラグをカーネルに導入するためのプログラム更新方法であって、プラグをカーネルの空き領域に書き込むステップと、プラグを導入するための手順を除くカーネルの実行を停止させるステップと、修正部分のコードを、修正部分においてプラグに手順をジャンプさせるためのジャンプコードに書き換えるステップとを有するものである。
【選択図】図1

Description

本発明は、高信頼性を要求されるネットワークサービスを提供するための、プログラムを修正するモジュールであるプラグをOS(Operating System)の基本機能を備えたソフトウェアプログラムであるカーネルにロード、またはカーネルからアンロードするためのプログラム更新方法、情報処理装置、その方法をコンピュータに実行させるためのプログラム、および、コンピュータに読み取り可能な記録媒体に関する。
ネットワークサービスを提供するシステムには極めて高い信頼性、すなわち長期間にわたって連続して稼動し続けるという性能(これを可用性という)が要求される。具体的に説明すると、ネットワークサービスでは24時間365日連続してサービスを提供し、典型的に年間のサービス可用性が99.999%以上であることが要求される。
このため、従来は専用システムを用いて可用性を確保してきた。しかし、専用システムはコストが高く、安価にサービスの提供ができないという問題があった。
そこで、x86アーキテクチャのハードウェアやオープンソースOSであるLinux(登録商標)など、汎用のハードウェアや汎用のOSがシステムに用いられるようになってきた。そのため、汎用のハードウェアや汎用のOSを用いたシステムで可用性を確保することが課題になっている。
一般に、多くのソフトウェアにはバグが存在する。バグ修正の際にはプロセスの再起動が必要なため、バグ修正の度にサービスを停止せざるを得ず、これが可用性を低下させる原因になっていた。そこで、プロセスのバグ修正を、サービスを停止することなく行い得ることが必要となっている。
従来の専用OSは、プロセスのメモリ上のコードを直接修正する技術(以下では、この技術をライブパッチ技術、または、単にライブパッチと称する)を有していた。汎用OSであるLinuxでも、非特許文献1に示すように、アプリケーションのプロセスを終了・再起動させることなく、バグ修正を可能にするライブパッチ技術が開発されるに至っている。
Linuxでは、カーネルと、カーネルの管理の下で動作するアプリケーションとからなる。非特許文献1はアプリケーションに関するプラグのライブパッチ技術を開示している。
アプリケーションに対してライブパッチを行うには、ライブパッチを実行する管理プロセス(プロセスA)と修正ターゲット(プロセスB)が必要である。ライブパッチは、システム管理者がプロセスAにプラグ情報やプロセスBの情報を入力し、プロセスBのメモリ空間に適切なタイミングでアクセスし、コードを修正する方法で行われる。
この方法を実現するには、
(1)修正ターゲット(プロセスB)のメモリ空間へのアクセスができること、
(2)修正ターゲット(プロセスB)のメモリ空間上のコードが修正できること、
(3)修正ターゲット(プロセスB)のメモリ空間へ適切なタイミングでアクセスできること、
が必要になる。
Linuxにおいては、カーネルがプロセスのメモリ空間を管理し、実際の物理的なメモリアドレスを個々のプロセス固有のメモリ領域に割り振っている。これにより、個々のプロセスは自プロセスに割り振られたメモリ空間へ仮想アドレス番地でアクセスが可能になると共に、他のプロセスが持つアドレス空間へのアクセスが制限される。
そこで、プロセスAがプロセスBのメモリ空間にアクセスできるようにするため、カーネルのメモリ管理を変更し、カーネルに新たな任意のメモリ空間へのアクセスを許容するインターフェイスを定義することで実現している(上記(1)を実現)。
コードの修正は、分岐命令上書きによる変更を用いることで実現している(上記(2)の実現)。呼び出される関数を修正する場合、修正する関数の先頭番地に新たな分岐命令を書き込めば、新規領域にロードされた修正後の関数へ分岐させることができる。
修正するタイミングは、修正対象の関数および変数へのアクセスが修正対象のプロセス・スレッドから行われていないタイミングで行うことが必要である。そこで、修正対象プロセス・スレッドをライブパッチで行う直前に、スケジューリングの対象外とし、プロセスの状態がライブパッチ可能かどうかを判断した上で行うことで、修正するタイミングを確保している(上記(3)の実現)。
以上、説明したように、Linuxにおいても、アプリケーションのバグ修正を、サービスを停止することなく行い得る。
池辺 他、「ネットワークサービス提供に向けたLinuxOSの高可用化ライブパッチ技術」、信学技報 NS2005−50 p.49−52(2005)電子情報通信学会
上記した方法は、カーネルによって管理されているアプリケーションについてのライブパッチにのみ適用可能であって、カーネルのバグ修正のライブパッチには適用できないという問題があった。
本発明は上述したような従来の技術が有する問題点を解決するためになされたものであり、カーネルに対してもバグ修正のプラグインをライブパッチで実現することを可能にしたプログラム更新方法、情報処理装置、プログラム、および、コンピュータに読み取りが可能な記録媒体を提供することを目的とする。
上記目的を達成するための本発明のプログラム更新方法は、カーネルの修正部分に対応するモジュールであるプラグを前記カーネルに導入するためのプログラム更新方法であって、
前記プラグを前記カーネルの空き領域に書き込むステップと、
前記プラグを前記空き領域に書き込んだ後、前記プラグを導入するための手順を除く前記カーネルの実行を停止させるステップと、
一部を除く前記カーネルの実行を停止させた後、前記修正部分のコードを、前記修正部分において前記プラグに手順をジャンプさせるためのジャンプコードに書き換えるステップと、
を有するものである。
本発明では、新たにプラグをロードしてそれを有効にするための専用スレッドをカーネルに設けていれば、その専用スレッドのみを実行可能とし、他のスレッドを停止する。これにより、専用スレッド以外の修正部分を含むカーネルが一時停止することになるため、メモリの書き換え中に該当部分が実行されることがない。
また、本発明のプログラム更新方法は、カーネルの修正部分に対応するモジュールであるプラグを前記カーネルで無効化するためのプログラム更新方法であって、
前記プラグを無効化するための手順を除く前記カーネルの実行を停止させるステップと、
一部の手順を除く前記カーネルの実行を停止させた後、前記修正部分の処理を有効にするために、前記プラグの処理を実行可能にするために書き込まれたジャンプコードを前記修正部分のコードに書き戻すステップと、
を有するものである。
本発明では、カーネル中の修正対象部分が実行されないようにバイパスを設けている。バイパスに該当するプラグとジャンプコードをカーネルの空き領域に書き込み、ジャンプコードを介してプラグに手順をジャンプさせるための割り込み命令を修正部分に書き込んでいる。そのため、仮に修正対象部分が実行されそうになっても、バイパス先のプラグが実行される。この場合、カーネルを一時停止しなくてもよい。
本発明によれば、動作中のカーネルに対して再起動せずに動作を変更することができる。また、処理内容の変更対象となるカーネル側に準備が必要でないことから、既存のカーネルに適用できる。さらに、カーネルの停止時間を最小限または停止時間なしで、プラグをロードして有効化することができる。
本実施形態において、カーネルのプラグインとはカーネルのメモリ空間にアクセスし、その内容の読み込み、書き換えを行うことをいう。プラグインには、プラグをロードすること、ロードしたプラグをアンロードすることを含むものとする。本実施形態では、プラグの導入先となる側を「ターゲット」、プラグインによって導入される要素を「プラグ」と称する。
Linuxのカーネルはカーネル本体とカーネルモジュールの二種類に分類される。カーネルモジュールはカーネル本体起動後に動的にカーネル内にロードされ、組み込まれる。したがって、プラグは、カーネル本体とカーネルモジュールが投入された後に、カーネルモジュールとして導入することとする。
カーネルに対してプラグインをライブパッチで行うための困難性は、アプリケーションでのようにプロセスを一時的に停止することができない点にある。したがって、メモリ書き換えの処理途中で書き換え箇所が実行されることによる処理矛盾を発生させないようにすることが必要となる。
そのための1つの方法として、CPU(Central Processing Unit)にプラグイン用スレッドのみを動作させ、本来のスレッドの実行を停止させる方法を案出した。これにより、実効的にCPUは停止状態になり、メモリ書き換えの処理途中で書き換え箇所が実行されることによる処理矛盾が発生しないようにできる。また、複数のCPUを使用する対称型マルチプロセッシング(SMP;Symmetric MultiProcessor)でも、全CPUでプラグイン用スレッドを生成・実行すればよい。この方法は、プラグインの間、全CPUの動作を実質上一時的に停止することになることから、この方法をストップマシンラン法と呼ぶ。
もう1つの方法として、カーネルへのプラグインにおいて、書き換え箇所が実行されることによる処理矛盾が生じなければよいことから、書き換え箇所が実行されないように、書き換え箇所にバイパスを作成する方法を案出した。この方法では、書き換えに係わるCPU以外のCPUは停止する必要がない。この方法を、バイパス法と呼ぶ。
以下に、本発明の実施例について、図面を参照して詳細に説明する。
図1は、本発明によるカーネルプラグインを実現する方法を概念的に説明するための図である。図1は、カーネルがメモリに格納された場合のメモリの領域を示すカーネルメモリ領域の一例を示している。本実施例は、ストップマシンラン法と呼ぶ方法を使用した場合である。
カーネルメモリ領域10は、コード領域11、データ領域12、および空き領域13からなる。空き領域13にプラグイン対象であるパッチモジュール22をロードし、カーネルを一時停止し、パッチモジュールへの分岐命令を修正対象関数21のエントリポイントに上書きすることでパッチモジュールであるプラグをアクティブ化する。プラグのアクティブ化とは、プラグを有効化することを意味し、CPUがそのプラグを実行し得る状態にあることをいう。プラグの非アクティブ化とは、プラグを無効化することを意味し、CPUがそのプラグを実行しない状態にあることをいう。
図2は、本発明によるカーネルプラグインを行うための、本実施例のネットワーク装置の一構成例を示すブロック図である。
ネットワーク装置200は、サーバおよびワークステーション等の情報処理装置である。ネットワーク装置200は、カーネルが格納された記憶部212と、制御部210と、操作者が指示を入力するための操作部216と、制御部210の実行状況を操作者が確認するための表示部216とを有する。また、記憶部212には、カーネルにロードされる前のプラグが格納されている。プラグにはそれぞれ異なる識別子が付与されている。以下では、この識別子をプラグ番号と称する。
図3は、図2に示した制御部の構成例を示すブロック図である。
制御部210は、状態管理部201と、ロード機能部202と、パッチ機能部203と、ファイル化機能部204とを有する。ロード機能部202、パッチ機能部203およびファイル化機能部204のそれぞれは状態管理部201と接続されている。制御部210には、プログラムにしたがって処理を実行するCPU(不図示)と、プログラムを格納するためのメモリ(不図示)とが設けられている。ここでいうプログラムは、プラグをロードして有効にし、またはプラグをアンロードして元の処理を有効にするための専用スレッドに相当する。CPUがこのプログラムを実行することで、状態管理部201と各機能部が仮想的にネットワーク装置200内に構成される。制御部210に設けられるCPUは単体であってもよく、複数であってもよい。以下に、各機能部の構成を簡単に説明する。
ロード機能部202は、操作部214を介してロード対象のプラグが指定されると、プラグの正当性とその状態を確認し、対象のプラグをロードする。また、操作部214を介してアンロード対象のプラグが指定されると、プラグの正当性とその状態を確認し、対象のプラグをアンロードする。
状態管理部201は、各機能部からの依頼にしたがって、プラグの状態遷移に必要な情報であるプラグ情報をカーネルのメモリ空間内に保持してプラグを管理するとともに、プラグ情報を読み書きする。プラグ情報は、プラグ番号、プラグの状態、各種コード、書き換え位置のアドレス、および、書き換えるバイト数などの情報を含む。プラグの状態とは、プラグを実行可能な状態にある「アクティブ」状態か、プラグを実行可能な状態にはない「非アクティブ」状態であるかのいずれかの状態のことである。また、状態管理部201は、プラグ情報の読み込みとその書き換え要求があった場合、対象のプラグ情報を検索して取り出し、要求にしたがってプラグ情報を書き換える。
パッチ機能部203は、プラグのロードの場合には、新たにロードされたプラグを有効化して変更後の新しい処理に遷移させる。この一連の処理がアクティブ化に相当する。アクティブ化の処理は、プラグ状態の確認、カーネルの動作抑止、処理の書き換え・書き戻しの処理からなる。カーネルの動作抑止とは、新たにプラグを導入するための手順を実行可能にしたまま、その他のカーネルの動作を停止させることである。導入したプラグをアンロードする際には、プラグを無効化するための手順を除くカーネルの動作を停止させることである。そのための方法の一つとして、プラグインに関連する動作を可能にするための専用のスレッドをカーネルに設けてもよい。
処理の書き換えの際、新たにロードされたプラグに処理手順をジャンプさせるために、旧処理コードの上にジャンプコードを上書きする。ジャンプコードは、新たにロードされたプラグの処理にジャンプさせるためのコードである。ジャンプコードは、CPUによる処理がジャンプコードに達すると、CPUの処理を新たにロードされたプラグの先頭アドレスにジャンプさせる。書き換え用のジャンプコードを書き込む際、書き戻しの処理を行う場合を考慮して、旧処理コードを状態管理部201のプラグ情報に保存する。
また、パッチ機能部203は、プラグのアンロードの場合には、プラグを無効化して変更前の処理に戻す。この一連の処理が非アクティブ化に相当する。非アクティブ化の処理は、プラグ状態の確認、カーネルの動作抑止、処理の書き換え・書き戻しの処理からなる。
ファイル化機能部204は、プラグ再投入のためのスクリプトを生成して出力する。
以下に、プラグのロードとプラグのアンロードのそれぞれの場合についての動作手順を説明する。はじめに、プラグをロードする場合の動作手順を説明する。
図4はプラグをロードする場合の動作手順を示すフローチャートである。なお、以下では、処理手順を示す「ステップ」の用語を省略して「S」で表記する。図4から図8についても同様である。
操作者が操作部214を介してロード対象のプラグを指定すると、ロード機能部202は対象となるプラグのプラグ番号を記憶部212から読み出す。そして、プラグが適切な状態にあるか否かを確認するために、読み出したプラグ番号と同じ番号のプラグが既にカーネル内のターゲットにないか状態管理部201に問い合わせる(S301)。状態管理部201からの回答により(S302)、同じ番号のプラグがターゲット内にあると判断すると、適切な状態になっていないエラーとして処理を中断する(S303)。
ロード機能部202は、ロード対象のプラグと同じ番号のプラグがターゲット内になければ、S302でプラグが適切な状態になっていると判断し、ロード対象のプラグを記憶部212から読み出してカーネルの空き領域に書き込むロード処理を実行する(S304)。ロード処理が完了すると(S305)、ロードしたプラグのプラグ情報のうち、プラグの状態を「非アクティブ」状態に変更するように状態管理部201に指示する(S306)。状態管理部201は、ロード機能部202からの指示にしたがって、ロードされたプラグの状態を「非アクティブ」状態に書き換える。
続いて、パッチ機能部203が、プラグ状態の確認、カーネルの動作抑止、処理の書き換え・書き戻しの処理からなるアクティブ化の処理を、次のようにして行う。プラグ状態の確認では、対象のプラグ番号のプラグの状態が正当であるかどうかを確認する(S311)。プラグのアクティブ化は、プラグの状態が「非アクティブ」状態である場合のみに実行可能であるため、「非アクティブ」状態であるか否かを状態管理部201に確認する(S312)。プラグが「非アクティブ」状態であれば、プラグを有効化する(S313)。
なお、図4には示していないが、複数のプラグに対応する場合には、シンボル間の依存関係を次のようにチェックする。アクティブ化時に、プラグ情報内の参照先プラグ番号に対応するプラグの状態をチェックし、非アクティブ状態のプラグがあった場合はエラーとする。複数のプラグのうち1つでも非アクティブ状態のプラグがあると、実行できなくなるからである。
パッチ機能部203は、S313でプラグを有効化すると、プラグインに関連する手順を除くカーネルの動作を停止する動作抑止を行う(S315)。カーネルの動作抑止が完了したら(S316)、処理を切り替えるための処理コードの書き換えを行う(S321〜S325)。
具体的に説明すると、カーネル処理を新しい処理に切り替えるための、書き換え用のジャンプコードを状態管理部201のプラグ情報より読み出す(S321)。続いて、書き戻し用の旧処理コードをカーネルから読み出して状態管理部201のプラグ情報に保存する(S322)。そして、旧処理コードの先頭(関数のパッチの場合は旧関数の先頭アドレス)に、読み出したジャンプコードを上書きする(S323)。その後、プラグの状態を「アクティブ」状態に更新する旨を状態管理部201に指示する(S324)。状態管理部201は、パッチ機能部203からプラグの状態の更新の依頼を受けると、対象となるプラグ情報のプラグの状態を更新する。
なお、書き換えに必要な新コード(ここでは、ジャンプコードに相当する)、旧処理コードの先頭アドレス(書き換えアドレスに相当する)、および旧処理コードの情報はプラグ情報に含まれ、これらの情報を状態管理部201に読み出し依頼を行って取得する。
ファイル化機能部204は、新たなプラグの処理を有効にするプラグ再投入のためのスクリプトを生成して出力する(S325〜S326)。ここでは、生成対象プラグ情報の取得、スクリプトファイルの出力、シンボリックリンクの作成を行う。スクリプト生成対象となるプラグは、指定されたプラグが「アクティブ」状態である場合に限られる。
CPUがスクリプトを実行すると、対象プラグの全てがロードされ、アクティブ化され、スクリプト実行時に指定されるプロセス全てに対し、実行され、プラグの投入がアクティブ化順、および生成時の指定順に行われる。
本実施例では、新たにプラグをロードしてそれを有効にするための専用スレッドをカーネルに設けていれば、その専用スレッドのみを実行可能とし、他のスレッドを停止する。これにより、専用スレッド以外の修正部分を含むカーネルが一時停止することになるため、メモリの書き換え中に該当部分が実行されることがない。そのため、メモリ書き換えの処理途中で書き換え箇所が実行されることによる処理矛盾が発生しないようにでき、カーネルに対してもバグ修正のプラグインが実現できる。
次に、プラグをアンロードする場合の動作手順を説明する。図5はプラグをアンロードする場合の手順を示すフローチャートである。
操作者が操作部214を介してアンロード対象のプラグを指定すると、パッチ機能部203は、対象のプラグを無効化して変更前の処理に戻す非アクティブ化を行う。この処理は、プラグ状態の確認、カーネルの動作抑止、処理の書き換え・書き戻しの処理からなる。
プラグ状態の確認では、対象のプラグ番号のプラグの状態が正当であるかどうかを確認する(S401)。そのため、「アクティブ」状態であるか否かを状態管理部201に確認する(S402)。プラグの非アクティブ化は、プラグの状態が「アクティブ」状態である場合のみに実行可能である。
なお、図5には示していないが、複数のプラグに対応する場合には、シンボル間の依存関係を次のようにチェックする。非アクティブ化時に、アクティブ状態となっているプラグを全てチェックし、非アクティブ化対象外のプラグ情報内のシンボル参照先プラグ番号に非アクティブ化対象のプラグが含まれている場合はエラーとする。
パッチ機能部203は、プラグの状態が正当であることを状態管理部201で確認すると(S402)、カーネルの動作抑止を行う(S403)。カーネルの動作抑止が完了したら(S404)、処理を切り替えるための処理コードの書き換え、書き戻しを次のように行う。
プラグの非アクティブ化時には、カーネルをプラグ導入前に戻すための、書き戻し用の旧処理コードをプラグ情報より読み出す(S411)。旧処理コードの先頭(関数のパッチの場合は旧関数の先頭アドレス)に上書きされたジャンプコードを状態管理部201のプラグ情報に保存し(S412)、カーネルのジャンプコードに旧処理コードを上書きする(S413)。そして、プラグ情報内のプラグの状態を「非アクティブ」状態に更新する旨を状態管理部201に指示する(S414)。状態管理部201は、パッチ機能部203からプラグの状態の更新の依頼を受けると、対象となるプラグ情報のプラグの状態を更新する。
なお、プラグのロードの場合と同じように、書き換え、書き戻しに必要な新コード(ジャンプコードに相当する)、旧処理コードの先頭アドレス(書き換えアドレスに相当する)、および旧処理コードの情報はプラグ情報に含まれ、これらの情報を状態管理部201に読み出し依頼を行って取得する。
次に、ロード機能部202がプラグのアンロードを行うが、アンロード時にはプラグが「非アクティブ」状態になっている必要がある。ロード機能部202は、プラグが適切な状態になっているかを確認するために、対象のプラグの状態を状態管理部201に問い合わせる(S421)。プラグが「非アクティブ」状態になっていなければ、プラグが適切な状態になっていないエラーとして、処理を中断する(S422)。
S421でプラグが「非アクティブ」状態になっていれば、ロード機能部202は、プラグをカーネルから削除するアンロード処理を行い(S424)、アンロード後にはプラグ情報を「アンロード」状態に変更する旨を状態管理部201に指示する(S425)。
なお、本実施例では、カーネルからプラグを削除してプラグを実行できないようにしているが、プラグの読み出しをできない状態にするのであれば他の方法であってもよい。例えば、プラグがロードされているメモリ領域を開放すること(どのプログラムからも参照・使用されていない状態にする)、または、実際にメモリ領域を開放しなくても、プラグ機能からは該当プラグ番号に対する管理情報を削除することで、プラグの読み出しができないようにしてもよい。後者の場合、不要な情報がメモリ領域に残存するが、今日のオペレーティングシステムでは長期間使用されないメモリ領域は、メモリ不足時にハードディスクにスワップアウトされるため、実用上の問題は少ない。
上述した方法により、メモリ書き換えの処理途中で書き換え箇所が実行されることによる処理矛盾が発生しないように、カーネルからプラグをアンロードできる。
次に、本実施例の効果を説明する。
効果を確認するために用いた情報処理装置は、CPU:Xeon3.4GHz(EM64T)×2、メモリ:1GB、OS:Redhat Enterprise Linux AS4(×86_64)、Linuxカーネルバージョン:2.6.9−5.EL(SMP有効、カーネルプリエンプション無効)を有している。そして、この装置を使用し、アプリケーションに見立てた1個のプロセスが起動した状態で本実施例の効果を測定した。
プロセスは無限ループによってCPUに100%の負荷をかけ、LTP(Linux Test Project)におけるgrowfilesの負荷をかけた。100秒間カーネルパッチのアクティブ化/非アクティブ化を連続して繰り返し、CPU使用率の低下から、停止時間の平均値と、起こりうる最大値を求めた。
その結果、計測回数:約60,000回、停止時間の平均:0.062(mS)、起こりうる最大値:117.0(mS)であった。停止時間は、約100msと短いという効果があった。
本実施例は、バイパス法と呼ぶ方法を使用した場合である。なお、本実施例の方法を実行するための装置の構成については、パッチ機能部203を除いて、実施例1と同様であるため、その詳細な説明を省略する。本実施例では、パッチ機能部203を中心に説明する。
本実施例のパッチ機能部203は、バイパスコードを生成し、処理の書き換えを行う。バイパスコードとは、カーネルにある修正部分の処理の代わりに、新たにロードするプラグを実行させるためのコードである。
はじめに、プラグをロードする場合の動作を説明する。図6はプラグをロードする場合の動作手順を示すフローチャートである。
パッチ機能部203は、次のようにして、プラグ状態の確認、処理の書き換えを行う。プラグ状態の確認では、対象のプラグ番号が指定されると、指定されたプラグがプラグの状態が正当であるかどうかを状態管理部201に問い合わせて確認する(S511)。プラグのアクティブ化では、プラグが「非アクティブ」状態である場合のみに実行可能である(S512)。
なお、図6には示していないが、複数プラグに対応する場合、シンボル間の依存関係をアクティブ化時には参照先プラグの状態のチェックで行う。すなわち、アクティブ化時の参照先プラグの状態のチェックでは、プラグ情報内の参照先プラグ番号に対応するプラグの状態をチェックし、そのプラグの状態が「非アクティブ」状態であった場合はエラーとする。パッチ機能部203は、対象プラグの状態、ならびに参照先および参照元プラグの状態を状態管理部201に問い合わせ、状態管理部201からこれらの情報を取得し、それを解析することによりプラグの状態を判定する。
S512の後、パッチ機能部203は、処理の書き換えを次のようにして行う。プラグのアクティブ化時には、書き戻し用の旧処理コードをカーネルから読み出し、プラグ情報に保存する(S513)。コマンドファイルで指定された長さのバイパスコードを生成してカーネルの空き領域に確保し、バイパスを使用できるようにする(S514)。
具体的には、割り込み命令となるint3命令を、修正部分の命令コードの先頭に上書きし、int3割り込みハンドラとしてバイパスコードを実施させる。int3命令はブレークポイントに使用される割り込み命令であり、容量がきわめて小さいサイズの命令であるため、排他制御なしに設定することが可能である。このため、アクティブ化時にカーネル処理を停止することなく、バイパスコードに処理を遷移することが可能である。また、この時点でカーネルは、バイパスコードを介して、新たなプラグ側の修正処理を実施可能である。ここでのint3命令は、バイパスコードの読み出し命令となる。
上述したように、バイパスに該当するプラグとバイパスコードをカーネルの空き領域に書き込み、バイパスコードを介してプラグに手順をジャンプさせるための割り込み命令を修正部分に書き込んでいる。そのため、仮に修正部分が実行されそうになっても、バイパス先のプラグが実行される。
一方、バイパスコードを介して常にプラグ側の処理を実施させる場合、常に割り込みが生じるため、性能が優れない。そのため、最終的にはジャンプコードを旧処理コード上に上書きする。このために、以下の処理を行う。
パッチ機能部203は、カーネルの修正対象部分をプラグの処理に切り替えるための、書き換え用のジャンプコードを状態管理部201のプラグ情報より読み出す(S515)。旧処理コードの先頭(関数のパッチの場合は旧関数の先頭アドレス)に、読み出したジャンプコードを上書きする(S516)。その際、int3命令部分の上書きを最後に行うために、int3命令部分のうしろ側の旧処理コードの部分をジャンプコードに先に書き換え、最後にint3命令部分をジャンプコードに書き換える。その後、プラグ状態を「アクティブ」状態に更新する旨を状態管理部201に指示する(S517)。状態管理部201は、パッチ機能部203からプラグの状態の更新の依頼を受けると、対象となるプラグ情報のプラグの状態を更新する。
なお、書き換え、書き戻しのために必要な新コード(ジャンプコードに相当する)、旧処理コードの先頭アドレス(書き換えアドレスに相当する)、および旧処理コードの情報はプラグ情報に含まれ、これらの情報を状態管理部201に読み出し依頼を行って取得する。
本実施例では、カーネル中の修正対象部分が実行されないようにバイパスを設けている。バイパスに該当するプラグをカーネルの空き領域に書き込み、修正部分にはそのプラグに手順をジャンプさせるためのコードを書き込むことで、仮に修正対象部分が実行されそうになっても、バイパス先のプラグが実行される。そのため、カーネルを一時停止しなくてもよい。複数のCPUが設けられている場合には、カーネルの書き換えに使用されているCPU以外のCPUの動作を止めることなくカーネルにプラグをロードすることができる。
次に、プラグをアンロードする場合の動作を説明する。図7はプラグをアンロードする場合の動作手順を示すフローチャートである。本実施例では、図5に示したS401〜S414の処理の替わりに図7に示す処理が行われる。
パッチ機能部203は、次のようにして、プラグ状態の確認、処理の書き換えを行う。プラグ状態の確認では、対象のプラグ番号が指定されると、指定されたプラグがプラグの状態が正当であるかどうかを状態管理部201に問い合わせて確認する(S611)。プラグの非アクティブ化では、プラグが「アクティブ」状態である場合のみに実行可能である(S612)。
なお、図7には示していないが、複数プラグに対応する場合、シンボル間の依存関係をアクティブ化時には参照先プラグの状態のチェックで行う。非アクティブ化時の参照元プラグ存在チェックでは、アクティブ状態となっているプラグを全てチェックし、非アクティブ化対象外のプラグ情報内の、各プラグが参照するシンボルのプラグ番号に非アクティブ化対象のプラグ番号が含まれていた場合はエラーとする。パッチ機能部203は、対象プラグの状態、ならびに参照先および参照元プラグの状態を状態管理部201に問い合わせ、状態管理部201からこれらの情報を取得し、それを解析することによりプラグの状態を判定する。
S612の後、パッチ機能部203は、処理の書き換えを次のようにして行う。コマンドファイルで指定された長さのバイパスコードを生成してカーネルの空き領域に確保し、バイパスを使用できるようにする(S614)。具体的には、プラグをロードする場合と同様に、ジャンプコードの先頭にint3命令を上書きする。
S614の後、パッチ機能部203は、処理の書き換えを次のようにして行う。カーネルの処理を以前の処理に戻すために、書き戻し用の旧処理コードを状態管理部201のプラグ情報より読み出す(S615)。続いて、旧処理コードの先頭(関数のパッチの場合は旧関数の先頭アドレス)に記述されているジャンプコードに、読み出した旧処理コードを上書きする(S616)。その際、プラグをロードする場合と同様に、以下のように行う。S614で説明したように旧処理コードをバイパスコード(既にカーネルに書き込まれたジャンプコードとは異なる)で準備し、カーネル中のジャンプコードの読み出しに処理手順が達すると、int3命令とバイパスコードで旧処理コードの読み出しにジャンプさせるようにする。その後、カーネル本体の旧処理コードの部分に上書きされていたジャンプコードを、旧処理コードに書き戻す。
その後、パッチ機能部203は、プラグ状態を「非アクティブ」状態に更新する旨を状態管理部201に指示する(S617)。状態管理部201は、パッチ機能部203からプラグの状態の更新の依頼を受けると、対象となるプラグ情報のプラグの状態を更新する。
なお、書き換え、書き戻しのために必要な新コード(ジャンプコードに相当する)、旧処理コードの先頭アドレス(書き換えアドレスに相当する)、および旧処理コードの情報はプラグ情報に含まれ、これらの情報を状態管理部201に読み出し依頼を行って取得する。
上述した方法によると、カーネルの書き換えに使用されているCPU以外のCPUの動作を止めることなくカーネルのプラグをアンロードすることができる。
本実施例は、実施例2の割り込み命令を用いた方法について具体的に説明するものである。本実施例では、プラグをロードする場合で説明する。
図8は、実施例2におけるバイパスコード書き込みおよびジャンプコード書き込み方法を示すフローチャートである。図9は図8の各ステップでのコードイメージを示す図である。
パッチ機能部203は、カーネルの空き領域にバイパスコードの領域を確保し、そこにジャンプコードを書き込み、また、カーネルの空き領域にプラグ関数を書き込む(S701)。そして、修正対象関数のエントリポイントの先頭1バイトに、int3コードを書き込み、処理がバイパスコードを通過するようにする(S702)。この処理は、1バイトの書き換えであることから、他のCPUの動作を停止させることなくアトミックにできる。
続いて、パッチ機能部203は、修正対象関数のうちint3コード以外の部分にジャンプコードの先頭1バイトを除いた部分を書き込む(S703)。このとき、書き換え箇所のコードを通過するスレッドはないため、アトミックに行わなくてもよい。その後、int3コードの位置にジャンプコードの先頭1バイトを書き込む(S704)。このようにして、ジャンプコードの処理をアトミックに有効化することができる。
なお、プラグをアンロードする場合には、ジャンプコードを書き込んだ部分に元の修正対象関数を上書きする。この場合、プラグをロードする際に、修正対象関数を予め記憶部212に保存しておく。
本実施例では、1バイトの割り込み命令を書き込むことにより、1バイトの書き換えで処理変更がすむことからアトミックに処理できる。
次に、本実施例の効果を説明する。
CPU:Xeon3.4GHz×2、メモリ:1GB、OS:Redhat Enterprise Linux AS4(×86_64)、Linuxカーネルバージョン:2.6.14.3+djprobe(SMP有効、カーネルプリエンプション無効)を有する情報処理装置において、アプリケーションに見立てた1個のプロセスが起動した状態で測定を行った。
プロセスは無限ループによってCPUに100%の負荷をかけ、LTP(Linux Test Project)におけるgrowfilesの負荷をかけた。
100秒間カーネルパッチのアクティブ化/非アクティブ化を連続して繰り返し、CPU使用率の低下から、停止時間の平均値と、起こりうる最大値を求めた。
計測回数:約40,000回、停止時間の平均:0(mS)、起こりうる最大値:0(mS)で、他プロセスを停止することがない効果があった。
なお、本発明のプログラム更新方法をコンピュータに実行させるためのプログラムに適用してもよく、そのプログラムをコンピュータに読み取りが可能な記録媒体に格納してもよい。
本発明は、高信頼性を要求されるネットワークサービスの分野で利用できる。
本発明によるカーネルプラグインを実現する方法を概念的に説明するための図である。 実施例1のネットワーク装置の一構成例を示すブロック図である。 図2に示した制御部の構成例を示すブロック図である。 実施例1においてプラグをロードする場合の動作手順を示すフローチャートである。 実施例1においてプラグをアンロードする場合の動作手順を示すフローチャートである。 実施例2においてプラグをロードする場合の動作手順を示すフローチャートである。 実施例2においてプラグをアンロードする場合の動作手順を示すフローチャートである。 バイパスコード書き込みおよびジャンプコード書き込み方法を示すフローチャートである。 図8に示したフローチャートの各ステップでのコードイメージを示す図である。
符号の説明
200
201 状態管理部
202 ロード機能部
203 パッチ機能部
204 ファイル化機能部
210 制御部
212 記憶部

Claims (10)

  1. カーネルの修正部分に対応するモジュールであるプラグを前記カーネルに導入するためのプログラム更新方法であって、
    前記プラグを前記カーネルの空き領域に書き込むステップと、
    前記プラグを前記空き領域に書き込んだ後、前記プラグを導入するための手順を除く前記カーネルの実行を停止させるステップと、
    一部を除く前記カーネルの実行を停止させた後、前記修正部分のコードを、前記修正部分において前記プラグに手順をジャンプさせるためのジャンプコードに書き換えるステップと、
    を有するプログラム更新方法。
  2. カーネルの修正部分に対応するモジュールであるプラグを前記カーネルで無効化するためのプログラム更新方法であって、
    前記プラグを無効化するための手順を除く前記カーネルの実行を停止させるステップと、
    一部の手順を除く前記カーネルの実行を停止させた後、前記修正部分の処理を有効にするために、前記プラグの処理を実行可能にするために書き込まれたジャンプコードを前記修正部分のコードに書き戻すステップと、
    を有するプログラム更新方法。
  3. カーネルの修正部分に対応するモジュールであるプラグを前記カーネルに導入するためのプログラム更新方法であって、
    前記プラグと該プラグに手順をジャンプさせるためのバイパスコードとを前記カーネルの空き領域に書き込む第1の書き込みステップと、
    前記第1の書き込みステップの後、前記バイパスコードの読み出しのための割り込み命令を前記修正部分のコードの先頭に書き込む第2の書き込みステップと、
    を有するプログラム更新方法。
  4. カーネルの修正部分に対応するモジュールであるプラグを前記カーネルで無効化するためのプログラム更新方法であって、
    前記修正部分のコードと該コードに手順をジャンプさせるためのバイパスコードとを前記カーネルの空き領域に書き込む第1の書き込みステップと、
    前記第1の書き込みステップの後、前記バイパスコードの読み出しのための割り込み命令を前記プラグの導入前に前記修正部分のコードがあった位置の先頭に書き込む第2の書き込みステップと、
    を有するプログラム更新方法。
  5. 前記第2の書き込みステップの後、前記割り込み命令を一部に含む前記修正部分のコードに前記バイパスコードを書き込むステップをさらに有する請求項3記載のプログラム更新方法。
  6. 前記第2の書き込みステップの後、前記プラグの導入前に前記修正部分のコードがあった位置に該修正部分のコードを書き戻すステップをさらに有する請求項4記載のプログラム更新方法。
  7. カーネルおよび該カーネルの修正部分に対応するモジュールであるプラグが格納された記憶部と、
    前記プラグを前記カーネルに導入する場合、該プラグを該カーネルの空き領域に書き込み、該プラグを導入するための手順を除く前記カーネルの実行を停止させた後、前記修正部分で前記プラグに手順をジャンプさせるためのジャンプコードに前記修正部分のコードを書き換え、また、前記プラグを前記カーネルで無効化する場合、該プラグを無効化するための手順を除く前記カーネルの実行を停止させた後、前記修正部分の処理を有効にするために前記ジャンプコードを前記修正部分のコードに書き戻す制御部と、
    を有する情報処理装置。
  8. カーネルおよび該カーネルの修正部分に対応するモジュールであるプラグが格納された記憶部と、
    前記プラグを前記カーネルに導入する場合、該プラグと該プラグに手順をジャンプさせるための第1のバイパスコードとを前記カーネルの空き領域に書き込んだ後、前記第1のバイパスコードの読み出しのための割り込み命令を前記修正部分のコードの先頭に書き込み、また、前記プラグを前記カーネルで無効化する場合、前記修正部分のコードと該コードに手順をジャンプさせるための第2のバイパスコードとを前記カーネルの空き領域に書き込んだ後、前記第2のバイパスコードの読み出しのための割り込み命令を前記第1のバイパスコードの先頭に書き込む制御部と、
    を有する情報処理装置。
  9. 請求項1から6のいずれか1項に記載のプログラム更新方法をコンピュータに実行させるためのプログラム。
  10. 請求項1から6のいずれか1項に記載のプログラム更新方法をコンピュータに実行させるためのプログラムを記録した、コンピュータに読み取りが可能な記録媒体。
JP2007174068A 2007-07-02 2007-07-02 カーネル更新方法、情報処理装置、プログラムおよび記憶媒体 Active JP4931711B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007174068A JP4931711B2 (ja) 2007-07-02 2007-07-02 カーネル更新方法、情報処理装置、プログラムおよび記憶媒体

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007174068A JP4931711B2 (ja) 2007-07-02 2007-07-02 カーネル更新方法、情報処理装置、プログラムおよび記憶媒体

Publications (2)

Publication Number Publication Date
JP2009015428A true JP2009015428A (ja) 2009-01-22
JP4931711B2 JP4931711B2 (ja) 2012-05-16

Family

ID=40356288

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007174068A Active JP4931711B2 (ja) 2007-07-02 2007-07-02 カーネル更新方法、情報処理装置、プログラムおよび記憶媒体

Country Status (1)

Country Link
JP (1) JP4931711B2 (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012173754A (ja) * 2011-02-17 2012-09-10 Nec Corp 情報処理装置、情報処理方法及びプログラム
JP2014203384A (ja) * 2013-04-09 2014-10-27 三菱電機株式会社 単体試験支援装置及び単体試験支援プログラム
JP2017508220A (ja) * 2014-03-20 2017-03-23 クラウドストライク インコーポレイテッド ランタイム中のインテグリティの保証およびリブートレスな更新
JP2020190932A (ja) * 2019-05-22 2020-11-26 株式会社デンソー 車両用装置
US10853491B2 (en) 2012-06-08 2020-12-01 Crowdstrike, Inc. Security agent

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05216649A (ja) * 1992-01-31 1993-08-27 Nec Corp システムプログラム動的変更方式
JPH07319683A (ja) * 1994-05-30 1995-12-08 Nippon Telegr & Teleph Corp <Ntt> 運用中プログラム更新方式
JPH09114655A (ja) * 1995-10-17 1997-05-02 Fujitsu Ltd 高水準言語レベルでのパッチ作成・運用方式
JPH11259285A (ja) * 1998-03-13 1999-09-24 Hitachi Ltd オペレーティングシステムのモジュール入れ替え方法及びモジュールの入れ替えを作う処理装置
JP2005043960A (ja) * 2003-07-22 2005-02-17 Nippon Telegr & Teleph Corp <Ntt> サーバ、オンラインパッチ処理方法及びプログラム
US20060191014A1 (en) * 2003-10-08 2006-08-24 Microsoft Corporation Changing code execution path using kernel mode redirection

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05216649A (ja) * 1992-01-31 1993-08-27 Nec Corp システムプログラム動的変更方式
JPH07319683A (ja) * 1994-05-30 1995-12-08 Nippon Telegr & Teleph Corp <Ntt> 運用中プログラム更新方式
JPH09114655A (ja) * 1995-10-17 1997-05-02 Fujitsu Ltd 高水準言語レベルでのパッチ作成・運用方式
JPH11259285A (ja) * 1998-03-13 1999-09-24 Hitachi Ltd オペレーティングシステムのモジュール入れ替え方法及びモジュールの入れ替えを作う処理装置
JP2005043960A (ja) * 2003-07-22 2005-02-17 Nippon Telegr & Teleph Corp <Ntt> サーバ、オンラインパッチ処理方法及びプログラム
US20060191014A1 (en) * 2003-10-08 2006-08-24 Microsoft Corporation Changing code execution path using kernel mode redirection

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2012173754A (ja) * 2011-02-17 2012-09-10 Nec Corp 情報処理装置、情報処理方法及びプログラム
US10853491B2 (en) 2012-06-08 2020-12-01 Crowdstrike, Inc. Security agent
JP2014203384A (ja) * 2013-04-09 2014-10-27 三菱電機株式会社 単体試験支援装置及び単体試験支援プログラム
JP2017508220A (ja) * 2014-03-20 2017-03-23 クラウドストライク インコーポレイテッド ランタイム中のインテグリティの保証およびリブートレスな更新
US10289405B2 (en) 2014-03-20 2019-05-14 Crowdstrike, Inc. Integrity assurance and rebootless updating during runtime
US11340890B2 (en) 2014-03-20 2022-05-24 Crowdstrike, Inc. Integrity assurance and rebootless updating during runtime
JP2020190932A (ja) * 2019-05-22 2020-11-26 株式会社デンソー 車両用装置
JP7331456B2 (ja) 2019-05-22 2023-08-23 株式会社デンソー 車両用装置
US11919461B2 (en) 2019-05-22 2024-03-05 Denso Corporation Vehicle device

Also Published As

Publication number Publication date
JP4931711B2 (ja) 2012-05-16

Similar Documents

Publication Publication Date Title
Olivier et al. A binary-compatible unikernel
US10853071B2 (en) Simulation of exclusive instructions
US7774636B2 (en) Method and system for kernel panic recovery
US7784044B2 (en) Patching of in-use functions on a running computer system
US20060064576A1 (en) Boot systems and methods
EP2375323A1 (en) Firmware image update and management
WO2012100535A1 (zh) 超级内核组件的升级方法和计算机系统
KR20050061378A (ko) 페일세이프 방식으로 맞춤 소프트웨어 영상 갱신을불휘발성 저장 장치에 적용하는 시스템 및 방법
US10228993B2 (en) Data dump for a memory in a data processing system
JP2005322242A (ja) 仮想環境からのハードウェアへの直接アクセスの提供
JP7012074B2 (ja) 仮想ディスクの拡張方法及び機器
US7546596B2 (en) Non-disruptive method, system and program product for overlaying a first software module with a second software module
JP4931711B2 (ja) カーネル更新方法、情報処理装置、プログラムおよび記憶媒体
CN110874237A (zh) 软件升级方法、装置、终端以及可读存储介质
JP2020525905A (ja) アドレス変換データの無効化
WO2015154538A1 (zh) 存储器的启动方法及装置
US20130055217A1 (en) Breakpoint synchronization for modified program source code
US11983519B2 (en) Abort installation of firmware bundles
US9229724B2 (en) Serializing wrapping trace buffer via a compare-and-swap instruction
US10761892B2 (en) Method and electronic device for executing data reading/writing in volume migration
US20100229167A1 (en) Testing operating system isolation using error injection
KR20190069134A (ko) 응용 프로그램간 파일 공유 장치 및 방법
CN110515665B (zh) 一种处理器系统的启动方法、系统及装置
US10712952B1 (en) Metadata caches in a reliable distributed computing system
US20140075092A1 (en) Simulating eeprom in virtual distributed switches

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110301

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110720

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110914

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20111018

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120112

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20120118

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120210

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120214

R150 Certificate of patent or registration of utility model

Ref document number: 4931711

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150224

Year of fee payment: 3

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350