(57)【特許請求の範囲】
【請求項１】
コンピュータに、
不揮発性メモリに設定された第１の変数領域と第２の変数領域を認識する機能と、
前記第１の変数領域にプリブートに不可欠な構成データを書き込む機能と、
前記第２の変数領域にシステム・ファームウェアが定義しオペレーティング・システムによる書き換えが可能な公開データを書き込む機能と、
前記オペレーティング・システムからのリクエストに応じて前記第２の変数領域にユーザ・データを書き込む機能と、
前記プリブートを終了したあとの前記第１の変数領域に対する書き込みを制限する機能と
を実現させるためのシステム・ファームウェア。
【請求項２】
前記書き込みを制限する機能が、前記第１の変数領域に接続されたインターフェース・コントローラをライト・ロックする機能を含む請求項１に記載のシステム・ファームウェア。
【請求項３】
前記書き込みを制限する機能が、前記オペレーティング・システムによる前記構成データを更新するためのリクエストを無効にする機能を含む請求項１または請求項２に記載のシステム・ファームウェア。
【請求項４】
前記プリブートの間に前記第２の変数領域の残容量を確認する機能と、
前記残容量が所定値未満になったときに前記第２の変数領域をクリーン・アップすることを示す画面を表示する機能と、
前記クリーン・アップの指示を受け取ったときに前記ユーザ・データを消去する機能と
を有する請求項１に記載のシステム・ファームウェア。
【請求項５】
前記構成データと前記公開データのデフォルト値を格納する第３の変数領域を認識する機能と、
前記プリブートの間に前記構成データおよび前記公開データのそれぞれと前記デフォルト値を比較する機能と、
いずれかの前記構成データまたは前記公開データが消去されたと判断したときに前記デフォルト値を前記第１の変数領域または前記第２の変数領域に書き込む機能と
を有する請求項１に記載のシステム・ファームウェア。
【請求項６】
前記システム・ファームウェアがＵＥＦＩ規格に適合し、前記公開データは前記ＵＥＦＩ規格が定義するグローバル・バリアブルズである請求項１に記載のシステム・ファームウェア。
【請求項７】
前記プリブートの間に前記第２の変数領域に記録された前記グローバル・バリアブルズのなかでブートに関連するグローバル・バリアブルズのパラメータに対する改変の有無を判断する機能と、
前記パラメータが改変されたと判断したときにデフォルト値を書き込む機能と
を含む請求項６に記載のシステム・ファームウェア。
【請求項８】
前記ブートに関連するグローバル・バリアブルズが、Boot####、BootOrder、Drive####、DriveOrder、およびKey####である請求項７に記載のシステム・ファームウェア。
【請求項９】
前記オペレーティング・システムが、前記ＵＥＦＩ規格に対応してＵＥＦＩネイティブ・モードで動作する請求項６に記載のシステム・ファームウェア。
【請求項１０】
ＵＥＦＩ規格に適合するシステム・ファームウェアと、プリブートに不可欠なコンフィグレーション・バリアブルズと、前記ＵＥＦＩ規格が定義するグローバル・バリアブルズと、前記ＵＥＦＩ規格に対応するオペレーティング・システムが作成したユーザ・バリアブルズを格納する不揮発性メモリを実装したコンピュータに、
前記コンフィグレーション・バリアブルズ、前記グローバル・バリアブルズ、または前記ユーザ・バリアブルズのいずれかに対する書き換えのリクエストを受け取る機能と、
プリブート中か否かを判断する機能と、
前記プリブート中だと判断したときに前記リクエストを処理する機能と、
前記プリブートが終了したと判断したときに前記コンフィグレーション・バリアブルズの書き換えを無効にする機能と
を実現させるためのシステム・ファームウェア。
【請求項１１】
前記プリブートが終了したと判断したときに前記グローバル・バリアブルズおよび前記ユーザ・バリアブルズに対する書き換えのリクエストを処理する機能を含む請求項１０に記載のシステム・ファームウェア。
【請求項１２】
ＵＥＦＩ規格に適合するシステム・ファームウェアを格納する不揮発性メモリを実装したコンピュータの動作不良を防止する方法であって、
プリブートに不可欠なコンフィグレーション・バリアブルズを前記不揮発性メモリの第１の記録領域に書き込むステップと、
前記ＵＥＦＩ規格が定義するグローバル・バリアブルズを前記不揮発性メモリの第２の記録領域に書き込むステップと、
前記ＵＥＦＩ規格に対応するオペレーティング・システムから受け取ったリクエストに応じてユーザ・バリアブルズを前記不揮発性メモリの第３の記録領域に書き込むステップと、
前記プリブートが終了した後の前記オペレーティング・システムから前記第１の記録領域に対するアクセスを制限するステップと
を有する方法。
【請求項１３】
プロセッサと、ＵＥＦＩコードを格納した不揮発性メモリと、ＵＥＦＩ規格に適合するオペレーティング・システムを格納したディスク・ドライブとを有するコンピュータであって、前記不揮発性メモリが、
プリブートに不可欠な構成データを書き込む第１の記録領域と、
前記ＵＥＦＩ規格が定義するデータと、前記オペレーティング・システムが作成したユーザ・データとを書き込む第２の記録領域と、
前記プリブートが終了した後の前記オペレーティング・システムから前記第１の記録領域に対する書き込みを制限する手段と
を有するコンピュータ。
【請求項１４】
前記書き込みを制限する手段が、前記不揮発性メモリのインターフェース・コントローラを含む請求項１３に記載のコンピュータ。
【請求項１５】
前記第２の記録領域が、前記ＵＥＦＩ規格が定義するデータの記録領域と前記ユーザ・データの記録領域に分割されている請求項１３に記載のコンピュータ。
【請求項１６】
プロセッサと、ＵＥＦＩ規格に適合するオペレーティング・システムを格納したディスク・ドライブとを有するコンピュータであって、
プリブートに不可欠な構成データを格納する第１の記録領域と、前記ＵＥＦＩ規格が定義するデータを格納する第２の記録領域とを含む第１の不揮発性メモリと、
前記オペレーティング・システムが作成したユーザ・データを書き込む第２の不揮発性メモリと、
前記プリブートが終了した後の前記オペレーティング・システムから前記第１の記録領域に対する書き込みを制限する手段と
を有するコンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータの動作不良を防止する技術に関し、さらには、ＵＥＦＩ（Unified Extensible Firmware Interface）規格に適合するコンピュータのブートの信頼性を高める技術に関する。
【背景技術】
【０００２】
コンピュータのファームウェアは、ハードウェアとオペレーティング・システム（ＯＳ）、デバイス・ドライバまたはアプリケーションなどの上位のプログラムとの間のインターフェースを提供するコードである。ファームウェアは、周辺デバイスを専用に制御するデバイス・ファームウェアとシステム全体の動作にかかわるシステム・ファームウェア（プラットフォーム・ファームウェアともいう。）に分けることができる。
【０００３】
システム・ファームウェアは通常マザーボードに取り付けられた不揮発性メモリ（ＮＶＲＡＭ）に格納されている。ＢＩＯＳはこれまで多くのコンピュータ・システムに実装されてきたシステム・ファームウェアで、コンピュータの電源が起動してからＯＳがロードを開始するまでの間にＰＯＳＴ（Power On Self Test）およびパスワード処理をしたり、ハードウェアにアクセスする為のサービスを提供したりする。
【０００４】
しかしＢＩＯＳは、近年の進化したハードウェアに対する対応が困難になってきたため、非特許文献１に示すように、ＵＥＦＩフォーラムが、従来のＢＩＯＳであるレガシーＢＩＯＳに代わる新しいシステム・ファームウェアとしてＵＥＦＩ規格を策定した。ＵＥＦＩファームウェアは、レガシーＢＩＯＳをエミュレートして互換性を保つための仕組みを取り入れており、ハードウェアとソフトウェアは過去数年かけてレガシーＢＩＯＳからＵＥＦＩファームウェアに対応できるように段階的に発展してきた。２０１１年４月には非特許文献１に示す最新バージョンのＵＥＦＩ規格が策定され、ハードウェアもほぼ対応できるようになってきたこともあって現在のシステムはＵＥＦＩファームウェアへの完全移行段階に入ってきている。
【０００５】
ＵＥＦＩファームウェアを実装するシステムではＵＥＦＩネイティブ・モードで動作するＵＥＦＩ対応のＯＳと、レガシーＢＩＯＳ互換モードで動作するＵＥＦＩ非対応のＯＳのいずれも動作することができる。Ｗｉｎｄｏｗｓ（登録商標）７はＵＥＦＩネイティブ・モードに対応しているが、ＵＥＦＩファームウェアの高速ブート、セキュア・ブートなどの機能を利用することはできない。Ｗｉｎｄｏｗｓ（登録商標）８ではＵＥＦＩファームウェアに完全移行してその機能を完全に利用できるようになっている。
【０００６】
非特許文献１のＵＥＦＩ仕様には、７．２にバリアブル・サービス（Variable Services）を規定している。バリアブル・サービスでは、不揮発性のメモリにＵＥＦＩ仕様で定義した変数であるグローバル・バリアブルズ（ＧＶ：Global Variables）を格納することにしている。現在ほとんどのパーソナル・コンピュータ（ＰＣ）では、ＵＥＦＩを格納する不揮発性メモリにＧＶを記録している。ＵＥＦＩ仕様では、ベンダーがＵＥＦＩ仕様で定義されたＧＶ用のユニークな識別子（VendorGuidおよびVariableName）を使って、当該不揮発性メモリに独自のＧＶを書き込んでもよいとしている。また、ＯＳがＵＥＦＩ仕様で定義したＧＶを書き換えることを許容している。特許文献１はＵＥＦＩファームウェアが使用する変数をプロテクトして不揮発性メモリに記憶する発明を記載している。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１０−７３１９３号公報
【非特許文献】
【０００８】
【非特許文献１】Unified Extensible Firmware Interface Specification Version 2.3.1 April 6,2011
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ところで、レガシーＢＩＯＳやＵＥＦＩファームウェアなどのシステム・ファームウェアは、ブートの際にデバイスの認識や初期化などの処理をするために、電源の起動直後にアクセスが可能な不揮発性メモリに書き込んだデータを参照する必要がある。以後このようなブートに不可欠なデータ（変数）を、本明細書においてコンフィグレーション・バリアブルズ（ＣＶ：Configuration Variables）ということにする。
【００１０】
ＣＶはプリブート段階でＵＥＦＩがデバイスに設定するデバイスの属性情報およびデバイスに設定するパラメータ、セット・アップ画面を呼び出してユーザが設定したデバイスの種類、デバイスの動作モード、およびデバイスの有効／無効などの設定情報、ブート・イメージが格納されているパーティションのパスやロードするＯＳの種類などの情報を含む。ＣＶの多くは、従来、ボタン電池で電源をサポートしているＣＭＯＳに記録されていたが、近年はＵＥＦＩを格納するセキュアな不揮発性メモリにも書き込むようになってきた。
【００１１】
また、ＯＳ、ＵＥＦＩアプリケーション、およびＯＳアプリケーションはその実行に際して、自らをカスタマイズするための環境変数、デバッグ・ログ、またはエラー・ログのようなダンプ・ファイルをＵＥＦＩファームウェアの仕様上の制約を受けないで自由に不揮発性メモリに書き込むことができる。このようなＯＳ、ＵＥＦＩアプリケーション、およびＯＳアプリケーションが作成したデータを本明細書においてユーザ・バリアブルズ（ＵＶ：User Variables）ということにする。
【００１２】
図９はシステム・ファームウェアが管理するデータの記録方法の変遷を説明する図である。図９（Ａ）はシステム・ファームウェアがレガシーＢＩＯＳのときに、ＢＩＯＳコードをファームウェアＲＯＭ５０１に格納し、ＣＶ、ＧＶをボタン電池による電力のサポートがあるＣＭＯＳ５０３、またはセキュアな不揮発性メモリに記録する様子を示している。レガシーＢＩＯＳには、ＵＥＦＩのバリアブル・サービスに対応するサービスがないため、ＵＶはＨＤＤまたはＳＳＤのような外部記憶装置５０５に記録している。
【００１３】
図９（Ｂ）は、システム・ファームウェアがＵＥＦＩファームウェアのときに、レガシーＢＩＯＳ互換モードで動作するＵＥＦＩ非対応のレガシーＯＳが動作するときの様子を示している。ファームウェアＲＯＭ５０１は、ＵＥＦＩコードを格納するコード領域５０１ａと変数を記録する変数領域５０１ｂを含み、コード領域５０１ａにはＵＥＦＩコードを格納する。レガシーＢＩＯＳ互換モードで動作するＵＥＦＩ非対応のレガシーＯＳは、ＵＥＦＩ規格が提供するバリアブル・サービスを利用できないため変数領域５０１ｂには、ＵＥＦＩファームウェアによってＣＶ、ＧＶが記録されるだけで、レガシーＯＳまたはＯＳアプリケーションが書き込んだＵＶは、ＨＤＤまたはＳＳＤなどの外部記憶装置５０５に記録される。また、レガシーＢＩＯＳ互換モードで動作するときは、ＣＰＵの動作モードが切り換わってＵＥＦＩアプリケーションは動作できなくなるため、ＵＥＦＩアプリケーションが変数領域５０１ｂにＵＶを書き込むこともない。
【００１４】
図９（Ｃ）はシステム・ファームウェアがＵＥＦＩファームウェアのときに、ＵＥＦＩネイティブ・モードで動作するＵＥＦＩ対応のＯＳが動作するときの様子を示している。ＵＥＦＩネイティブ・モードで動作するＯＳは、ＵＥＦＩ規格が提供するバリアブル・サービスを利用できるため変数領域５０１ｃにはＣＶ、ＧＶと、ＵＥＦＩアプリケーション、ＯＳ、ＯＳアプリケーションが書き込んだ多量のＵＶを記録している。
【００１５】
いずれのプログラムであっても、バリアブル・サービスを利用して変数領域５０１ｃにデータを書き込むためには、ＵＥＦＩの関数であるSetVariable()を呼び出してパラメータを設定する必要がある。レガシーＢＩＯＳ互換モードで動作するレガシーＯＳはバリアブル・サービスを利用することができなかったが、ＵＥＦＩ規格では変数領域５０１ｃの利用に制限を設けていないため、ＵＥＦＩネイティブ・モードで動作するＯＳおよびＯＳアプリケーションは、バリアブル・サービスを利用して変数領域５０１ｃに自由に多量のＵＶを書き込むことができる。
【００１６】
システム・ファームウェアの動作環境がレガシーＢＩＯＳからＵＥＦＩに完全に移行して変数領域５０１ｃがＯＳおよびＯＳアプリケーションに解放されたことに伴って、最近、ブートに関連するいくつかの問題が明らかになってきた。まず、ＵＶを書き込むＯＳやＯＳアプリケーションが、SetVariable()に誤ってＣＶやＧＶの変数の名称（VariableName）や識別子（VendorGuid）を設定すると、ＣＶやＧＶが書き換えられてしまうことがある。また、マルウェアによっても意図的にＣＶやＧＶが書き換えられたり消去されたりしてしまう危険性がある。ＣＶはプリブートでハードウェアを構成するために不可欠なデータであり、さらにＧＶもプリブートに関連するデータを含むため、誤って書き換えられるとシステムをブートできなくなりユーザによる復旧作業が困難になる。
【００１７】
ここでプリブートとは、システムがＡＣＰＩに規定するパワー・オフ状態（Ｓ５ステート）またはハイバネーション状態（Ｓ４）のときに、電源が起動してからＯＳがロードを開始するまでの間に、プロセッサがシステム・ファームウェアを実行している動作環境でのシステム・ファームウェアの処理をいう。また本明細書でブートとは、電源が起動してからプリブートを経由してＯＳおよびＯＳアプリケーションのロードが完了した状態になるまでの処理をいうことにする。
【００１８】
ＵＥＦＩ規格では、SetVariable()に設定するパラメータをハッシュして書き込み保護をする認証サービス（Variable Authentication）を提供する。認証サービスを利用すればＯＳまたはＯＳアプリケーションによるＣＶへの上書きを防ぐことはできる。しかし、ＯＳまたはＵＥＦＩアプリケーションがコード領域５０１ｃにアクセスしているときに電源の瞬断などによって電気的なノイズが発生すると、ＣＶやＧＶが毀損する可能性がある。
【００１９】
またＵＥＦＩ規格では、ＯＳやＯＳアプリケーションがＧＶを書き換えることを許容するため、認証サービスではＧＶを保護することはできない。ＧＶは、Boot####、BootOrder、Drive####、DriveOrder、Key####などの名称の起動ディスクの種類や優先順位などに関するブート関連データや、Conin、Conoutといった入出力コンソールまでのパスに関するデータを含みＵＥＦＩ規格で定義している。ＧＶのブート関連データがＯＳやＯＳアプリケーションで誤って書き換えられたり、電源ノイズで毀損したりするとブートできなくなることも予想される。
【００２０】
さらに、変数領域５０１ｃの容量は一例で１６ＭＢといったように、ＨＤＤやＳＳＤに比べて遙かに小さいため、多量のＵＶが書き込まれて変数領域５０１ｃが容量不足になると、プリブート中にＵＥＦＩファームウェアがＣＶやＧＶを更新できないため結果としてブート不能に陥ることも予想される。さらに、ＣＶやＧＶが予期しない原因でＯＳやＯＳアプリケーションによって消去されてしまうことも予想される。その場合少なくとも、ＣＶやＧＶをデフォルト値に戻したり、起動ディスクを変更したりするためのセット・アップ画面まではプリブートが到達できるようにしておくことが望ましい。
【００２１】
本発明は、システム・ファームウェアに関する上述の諸問題を解決することを目的とする。そこで本発明の具体的な目的は、システム・ファームウェアが管理するデータに起因するシステムの動作不良を防止する方法を提供することにある。さらに本発明の目的は、ＵＥＦＩネイティブ・モードで動作するＯＳの動作環境下で生ずるシステムの動作不良を防止する方法を提供することにある。さらに本発明の目的は、ＯＳおよびマルウェアによるＣＶの書き換えを防止する方法を提供することにある。さらに本発明の目的は、ＧＶがＯＳおよびマルウェアによって書き換えられたときに修復する方法を提供することにある。さらに本発明の目的は、そのような方法を実現するコンピュータ・プログラムおよびコンピュータを提供することにある。
【課題を解決するための手段】
【００２２】
本発明は、システム・ファームウェアが管理するデータに起因するシステムの動作不良を防止する方法を提供する。システム・ファームウェアが管理するデータは、プリブートに不可欠な構成データ、システム・ファームウェアが定義しＯＳによる書き換えが可能な公開データおよびＯＳが作成したユーザ・データで構成されている。システム・ファームウェアは、不揮発性メモリの第１の変数領域に構成データを記録し、第２の変数領域に公開データおよびユーザ・データを記録する。システム・ファームウェアは、プリブートを終了した後の第１の変数領域に対する書き込みを制限する。
【００２３】
このような構成によれば、第２の変数領域にユーザ・データを書き込む際にＯＳが誤って、あるいはマルウェアが故意に第１の変数領域の構成データを書き換える危険性を排除してプリブートの信頼性を向上させることができる。第１の変数領域に対する書き込み制限は、不揮発性メモリのインターフェース・コントローラに対してハードウェア的にライト・ロックをかけて行うことができる。ライト・ロックを施すことで、システム・ファームウェアまたはＯＳが不揮発性メモリにアクセスする際に、電源が不安定になってノイズが発生しても第１の変数領域の構成データが書き換えてしまう危険性を排除することができる。
【００２４】
第１の変数領域に対する書き込みの制限は、第１の変数領域の構成データを更新するためのＯＳからのリクエストをシステム・ファームウェアが無効にすることでソフトウェア的に行うこともできる。システム・ファームウェアは、プリブートの間に第２の変数領域の残容量を確認し、残容量が所定値未満になったときに第２の変数領域をクリーン・アップすることを示す画面を表示し、クリーン・アップの指示を受け取ったときにユーザ・データを消去することができる。その結果、第２の変数領域がユーザ・データで溢れて、公開データの書き込みまたは更新ができなくなる自体を防ぐことができる。
【００２５】
構成データと公開データのデフォルト値を第３の変数領域に格納して、プリブートの間に構成データおよび公開データとデフォルト値を比較し、いずれかの構成データまたは公開データが消去されたと判断したときにデフォルト値を第１の変数領域または第２の変数領域に書き込むことができる。デフォルト値の書き込みは、消去されたデータだけについて行ってもよいし、フラッシュ・メモリの消去ブロックの単位に対して行ってもよい。
【００２６】
システム・ファームウェアがＵＥＦＩ規格に適合する場合は、公開データをＵＥＦＩ規格が定義するグローバル・バリアブルズとすることができる。このときＵＥＦＩは、プリブートの間に第２の変数領域に記録されたグローバル・バリアブルズのなかでブートに関するパラメータに対する改変の有無を判断し、パラメータが改変されたと判断したときにデフォルト値を書き込むことができる。
【００２７】
ＵＥＦＩ規格では、ＯＳおよびＯＳアプリケーションからのグローバル・バリアブルズに対する書き換えを許容するため、構成データのようにライト・プロテクトすることはできないが、ブートに関連するグローバル・バリアブルズのパラメータをデフォルト値に維持しておけば、セット・アップ画面に到達するまでプリブートを進めることができる。セット・アップ画面を表示できれば、起動ディスクを変更したりパラメータをデフォルト値に戻したりできるためユーザが動作不良を回復させることができる。
【００２８】
ブートに関するグローバル・バリアブルズは、Boot####、BootOrder、Drive####、DriveOrder、およびKey####とすることができる。このときのパラメータは、ロード・オプション（Load options）とすることができる。ＯＳは、第２の変数領域に自由にユーザ・データを書き込めるＵＥＦＩネイティブ・モードで動作することができる。第１の変数領域と第２の変数領域は、システム・ファームウェアを格納する不揮発性メモリに設けることができる。このとき、第２の変数領域は、公開データを記録する領域とユーザ・データを記録する領域にさらに分けることができる。また、公開データを記録する領域とユーザ・データを記録する領域は、構成データを記録する領域とは別のインターフェース・コントローラに接続された不揮発性メモリに設けることができる。
【発明の効果】
【００２９】
本発明により、システム・ファームウェアが管理するデータに起因するシステムの動作不良を防止する方法を提供することができた。さらに本発明により、ＵＥＦＩネイティブ・モードで動作するＯＳの動作環境下で生ずるシステムの動作不良を防止する方法を提供することができた。さらに本発明により、ＯＳおよびマルウェアによるＣＶの書き換えを防止する方法を提供することができた。さらに本発明により、ＧＶがＯＳおよびマルウェアによって書き換えられたときに修復する方法を提供することができた。さらに本発明により、そのような方法を実現するコンピュータ・プログラムおよびコンピュータを提供することができた。
【図面の簡単な説明】
【００３０】
【図１】ＰＣ１０の主要なハードウェアの構成を示す概略の機能ブロック図である。
【図２】ファームウェアＲＯＭ１００のデータ構造の一例を示す図である。
【図３】ＰＣ１０が実装するソフトウェアの実行状態における階層構造を示す図である。
【図４】ＵＥＦＩファームウェア１５０が変数領域に対するアクセスを制御する手順を示すフローチャートである。
【図５】変数制御コード１５０ｅによる変数領域１０５、１０７に対するアクセスを制御する手順を示すフローチャートである。
【図６】ファームウェアＲＯＭ１００が変数を格納する様子を示す図である。
【図７】ファームウェアＲＯＭ１００と他の不揮発性メモリ４００が変数を記録する様子を示す図である。
【図８】ファームウェアＲＯＭ１００のＵＶとＧＶを記録する領域を区分した状態を示す図である。
【図９】システム・ファームウェアが管理するデータの記録方法の変遷を説明する図である。
【発明を実施するための形態】
【００３１】
［ハードウェアの概略構成］
図１は、ノートブック型またはデスクトップ型のＰＣ１０の主要なハードウェアの構成を示す機能ブロック図である。多くのハードウェアの構成は周知であるため、本発明の理解に必要な範囲で説明する。チップセット１３はさまざまな規格のインターフェース機能を備えており、ＣＰＵ１１、システム・メモリ１５、ＧＰＵ１７、ＨＤＤ２１、ＵＳＢコネクタ２３、有線または無線のＬＡＮに接続するためのネットワーク・モジュール２５、およびキーボード２９などが接続されている。ＧＰＵ１７にはＬＣＤ１９が接続されている。チップセット１３にはさらに、ＳＰＩ（Serial Peripheral Interface）コントローラにはファームウェアＲＯＭ１００が接続されている。
【００３２】
ＨＤＤ２１は起動ディスクで、ＰＣ１０の、ＵＥＦＩ規格に対応するＯＳのブート・イメージを格納する。ＨＤＤ２１は、複数のパーティションにそれぞれＵＥＦＩ非対応のＯＳも含めて異なるブート・イメージを格納するようにしてもよい。ＨＤＤ２１のブート・セクタは、ＯＳのブート・イメージをロードするためのＯＳローダーを格納する。
【００３３】
ＵＳＢコネクタ２３には、外付けのＵＳＢメモリ、ＵＳＢ＿ＣＤ、ＵＳＢ＿ＦＤＤ、ＵＳＢ＿ＨＤＤなどのＵＳＢデバイスを接続することができる。ＰＣ１０は、ＵＳＢコネクタ２３に接続されたブート・イメージを格納するＵＳＢデバイスからブートすることもできる。ＰＣ１０は、ＰＸＥ（Preboot eXecution Environment）などの機能により、ネットワーク・モジュール２５を通じてＯＳのブート・イメージを受け取ってブートすることもできる。
【００３４】
［ファームウェアＲＯＭのデータ構造］
図２は、ファームウェアＲＯＭ１００のデータ構造を示す図で、図３はシステム・メモリ１５にロードされて実行状態にあるソフトウェアの階層構造を示す図である。ファームウェアＲＯＭ１００は、不揮発性で記憶内容の電気的な書き替えが可能なフラッシュ・メモリで、一例としてコード領域１０１、デフォルト領域１０３、変数領域１０５、１０７の４ブロックに区分している。
【００３５】
本実施の形態では、コード領域１０１、デフォルト領域１０３、および変数領域１０５には、チップセット１３のＳＰＩコントローラにおいてライト・ロックが可能な記録領域を割り当てている。ライト・ロックが実行された記録領域に対しては、チップセット１３がリセットされるまで書き込みができない。ただし、変数領域１０７はＵＥＦＩ規格でＯＳ１６７またはＯＳアプリケーション１６９による書き換えを保証しているＧＶを記録するためにライト・ロックはできない。
【００３６】
コード領域１０１はＵＥＦＩファームウェア１５０およびＵＥＦＩアプリケーション１６５を格納し、デフォルト領域１０３はＧＶとＣＶのデフォルト値を格納し、変数領域１０５は最新のＣＶを記録し、変数領域１０７はＵＶと最新のＧＶを記録する。デフォルト領域１０３が格納するＧＶとＣＶのデフォルト値は、ＰＣ１０の出荷前またはＵＥＦＩ１５０の更新時に書き込まれる。
【００３７】
ＵＥＦＩ１５０は、システムの動作環境の変化に応じてＣＶを更新する。ＵＥＦＩ規格では、ＧＶをＵＥＦＩアプリケーション１６５、ＯＳ１６７、ＯＳアプリケーション１６９にＧＶを参照または更新できるように公開することを規定している。したがって、変数領域１０５、１０７が記録するＧＶおよびＣＶは当初はデフォルト値であるが、ＰＣ１０がブートを繰り返す間に書き換えられたり追加されたりする。ＵＥＦＩ１５０以外のソフトウェアによってＣＶが意図的にまたは誤って書き換えられると、システムは次回のブートを正常に行うことができなくなる可能性がある。
【００３８】
ＵＥＦＩファームウェア１５０は、初期化コード１５０ａ、ランタイム・サービス１５０ｂ、ブート・マネージャ１５０ｃ、セット・アップ・コード１５０ｄ、変数制御コード１５０ｅ、レガシーＢＩＯＳ互換サービス１５０ｆ、およびＵＥＦＩドライバ１５０ｇを含む。ＵＥＦＩ１５０は、書き換えに伴うリスクを軽減するためにブート・ブロック方式を採用しており、初期化コード１５０ａを格納する領域をブート・ブロックに設定している。ブート・ブロックに格納されたコードはＴＰＭ（Trusted Platform Module）の仕様書に規定するＣＲＴＭ（Core Root Of Trust Measurement）として扱われ特別な権限がないと書き換えができないようになっている。
【００３９】
ＣＲＴＭは、プラットフォームの初期化コードの中で完全性が保証されている部分として構成され、プラットフォームのリセット時には必ず最初に実行されなければならない。ＣＲＴＭは、ＰＣ１０がＡＣＰＩに規定するハイバネーション状態（Ｓ４ステート）またはパワー・オフ状態（Ｓ５ステート）からパワー・オン状態（Ｓ０ステート）に遷移するための動作プロセスであるいわゆるコールド・ブートのときに必ず最初に実行される。
【００４０】
初期化コード１５０ａは、ＰＣ１０がコールド・ブートをする際に、システム・メモリ１５にＵＥＦＩファームウェア１５０をロードして実行を開始するために必要なＣＰＵ１１、システム・メモリ１５およびその他の基本的なデバイスの検出、検査および初期化を必要な範囲で行う。初期化コード１５０ａはまた、ＣＰＵ１１がリセットしてから、ＵＥＦＩ＿ＯＳローダー１６３に制御が移行するまでの期間にチップセット１３のコントローラや周辺デバイスなどの所定のデバイスを初期化して使用できる状態にする。初期化コード１５０ａは、コード領域１０１が格納する他のコードの一貫性または完全性を検査して改竄を発見した場合はブートを停止する。
【００４１】
ランタイム・サービス１５０ｂは、本実施の形態に関連するバリアブル・サービス、時刻情報のサービス、および仮想メモリ・サービスなどを提供する。ブート・マネージャ１５０ｃは、ブート処理およびパスワード認証処理などを行う。ブート・マネージャ１５０ｃは、ＧＶを参照してＵＥＦＩアプリケーション１６５、ＵＥＦＩドライバ１５０ｇおよびＵＥＦＩ＿ＯＳローダー１６３（レガシーＯＳ１７３をブートするときはレガシーＢＩＯＳ＿ＯＳローダー１７１）をシステム・メモリ１５にロードする。ブート・マネージャ１５０ｃは、プリブートが終了してＵＥＦＩファームウェア１５０からＯＳ１６７に制御が移る直前に、ＵＥＦＩ＿ＯＳローダー１６３をシステム・メモリ１５に読み出して完全性の検証をする。ＵＥＦＩ＿ＯＳローダー１６３には、それらを作成した作成者が計算したハッシュ値を秘密鍵で暗号化した電子署名が付されている。
【００４２】
ブート・マネージャ１５０ｃは、ＵＥＦＩ＿ＯＳローダー１６３のコードから計算したハッシュ値と、署名データ・ベースから取得した公開鍵で復号して得た電子署名のハッシュ値を比較して、一致していれば完全性が維持されていると判断してＵＥＦＩ＿ＯＳローダー１６３の実行を許可する。セット・アップ・コード１５０ｄは、プリブートの段階でキーボード２９の所定のファンクション・キーが押下されたたときに、ＬＣＤ１９にセット・アップ画面を表示する。ユーザはセット・アップ画面を通じて、起動ディスクの優先順位の決定、起動方法の設定、使用デバイスの設定、パスワードの設定およびパワー・マネジメントの設定などをすることができる。
【００４３】
セット・アップ・コード１５０ｄはセット・アップ画面を通じて入力された設定情報を変数領域１０５、１０７およびその他の記憶領域に書き込む。また一方で、セット・アップ・コード１５０ｄは、変数制御コード１５０ｅから呼び出されたときにＬＣＤ１９に変数領域１０７をクリーン・アップするか否かをユーザが判断するためのクリーン・アップ画面を表示する。セット・アップ・コード１５０ｄは、変数領域１０７に書き込まれたＵＶをユーザの指示でクリーン・アップするための処理をする。
【００４４】
セット・アップ・コード１５０ｄは、変数制御コード１５０ｅがブートに関するＧＶのパラメータの改変を発見したときに、変数制御コード１５０ｅの指示でそれらをデフォルト値に戻す処理をする。変数制御コード１５０ｅは、図４、図５の手順で説明するように変数領域１０５、１０７にＣＶ，ＧＶ、ＵＶを書き込む際の処理をする。レガシーＢＩＯＳ互換サービス１５０ｆは、ＵＥＦＩ非対応のレガシーＯＳ１７３に対するレガシーＢＩＯＳ互換のインターフェースを提供する。レガシーＯＳ１７３が、レガシーＢＩＯＳ互換のインターフェースを利用するときは、ＩＮＴ＊＊の割り込みルーチンを呼び出すが、そこにはバリアブル・サービスに関する割り込みルーチンを含まないため、レガシーＯＳ１７３はバリアブル・サービスを利用することはできない。したがって、レガシーＯＳ１７３は、変数領域１０７にＵＶを書き込むことはできない。
【００４５】
［変数領域の制御手順］
図４、図５は、ＵＥＦＩファームウェア１５０が変数領域１０５、１０７に対するアクセスを制御する手順を示すフローチャートである。ブロック２１１で、ＰＣ１０の電源が起動してシステムがコールド・ブートを開始する。このとき図６に示すように、変数領域１０５にはＣＶが記録され、変数領域１０７にはＧＶとＵＶが書き込みの順番に応じて混合した状態で記録されている。パワー・オン・リセットしたチップセット１３は、ブロック２１３でＳＰＩコントローラに設定していたファームウェアＲＯＭ１００のコード領域１０１、デフォルト領域１０３および変数領域１０５に対するライト・ロック機能を解除する。
【００４６】
変数領域１０５のライト・ロックが解除されるため、ＵＥＦＩファームウェア１５０はＣＶを追加したり更新したりしてプリブートを進めることができるようになる。つづいてブロック２１５で初期化コード１５０ａがプリブートに必要なデバイスを初期化すると、ＵＥＦＩファームウェア１５０、およびＵＥＦＩアプリケーション１６５がシステム・メモリ１５にロードされる。初期化コード１５０ａはつづいて変数領域１０５のＣＶを参照して、必要な範囲でその他のデバイスを初期化する。
【００４７】
ＯＳ１６７はシステムの変更に応じて新たなＧＶを書き込む場合がある。またＯＳ１６７やＵＥＦＩアプリケーション１６５は、新たなＵＶを変数領域１０７に書き込む場合がある。したがって、変数領域１０７の容量が不足すると、ＵＥＦＩファームウェア１５０がプリブートのために必要なＧＶを更新することができなくなってブート不能に陥る場合がある。ブロック２１９で変数制御コード１５０ｅは、変数領域１０７の容量がたとえば９０％といった満杯に近い状態かどうかを判断する。
【００４８】
変数制御コード１５０ｅが変数領域１０７の残容量が不足していると判断したときは、ブロック２２１に移行する。ブロック２２１で変数制御コード１５０ｅは、セット・アップ・コード１５０ｄを通じてＬＣＤ１９にクリーン・アップ画面を表示する。クリーン・アップ画面には、ファームウェアＲＯＭ１００が容量不足に陥っていること、この状態を継続するとブート不能になる可能性があること、すべてのＵＶを消去するための操作メニュー、ＵＶを消去したときに生ずる問題、およびＵＶの消去に伴う問題の解決方法などを表示することができる。
【００４９】
ブロック２２３でクリーン・アップ画面をみたユーザは、その時点でＵＶのバックアップデータをＨＤＤ２１に保存してからＵＶのクリーン・アップをしてもよいし、次回以降のブートでクリーン・アップをしてもよい。このとき変数制御コード１５０ｅは、後にＯＳ１６７、ＵＥＦＩアプリケーション１６５、およびＯＳアプリケーション１６９がＵＶを取得できるようにするために、消去するＵＶをＨＤＤ２１に記録してそのパスをＯＳ１６７に渡すようにしてもよい。
【００５０】
ＵＥＦＩ規格では、公開の必要なＧＶはライト・プロテクトをすることができないため、ＯＳ１６７およびＯＳアプリケーション１６９は誤ってＧＶを書き換える可能性がある。さらに、ＵＶとＧＶは同じ変数領域１０７に記録するため、変数領域１０７に対するアクセスの際に電源の瞬断でノイズが発生すると変数領域１０７が記録しているＧＶが破損する可能性もある。
【００５１】
ブロック２２５で、変数制御コード１５０ｅは、変数領域１０７が記録するＧＶのなかでブートに関連するBoot####、BootOrder、Drive####、DriveOrder、Key####という名称のＧＶが指定するロード・オプション（Load options）というパラメータがデフォルト値から変更されていないかどうかを判断する。ロード・オプションは、起動ディスクおよびブート・イメージまでのパスを記述したリスト（FilePathList）を含みこの値が改変されるとブートができなくなる。
【００５２】
変数制御コード１５０ｅは、デフォルト領域１０３および変数領域１０７にそれぞれ記録されたロード・オプションを比較して改変されていると判断したときはブロック２２７に移行する。ブロック２２７で変数制御コード１５０ｅは、セット・アップ・コード１５０ｄに指示して、ブートに関連するすべてのＧＶのロード・オプションまたは改変されているＧＶのロード・オプションをデフォルト領域１０３に記録していたデフォルト値で書き換える。
【００５３】
このときセット・アップ・コード１５０ｄは、セット・アップ画面においてＦ９キーに割り当てたSetup DefaultsとＦ１０キーに割り当てたSave & Exitの機能を利用することができる。前回のブートにおいて、ブートに関連するＧＶが書き換えられても今回のプリブートの間にブートに関連するＧＶのロード・オプションを必要に応じて修正することで、少なくともセット・アップ画面を表示させることができるようになる。ＧＶの改変によってブートに問題が生じても、セット・アップ画面を表示できればユーザが問題を回復する可能性は高まる。
【００５４】
何らかの原因でＣＶ、ＧＶが消去された場合、GetVariable()で参照したときにデータ不存在を示すエラーが発生する。ブロック２２９で変数制御コード１５０ｅは、変数領域１０５、１０７に記録していたＣＶ、ＧＶがすべて存在するかどうかを確認する。変数制御コード１５０ｅは、デフォルト領域１０３にあるＣＶ、ＧＶが変数領域１０５、１０７に記録されたＣＶ、ＧＶに不存在と判断したときは、ブロック２３１で変数領域１０５、１０７に消去されたＣＶ、ＧＶのデフォルト値を書き込む。
【００５５】
ブロック２３３は、ＵＥＦＩファームウェア１５０またはＵＥＦＩアプリケーション１６５が、プリブートの開始から終了までの間に、変数領域１０５、１０７に対してＣＶ、ＧＶ、ＵＶの書き込みをする場合があることを示している。ブロック２３５で変数制御コード１５０ｅは、コード領域１０１、デフォルト領域１０３、および変数領域１０５をライト・ロックするためにチップセット１３のＳＰＩコントローラを設定する。ＣＶはハードウェア的にライト・ロックした変数領域１０５に格納するため、ＵＥＦＩアプリケーション１６５、ＯＳ１６７、またはＯＳアプリケーション１６９によって改変されることも、変数領域１０７に対するアクセスの際に発生する電源のノイズの影響を受けることもない。
【００５６】
さらに、変数制御コード１５０ｅは、それ以降において、ＵＥＦＩアプリケーション１６５、ＯＳ１６７またはＯＳアプリケーション１６９からのＣＶを書き込むための関数であるSetVariable()の呼び出しに対し、エラーで応答することによりソフトウェア的なライト・ロックをする。ソフトウェア的なライト・ロックは、ハードウェア的なライト・ロックとともに、またはハードウェア的なライト・ロックに代えて実行することができる。ソフトウェア的なライト・ロックによっても、ＣＶの改変と電源ノイズの影響を防ぐことができる。なお、ハードウェア的なライト・ロックに代えてソフトウェア的なライト・ロックだけを採用する場合は、プリブートの完了後においてもＵＥＦＩファームウェア１５０にはＣＶの書き換えを許可することもできる。変数領域１０５に対する書き込み保護の処理につづいてブロック２３６でプリブートが終了する。
【００５７】
ブロック２３７で、ブート・マネージャ１５０ｃがＨＤＤ２１の所定のセクタからＵＥＦＩ＿ＯＳローダー１６３をロードすると、ＯＳ１６７、およびＯＳアプリケーション１６９がロードされてＰＣ１０はパワー・オン状態に移行し、システムはＵＥＦＩネイティブ・モードで動作する。ＵＥＦＩアプリケーション１６５、ＯＳ１６７、およびＯＳアプリケーション１６９は、ＵＥＦＩファームウェア１５０に自由にＵＶの書き込みの要求をすることができる。
【００５８】
ブロック２３９は、ＵＥＦＩアプリケーション１６５、ＯＳ１６７またはＯＳアプリケーション１６９が必要に応じて変数領域１０７にＧＶ、ＵＶの書き込みを行うことを示している。変数領域１０５はハードウェア・ロックおよびソフトウェ・ロックまたはいずれが行われているため、ＯＳ１６７およびＯＳアプリケーション１６９は、ＧＶ、ＵＶの書き込みの際に誤ってＣＶを書き換えることがない。また、ＧＶ、ＵＶの書き込みの際に電源の瞬断でノイズが発生しても変数領域１０５は変数領域１０７からハードウェア・ロックおよびソフトウェア・ロックで分割されているため影響を受けない。
【００５９】
図４に示した手順は本発明を説明するための例示でありすべてが本発明の必須の手順ではない。本発明の必須の手順は特許請求の範囲に記載するとおりである。また、各ブロックの順番も、図４に示した順番に限定するものではない。たとえば、ブロック２１９、２２５、２２９の手順および関連する手順とともに入れ替えることができる。
【００６０】
図５は、変数制御コード１５０ｅが変数領域１０５、１０７にＣＶ、ＧＶまたはＵＶを書き込むためのリクエストを受け取ったときの処理をする手順を説明する図である。ブロック３０１では、図４のブロック２３３、２３９のいずれかでＵＥＦＩアプリケーション１６５、ＯＳ１６７またはＯＳアプリケーション１６９がSetVariable()を呼び出して、ＣＶ、ＧＶ、ＵＶのいずれかを書き込むためのリクエストを発行する。リクエストを受け取った変数制御コード１５０ｅはブロック３０３で、現在プリブートが終了しているか否かを判断する。プロブートが終了しているときはブロック３０５に移行し、プリブート中のときはブロック３０９に移行する。
【００６１】
ブロック３０９で変数制御コード１５０ｅは、変数の種類がいずれであってもランタイム・サービス１５０ｂに書き込みのリクエストを渡す。ランタイム・サービスはSetVariable()で指定された変数のうち、ＣＶは変数領域１０５に書き込み、ＧＶ、ＵＶは変数領域１０７に書き込む。ブロック３０５で変数制御コード１５０ｅは、SetVariable()に設定されたパラメータのなかで、変数名称（VariableName）およびベンダー識別子（VendorGuid）を参照して、あらかじめ保有しているリストと比較し書き込む変数の種類を判断する。
【００６２】
変数がＵＶまたはＧＶのときは、変数制御コード１５０ｅは、ランタイム・サービスにリクエストを渡す。変数がＣＶのときは、変数制御コード１５０ｅは、ソフトウェア・ロック機能により当該リクエストを無効にする。また、チップセット１３をハードウェア的にロックしている場合は、たとえランタイム・サービス１５０ｂがリクエストを受け取っても変数領域１０５にアクセスできないためＣＶを書き込むことができない。
【００６３】
図７、図８は、変数領域１０５、１０７の他の構成方法を説明する図である。図７の構成が図６の構成と異なる点は、図７（Ａ）に示すようにファームウェアＲＯＭ１００の変数領域１０７にＧＶだけを記録して、図７（Ｂ）に示すようにＵＶをインターフェースの異なる別の不揮発性メモリ４００に記録するようにした点だけである。こうすることで、変数領域１０７はＵＶでオーバーフローする恐れがなくなり、かつ、不揮発性メモリ４００にアクセスする際に発生する電源の瞬断でＣＶ、ＧＶが破損する危険性を除去することができる。なお、この場合でも変数領域１０５はハードウェア・ロックおよびソフトウェア・ロックまたはいずれかをしておく。
【００６４】
図８の構成が図６の構成と異なる点は、ファームウェアＲＯＭ１００に変数領域１０９を追加した点だけである。図８の構成では、変数領域１０７にはＧＶだけを記録し、変数領域１０９にはＵＶだけを記録する。変数領域１０５にはライト・プロテクトをするが、変数領域１０７、１０９にはライト・プロテクトをしない。この場合も図７の構成と同様に変数領域１０７のオーバーフローの問題と電源の瞬断の問題を解決することができる。
【００６５】
これまで本発明について図面に示した特定の実施の形態をもって説明してきたが、本発明は図面に示した実施の形態に限定されるものではなく、本発明の効果を奏する限り、これまで知られたいかなる構成であっても採用することができることはいうまでもないことである。
【符号の説明】
【００６６】
１０  ＰＣ
１００  ファームウェアＲＯＭ
１０１  コード領域
１０３  デフォルト領域
１０５  ＣＶを記録する変数領域
１０７  ＧＶ、ＵＶを記録する変数領域
１０９  ＵＶを記録する変数領域
１５０  ＵＥＦＩファームウェア
４００  ファームウェアＲＯＭとは異なる不揮発性メモリ
【図１】
0005889933.tif 000002
【図２】
0005889933.tif 000003
【図３】
0005889933.tif 000004
【図４】
0005889933.tif 000005
【図５】
0005889933.tif 000006
【図６】
0005889933.tif 000007
【図７】
0005889933.tif 000008
【図８】
0005889933.tif 000009
【図９】
0005889933.tif 000010