(57)【要約】【課題】  本発明は、ＣＰＵのディジタル演算処理に対して耐障害性を提供することを目的とする。【解決手段】  ターゲットとする中央演算処理装置（ＣＰＵ）上で実行すべきプログラムをコンパイルする方法に関する。この方法は、ＣＰＵレジスタの診断テストを状況に応じてスケジューリングすること（５０８）を含む。この方法は、レジスタ診断テストのスケジューリング（５０８）に既定の積極性レベルを使用することを含むことができる。スケジューリングされる診断テストは、レジスタに既知データを書き込むこと（７０２）と、レジスタからデータを読み取ること（７０４）と、既知のデータを読み取られたデータと比較すること（７０６）とを含むことができる。これらを比較した結果、相違する場合、故障ハンドラルーチンへのジャンプを行うこと（７１０）ができる。【選択図】図５
2005122738.tif 000002
【特許請求の範囲】
【請求項１】
対象となる中央演算処理装置において実行されるプログラムをコンパイルする方法であって、
機会をとらえて、中央演算処理装置のレジスタの診断テストをスケジューリングする
ことを含む方法。
【請求項２】
前記診断テストのスケジューリングに関する所定の積極性レベルをチェックする
ことをさらに含む請求項１に記載の方法。
【請求項３】
テストされる次のレジスタを決定する
ことをさらに含む請求項２に記載の方法。
【請求項４】
前記次のレジスタをテストするために、レジスタ診断命令をスケジューリングする十分な機会が存在するか否かを判断する
ことをさらに含む請求項３に記載の方法。
【請求項５】
レジスタ診断命令をスケジューリングする十分な機会が存在する場合に、次のレジスタの診断テストを行うためにレジスタ診断命令をスケジューリングし、
レジスタ診断命令をスケジューリングする十分な機会が存在しない場合に、ユーザコードの命令をスケジューリングする
ことをさらに含む請求項４に記載の方法。
【請求項６】
前記中央演算処理装置のレジスタは、汎用レジスタのファイルに含まれるレジスタを有する
請求項１に記載の方法。
【請求項７】
スケジューリングされた診断テストは、
既知のデータをレジスタに書き込み、
前記レジスタからデータを読み出し、
前記既知のデータと、読み出された前記データとを比較する
ことを含む
請求項１に記載の方法。
【請求項８】
前記比較により相違することが示された場合に、障害取扱い手順にジャンプする
ことをさらに含む請求項７に記載の方法。
【請求項９】
前記障害取扱い手順は、演算処理を停止して、潜在的なデータの変造を回避するように設定されている
請求項８に記載の方法。
【請求項１０】
前記障害取扱い手順は、前記レジスタに対するアクティビティを、代わりのレジスタに再配置するように設定されている
請求項８に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、包括的にはコンピュータシステムに関する。より詳細には、本発明はマイクロプロセッサおよび診断に関する。
【背景技術】
【０００２】
中央演算装置（ＣＰＵ）によるデジタル演算処理において耐障害性を提供する手段としては、複数のＣＰＵを多重化したコンピュータシステムがある。例えば、多重化されたＣＰＵは、常にロックステップ処理を行うことにより、演算処理において一定レベルの耐障害性を実現する。このような解決手段は、不都合なことに、付加的なシステムハードウェアと、これをサポートする設備とを要する。
【０００３】
中央演算装置（ＣＰＵ）によるデジタル演算処理において耐障害性を提供する他の手段としては、ソフトウェアによる検査を用いるものがある。このソフトウェア検査は、同一のコンピュータ上、または、異なるコンピュータ上で、何度も検査用プログラムを実行することにより実現される。しかしながら、このソフトウェア検査による解決手段は、不都合なことに、長い実行時間を必要とするか、または、複数のコンピュータを必要とするため、代償が大きくなりすぎる。
【特許文献１】米国特許第５２０２９７５号
【特許文献２】米国特許第５４１２６７１号
【特許文献３】米国特許第５８１９０８８号
【特許文献４】米国特許第５８３５７７６号
【特許文献５】米国特許第６４０８３７７号
【特許文献６】米国特許第６４３４７１２号
【特許文献７】米国特許第６５５３５３０号
【発明の開示】
【発明が解決しようとする課題】
【０００４】
上記のような従来の手段は、費用またはシステムパフォーマンスの点で代償が大きい。したがって、ＣＰＵのディジタル演算処理に対して耐障害性を提供するシステムまたは方法の改善が、強く要望されている。
【課題を解決するための手段】
【０００５】
本発明の一実施形態は、ターゲットとする中央演算処理装置（ＣＰＵ）上で実行すべきプログラムをコンパイルする方法に関する。この方法は、ＣＰＵレジスタの診断テストを状況に応じてスケジューリングすることを含む。この方法は、レジスタ診断テストのスケジューリングに既定の積極性レベルを使用することを含むことができる。スケジューリングされる診断テストは、レジスタに既知データを書き込むことと、レジスタからデータを読み取ることと、既知のデータを読み取られたデータと比較することとを含むことができる。これらを比較した結果、相違する場合、故障ハンドラルーチンへのジャンプを行うことができる。
【発明を実施するための最良の形態】
【０００６】
上述のように、データ処理システムに関する耐障害性を改良することが望ましい。本発明は、ＣＰＵレジスタ診断テストにより耐障害性を改良する方法および装置に関する。
【０００７】
データ処理システムがより複雑かつ高度になるにつれ、発生する可能性のあるエラーを検出し訂正することが可能であることがさらに重要になりつつある。このようなエラーには、このようなシステムの多数の記憶要素に影響を及ぼしかねないものも含まれる。このような保護および訂正を用いることができる記憶要素としては、大型メモリバンク、高速キャッシュメモリ、記憶レジスタ、補助メモリ記憶要素が挙げられるが、実際には、命令またはデータを保持するいずれのデバイスも、現代のコンピューティングシステムにおいて有効なデータ保護および訂正の技法を必要とする。
【０００８】
ＣＰＵのレジスタは、現代のコンピュータシステムにおける主要な記憶要素の１つである。レジスタは、実行ユニット内のデータに高速アクセスするために実行ユニットのすぐ近くに配置された、マイクロプロセッサコア内の記憶ユニットを構成する。レジスタは様々な目的で使用される場合がある。レジスタは累算器、指標レジスタ、または特別なデータハンドラとして使用される場合がある。データワードのセグメンテーションを必要とする部分ワード読み取りおよび書き込み能力が望ましいが、これには、汎用セットの設計に複雑性を追加する必要があり、エラーの訂正および検出を一層難しくする。
【０００９】
プロセッサ性能の向上および実行ユニットの増加に伴い、マイクロプロセッサに内蔵されるレジスタの数も増大している。さらに、ＣＰＵ性能が向上する推進要因の１つは、トランジスタサイズの減少および電圧レベルの低下である。ますます多くのレジスタが、ますます小型のデバイスおよびより低い電圧レベルを有するマイクロプロセッサに実装されるにつれ、こういった耐故障性のあるレジスタの機構に対する必要性が増した。
【００１０】
エラー検出にパリティチェックを含む、レジスタに対する従来技術による耐故障性がある方式が知られている。パリティチェックがエラーを検出する能力は、パリティチェックに割り当てられるビット数によって制限されるため、完全なエラー保証範囲を提供しない。したがってパリティチェックの場合、エラーが発生し、そのエラーが検出されず、「サイレント」（未検出）データ不良として伝搬する危険性が存在する。さらに、パリティエラーが発生する場合、システムは通常、マシンチェックを終了してシャットダウンしなければならない。言い換えれば、リカバリメカニズムは通常利用できない。
【００１１】
別の従来技術による「方策」は、他のシステムレベルエラーソースのほうがはるかにエラーを発生しやすいという仮定の下で、一般にＣＰＵ、特にレジスタにおける考えられるエラーを無視するというものである。本発明者らは、システムのその他の要素の多くに向けられた耐故障性のある技法がいくつか存在し、仮にまだであったとしても間もなく、ＣＰＵ内のエラー率が、無視するには重大すぎるエラーソースになることを考えると、このような仮定はもはや賢明でないと確信する。
【００１２】
本発明が用いられる環境は、サーバ、ワークステーション、または他のコンピューティングシステム等、汎用コンピュータシステムを包含する。汎用コンピュータの要素のいくつかを図１に示す。図１には、入力／出力（「Ｉ／Ｏ」）セクション２、マイクロプロセッサまたは中央演算処理装置（「ＣＰＵ」）３、およびメモリセクション４を備えたコンピューティングシステム１が示される。Ｉ／Ｏセクション２は、キーボードおよび／または他の入力装置５、表示ユニットおよび／または他の出力装置６、１つまたは複数の固定記憶ユニット９、および／または取り外し可能記憶ユニット７に接続される。取り外し可能記憶ユニット７は、プログラム１０および他のデータを通常含むデータ記憶媒体８を読み取ることができる。
【００１３】
図２は、例示的な図１のコンピュータシステムのソフトウェア要素の例を示す。アプリケーションプログラム２６が示される。このようなアプリケーション２６は、本発明の教示に組み込まれるコンパイラ３４を使用してコンパイルすることができる。コンパイルされたアプリケーションプログラム２６は、実行中のサービスのために実行時ライブラリ３４にアクセスし、そして実行時ライブラリ３４はシステムサービスのためにオペレーティングシステム３２にアクセスする。コンパイラ３４は、アプリケーションプログラム２６のコンパイル中、システムサービスのためにオペレーティングシステム３２にもアクセスする。
【００１４】
本発明の教示を組み込むコンパイラ３４は、ターゲットマイクロプロセッサシステム上で実行されるネイティブコンパイラ、または別のマイクロプロセッサシステム上で実行されるクロスコンパイラを構成することができる。本発明の一実施形態によれば、コンパイラのターゲットマイクロプロセッサは、同じタイプの複数の機能ユニットを有する。たとえば、マイクロプロセッサは、スーパースカラアーキテクチャを有する機能ユニットを含む場合がある。
【００１５】
次に図３Ａおよび図３Ｂを参照すると、これらブロック図はコンパイラの一実施形態を示す。図３Ａに示すように、本実施形態では、コンパイラ３４は、本発明の教示に組み込まれるパーサ３８、中間表現ビルダ４０、およびコードジェネレータ４２を備える。パーサ３８は、コンパイルすべきプログラムのソースコードを入力として受け取る。これに応答して、パーサ３８はソース言語ステートメントをオペランド解析し、トークン分割されたステートメントを出力する。中間表現ビルダ４０は、トークン分割されたステートメントを入力として受け取る。これに応答して、中間表現ビルダ４０は、トークン分割されたステートメントの中間表現を構築する。コードジェネレータ４２は、中間表現を入力として受け取る。これに応答して、コードジェネレータ４２は、プログラムのオブジェクトコードを生成する。コンパイラ３４は、他の実施形態により別様に構成されることができる。
【００１６】
図３Ｂに示すように、本実施形態では、コードジェネレータ４２は、トランスレータ４４、オプティマイザ４６、レジスタアロケータ４８、ループアンローラ５０、スケジューラ５２、およびアセンブリコードジェネレータ５４を備えるように構成される。トランスレータ４４は、中間表現を入力として受け取る。これに応答して、トランスレータ４４はループテーブルの構築、命令ブロックの順序付け、およびデータフローグラフの構築等を行う。オプティマイザ４６は、中間表現、並びに、ループテーブルおよびデータフローグラフを含む関連情報を入力として受け取る。これに応答して、オプティマイザ４６は様々な最適化を実行する。レジスタアロケータ４８は、最適化された中間表現および関連情報を入力として受け取る。これに応答して、レジスタアロケータ４８は、ターゲットマイクロプロセッサのレジスタを生成中の命令に割り当てる。ループアンローラ５０は、レジスタが割り当てられた、最適化された中間表現、および関連情報を入力として受け取る。これに応答して、ループアンローラ５０は、生成中の命令を再構成し、ターゲットマイクロプロセッサにおいて利用可能な資源に呼応した最適な時間量に関して、生成中の命令の中のループをアンロールする。スケジューラ５２は、再構成された中間表現および関連情報を入力として受け取る。これに応答して、スケジューラ５２は、生成すべき命令を並列処理に向けてさらに再構成する。最後に、アセンブリコードジェネレータ５４は、最適化され、レジスタが割り当てられ、かつ再構成された中間表現および関連情報を入力として受け取る。これに応答して、アセンブリコードジェネレータ５４は、コンパイル中のプログラムのオブジェクトコードを生成する。コードジェネレータ４２は、他の実施形態により別様に構成されることができる。
【００１７】
理解を容易にするために、コードジェネレータ４２は、生成中の命令の中のループをアンロールし、並列化用に命令をスケジューリングする前にレジスタを割り当てるものとして、上記実施形態とともに説明されているが、上記説明に基づいて、本発明は、異なるレジスタ割り当て、ループアンロール、およびスケジューリング順序を有するレジスタ割り当て、ループアンロールおよびスケジューリング手法を使用して実施することができることが理解されよう。
【００１８】
図４は、本発明の一実施形態による命令をスケジューリングする方法（４００）を示す高レベルフローチャートである。方法（４００）は、たとえば、図３Ａに示すコンパイラのコードジェネレータ４２を使用して実行することができる。
【００１９】
図４の方法（４００）によれば、事前ステップは、診断演算のテストパターンおよび関連する既知の結果を事前に決定すること（４０１）を含むことができる。ＣＰＵレジスタのパターンテストは、潜在的な故障およびデータ従属ウィークセルの判断に役立つように使用することができる。顧客が使用するために出荷されるＣＰＵチップに「許容可能な」潜在的欠陥率があることは既知である。これは、あらゆるＣＰＵチップに完全にバーンインする（既知の「バスタブ曲線」の左側を越えて）ことはコストが法外であるためである。好ましくは、テストパターンは、テスト下のレジスタのあらゆる回路要素を適当に機能させることについて有効な試行を提供するように選択される。レジスタの特定のパターンテストは、弱点における故障をより素早く判断するために使用することができる。テストパターンは、たとえば、テスト下のレジスタへの一連の書き込みおよび読み取り命令、および読み出されたデータを期待される結果と比較することを含んでよい。たとえば、テストパターンは、すべて１のビット、すべて０のビット、および／または「チェッカー盤」データパターン（すなわち、１と０が交互になったもの）を書き込んで読み取ることを含んでよい。テストパターンは、テスト下のレジスタを通して１ビットまたは０ビットを「歩く」ことも含んでよい。制御レジスタの場合、テストパターンは、レジスタを特定の値に設定すること、および期待される制御機能が実行されるか否かをチェックして調べることを含んでよい。
【００２０】
方法（４００）により実行されるスケジューリング（４０４）は、レジスタ診断テストの可変積極性レベルによって決まる場合がある。この積極性レベルは事前に設定することができる（４０２）。一実施形態では、積極性レベルは１つまたは複数の可変コンパイラフラグ（複数可）を使用して実施することができる。たとえば、可変フラグはテストの頻度を指定することができる。別の例として、可変フラグは最大パフォーマンスオーバヘッド量を指定することができる。積極性レベルを制御可能に変化させることにより、ユーザはパフォーマンスと耐故障性の間でトレードオフを行うことができる。所望の積極性レベルは、たとえば、コンパイル中のアプリケーションおよびそのアプリケーションの特定の所期の用途によって決まる場合がある。高いパフォーマンスを必要とするアプリケーションの場合、低量のテストを実行することができる。最大のアップタイムまたは耐故障性を必要とするアプリケーションの場合、（いくらかのパフォーマンスの低下を犠牲にして）より高いレベルのレジスタテストをスケジューリングすることができる。アプリケーションはまた、積極性が非常に高く設定されている場合、「ＮＯ−ＯＰＳ」で満たされたプログラムを書き込むことも想定する。コンパイル後、このプログラムをしばしば実行して、ＣＰＵレジスタの「健康状態チェック」を行うようにスケジューリングすることができる。これにより、比較的未習熟なユーザがかなり機能的な診断プログラムを書くことが可能になる。
【００２１】
本発明の一実施形態によれば、実行されるスケジューリング（４０４）は、ユーザコード命令のスケジューリングおよび日和見的なレジスタ診断のスケジューリングの両方を含む。言い換えれば、コンパイル時に、コンパイラは、テストがユーザコードの通常実行中に行われるようにレジスタのテストをスケジューリングする。テストは、受けるパフォーマンスオーバヘッドの量を低減するように、コンパイラにより日和見的かつ知的にスケジューリングすることができる。このスケジューリングについては図５に関連して以下さらに述べる。このスケジューリングは、ユーザコードが完全にスケジューリングされたという判断（４０６）が下されるまで実行される。その後、スケジューリングが完了した（４０８）と考えることができる。
【００２２】
図５は、本発明の一実施形態によりレジスタ診断命令が日和見的にスケジューリングされるプロセスの一例（４０４）を示すフローチャートである。図５に示すプロセス（４０４）は、説明を目的とした単純なプロセスであることに留意されたい。実施される実際のプロセスはこのような単純な流れを有さない場合がある。
【００２３】
事前ステップは、レジスタをテストする順序を事前に決定する（５０１）ために使用することができる。順序は、テストするすべてのレジスタが確実に同じレベルのテストを受けるように、ラウンドロビンまたは他のアルゴリズムによって決定することができる。
【００２４】
図５のプロセス（４０４）により、テストする次のレジスタが選択される（５０２）。この選択は、上記のテスト順序に従って行うことができる。レジスタ診断をスケジューリングする十分な機会があるか否かについて判断（５０４）することができる。十分な機会がない場合、コンパイル中のユーザプログラムからの命令（複数可）がスケジューリングされる（５０６）。このコンパイル中のプログラムからの命令のスケジューリングは、好ましくは、レジスタ診断テストが実行されることを知った上で実行される。このような知識を有することにより、コンパイラは、同じレベルのテストであらゆるレジスタをスケジューリングする機会が提示されるように、レジスタの使用をスケジューリングすることができる。診断テストに十分な機会がある場合、レジスタ診断がスケジューリングされる（５０８）。
【００２５】
図６は、６４ビットマイクロプロセッサの一例のレジスタを示す概略図である。マイクロプロセッサ例は、ＩＡ−６４アーキテクチャを有するＩｎｔｅｌマイクロプロセッサを含む。図示のユーザレベルのレジスタファイルは、汎用レジスタファイル、浮動小数点レジスタファイル、述語レジスタファイル、分岐レジスタファイル、アプリケーションレジスタファイル、および他のレジスタを含む。他のマイクロプロセッサは異なるレジスタファイルを当然実装する。
【００２６】
汎用レジスタファイルは、たとえば、スタティックレジスタおよびスタックレジスタに分けることができる。レジスタスタックは、マイクロプロセッサの複数の汎用レジスタを含んでよい。これら複数の汎用レジスタは、マイクロプロセッサにより実行されている記憶プログラムの手続きを必要とする、またこの手続きに関係するデータを記憶するように設計されている。具体的には、特定の手続きを実行すると、その手続きに関連するスタックフレームがレジスタスタック内に作成される。このスタックフレームは、保存されたレジスタ（関連する手続きにローカルな変数を含む）、アクティベーションレコード、およびフレームマーカを含む。ある手続きがさらなる手続きを呼び出すと、呼び出された手続きは次に、呼び出した側の手続きのスタックフレームの上にさらなるスタックフレームを作成する。したがって、複数の入れ子状の手続きが実行されているプログラムの場合、レジスタスタックは、対応する数のスタックフレームを含んでよい。したがってレジスタスタックは、関連するスタックフレームをオンチップレジスタおよびオフチップメモリの両方にスタックすることにより、複数の手続きが大きなレジスタファイルを有効に共有できるようにする。一般的なプログラムの呼び出し／復帰パターンは、高頻度の小規模呼び出し／復帰を示す。レジスタスタックは、手続き呼び出し時の書込み（すなわち、レジスタ保存）回数を大幅に低減し、また、手続き復帰時の読出し（すなわち、レジスタ復元）回数を低減する。
【００２７】
図７は、本発明の一実施形態によりスケジュールする（５０８）ことができるレジスタの診断テストプロセスの一例を示すフローチャートである。図７に示すプロセス（５０８）は、説明を目的とした単純なプロセスであることに留意されたい。実施される実際のプロセスは、このような単純な流れを有さない場合がある。
【００２８】
図７のプロセス（５０８）によれば、既知のデータをテスト下のレジスタに書き込む（７０２）ことができる。上に述べたように、既知のデータは所定（４０１）のテストパターンの一部であってよい。たとえば、既知のデータは、０と１のチェッカー盤パターンであってよい。その後、データをテスト下のレジスタから読み取る（７０４）ことができる。
【００２９】
次に、読み取られたデータと期待されるデータ（すなわち、既知のデータ）の比較（７０６）を行うことができる。判断（７０８）は、比較データが同じであるか否かに関して行われることができる。比較データが同じである場合、エラーは示されず、命令の実行が続行される（７１０）。同じではない場合、レジスタのエラーが示され、故障ハンドラへのジャンプ（７１２）を行うことができる。
【００３０】
故障ハンドラは適当な処置をとるように構成することができる。一実施形態によれば、この処置は、ユーザデータに影響が及び、かつ考えられるデータ不良が起こり得る前にシステムを停止させることを含む。別の実施形態では、処置は、レジスタを役に立たないものとマークし（以後使用しないように）、そのレジスタに対するすべてのアクティビティを代替のレジスタに再マッピングすることを含む。再マッピングは、ＣＰＵに追加されるハードウェア回路を用いて実行することができる。
【００３１】
本発明の一実施形態は、従来行われていたものに対して様々な利点を提示する。第１に、ユーザデータが影響を受け、サイレントデータ不良またはマシンチェックおよびシステム故障が引き起こされる前に、診断によりレジスタ中の潜在的なエラーまたは弱ラッチを見つけることができる。第２に、特定のパターンテストを使用することにより、弱点を素早く探り、故障をより素早く判断することができる。第３に、レジスタ診断テストはコンパイラにより日和見的かつ知的にスケジューリングされることから、受けるパフォーマンスオーバヘッドを最小限に抑えることができる。
【００３２】
上記説明において、本発明の実施形態の完全な理解を提供するためにいくつかの特定の詳細が提供されている。しかし、本発明の例示的な実施形態の上記説明は、網羅的、すなわち本発明を開示された厳密な形態に限定するものと意図していない。当業者は、特定の詳細のうちの１つまたは複数なしで、または他の方法、構成要素等を使用して本発明を実施することができることを理解しよう。一方、既知の構造または動作については、本発明の態様を曖昧にしないように詳細に図示または説明していない。本発明の特定の実施形態および本発明の実施例が例示を目的として本明細書において述べられているが、当業者は、本発明の範囲内で様々な等価的な変更が可能であることを理解しよう。
【００３３】
こういった変更は、上記詳細な説明を鑑みて本発明に対して行うことが可能である。添付の特許請求の範囲において使用される用語は、本発明を、本明細書および特許請求の範囲に開示される特定の実施形態に限定するものと解釈すべきではない。むしろ、本発明の範囲は、特許請求の範囲の解釈の確立されている原則に従って解釈すべき添付の特許請求の範囲によって規定されるべきである。
【図面の簡単な説明】
【００３４】
【図１】図１は、本発明を具現することができるＣＰＵおよび従来のメモリを含む、コンピュータの一部を示す図である。
【図２】図２は、図１に例示されたコンピュータシステムのソフトウェア要素の例を示す図である。
【図３Ａ】図３Ａは、一例におけるコンパイラの構成要素を示すブロック図である。
【図３Ｂ】図３Ｂは、一例におけるコードジェネレータの構成要素を示すブロック図である。
【図４】図４は、本発明の一実施形態による命令をスケジューリングする方法を示す高レベルフローチャートである。
【図５】図５は、本発明の一実施形態による、レジスタ診断命令が日和見的にスケジューリングされるプロセスの一例を示すフローチャートである。
【図６】６４ビットマイクロプロセッサの一例のレジスタファイルを示す概略図である。
【図７】図７は、本発明の一実施形態によりスケジューリングすることができるレジスタを診断テストするプロセスの一例を示すフローチャートである。
【符号の説明】
【００３５】
４・・・メモリ
２６・・・アプリケーション
３２・・・オペレーティングシステム
３４・・・コンパイラおよび実行時ライブラリ
３８・・・パーサ
４０・・・中間表現ビルダ
４２・・・コードジェネレータ
４４・・・トランスレータ
４６・・・オプティマイザ
４８・・・レジスタアロケータ
５０・・・ループアンローラ
５２・・・スケジューラ
５４・・・アセンブリジェネレータ
【図１】
2005122738.tif 000003
【図２】
2005122738.tif 000004
【図３Ａ】
2005122738.tif 000005
【図３Ｂ】
2005122738.tif 000006
【図４】
2005122738.tif 000007
【図５】
2005122738.tif 000008
【図６】
2005122738.tif 000009
【図７】
2005122738.tif 000010