コンピュータはどうやって自分自身を再起動できますか?電源がオフになった後、どのようにして再び戻ってくるように指示されるのでしょうか。これが可能なのはどのようなソフトウェアですか?
tl; dr:コンピューターの電源状態は、ACPI(高度な構成と電源インターフェイス)の実装によって制御されます。シャットダウンプロセスの最後に、オペレーティングシステムはACPIコマンドを設定して、コンピューターを再起動する必要があることを示します。応答として、マザーボードはそれぞれのリセットコマンドまたはラインを使用してすべてのコンポーネントをリセットし、bootstrapプロセスに従います。マザーボードは実際にオフになることはなく、さまざまなコンポーネントをリセットするだけで、電源ボタンを押した直後のように動作します。
長くてとりとめがあるが、(私の意見では)より興味深い答え:
昔(大丈夫、私のような大学生にとっては90年代は昔でした)、AT power管理のAT(アドバンストテクノロジー)マザーボードがありました。 AT電源システムは非常にシンプルでした。コンピューターの電源ボタンはハードウェアトグルで(おそらくケースの背面にあります)、120vacの入力はそのまま通されました。物理的に電源の電源をオン/オフし、このスイッチがオフの位置にあるとき、コンピューターのすべてが完全に死んでいました(これがないと電源がないため、CMOSバッテリーが非常に重要になりました)ハードウェアクロックを刻み続けるため)。電源スイッチは物理的なメカニズムであるため、電源をオンまたはオフにするソフトウェアの方法はありませんでした。 Windowsには有名な「コンピューターの電源を切るのは安全です」というメッセージが表示されます。これは、すべてが駐車されて電源を切る準備ができているにもかかわらず、OSが実際に電源スイッチを切り替えることができないためです。この構成は、すべてハードウェアであるため、hard powerと呼ばれることもありました。
ATXマザーボードとATX power(追跡している場合はAdvanced Technology eXtended)の素晴らしさのため、最近は状況が異なります。他の多くの進歩(ミニDIN PS/2、誰か?)とともに、ATXはソフトパワーをもたらしました。ソフト電源とは、コンピューターへの電源をソフトウェアで制御できることを意味します。これにより、インポートの変更がいくつか行われました。
したがって、電源スイッチはコンピューターを「オン」にすることはありません。代わりに、マザーボードの基本コントローラーに接続され、ボタンが押されたことを検出し、電源を使用できるようにPS_ONを点灯するなど、いくつかの手順を実行してシステムを準備します。電源ボタンは、起動プロセスをトリガーする唯一の方法ではありません。拡張バス上のデバイスもトリガーできます。これは重要です。なぜなら、コンピューターの電源が切れているときでも、イーサネットネットワークアダプターは実際にオンのままで、「マジックパケット」と呼ばれる特定のパケットを探すからです。 MACアドレス宛のこのパケットを検出すると、起動プロセスがトリガーされます。これが「Wake-on-LAN」(WoL)の仕組みです。クロックはブートを開始することもでき(ほとんどのBIOSでは、コンピューターが毎日ブートする時間を設定できます)、USBおよびFireWireデバイスはブートをトリガーできますが、これの実装は知りません。
それで、私はそれがおもしろいと思う(常に私が物事を説明する主な理由である)ので、そしてそれはあなたがあなたのコンピューターの電源と実行/オフ状態がすべてソフトウェアによってどのように制御されるかを理解することができるからです。現在のほとんどのコンピューターでは、このソフトウェアシステムはAdvanced Configuration and Power Interface、またはACPIの実装です。 ACPIは、ソフトウェアがコンピューターの電源システムを制御できるようにする標準化された統合システムです。 ACPI電源状態を聞いたことがあるかもしれません。電源制御の基本的なメカニズムはこれらの「電源状態」です。オペレーティングシステムは、スイッチ(電源が実際にオフになる前に発生するシャットダウン/休止プロセス)を準備し、マザーボードに電源状態を切り替えるように命令することで電源モードを切り替えます。電源状態は次のようになります。
再起動はこれらの状態の1つではないことがわかります。それでは、コンピューターが再起動したときに実際に何が起こるのでしょうか?答えは驚くかもしれません。なぜなら、電源管理の観点からは、ほとんど何もしないだからです。 ACPIリセットコマンドがあります。オペレーティングシステムに再起動するように指示すると、通常のシャットダウンプロセス(すべてのプロセスの停止、少しのメンテナンスの実行、ファイルシステムのマウント解除など)が実行され、最後の手順として、マシンを電源状態にする代わりにG2(単にシャットダウンするように指示した場合のように)Resetコマンドを設定します。これは一般に「リセットレジスタ」と呼ばれます。これは、ほとんどのACPIインターフェイスと同様に、リセットを要求するために特定の値を書き込む必要があるアドレスにすぎないためです。 2.0の仕様を引用して引用します。
オプションのACPIリセットメカニズムは、完全なシステムリセットを提供する標準メカニズムを指定します。実装されると、このメカニズムはシステム全体をリセットする必要があります。これには、プロセッサ、コアロジック、すべてのバス、およびすべての周辺機器が含まれます。 OSPMの観点から見ると、リセットメカニズムをアサートすることは、マシンの電源を入れ直すことと論理的に同等です。リセット後に制御を取得すると、OSPMはコールドブートと同様の方法でアクションを実行します。
そのため、リセットレジスタが設定されると、いくつかのことが順番に発生します。
これらの2つのステップ(実際にはさらに多くのステップに分解されます)の最終結果は、コンピューターが起動したばかりのように見えますが、実際には常に電源が入っていることです。これは、シャットダウンして起動するのに必要な時間が短くなることを意味し(電源の準備が整うまで待つ必要がないため)、オペレーティングシステムのシャットダウンによって起動を開始できることが重要です。これは、別のスタートアップトリガー(WoLなど)を使用する必要がないことを意味し、ブートをトリガーする方法がない場合に、システムをリモートでリセットする効果的な方法としてRebootを使用できます。
それは長い答えでした。でもね、今はコンピュータの電源管理についてもっと知っているといいのですが。私は確かにこれを研究するいくつかのことを学びました。
出発点は次のとおりです。
チップは通常オフにしてからオンにすることはしません。代わりに、通常すべてのメモリがクリアされ、プロセッサの電源が入ったように見えるときにプロセッサをいわゆるリセット状態にするリセットラインがあります。そのピンがハイ(またはプロセッサによってはロー)に保持されている間、プロセッサはリセットされます。ピンが解放されると、それが最初にオンにされた場合と同様に、通常どおり起動し続けます。これのポイントはそれ自体が停電ではないということです。
それでは、これは現代のPCのような大規模システムにどのように拡大するのでしょうか。現代のコンピュータは、コンピュータ自体で作られていることもあるコンピュータで作られています。あなたがコンピュータをリセットするように設定するとき、コンピュータを作る「コンピュータ」は(リセットが制御されるならば)彼らの状態を保存し始めるか、単に彼らのリセットピンを引っ張らせます。
一部のプロセッサとマイクロコントローラ(小型の内蔵型コンピュータで、通常は現代のデスクトップコンピュータから20年遅れ)は、内部スイッチを使用して自分自身をリセットできます。私が言ったように、リセットを生成する信号がなくなると、コンピュータが起動します。そのため、質問の前提は完全には正しくありません。コンピュータはいつ電源を入れるべきかわからない。いつそれが「オフ」になる必要があるか、またはリセットされる必要があるか、そしてそれをそこに保持する信号が消えたとき、それはオンになります。
この動作は、特定の時間に、またはネットワークなどを介してオンになるように設定できる現代のコンピュータでは奇妙に見えるかもしれません。私が言ったように、コンピュータはコンピュータでできています。したがって、メインプロセッサがオフになっている可能性がありますが、内部に他の多数のチップやマイクロコントローラがある可能性があります。最も明白なケースは、しばしば電池式であるリアルタイムクロックです。それはそれから他のチップをオンにする他のチップをオンにすることができ、そして連鎖反応はコンピュータ全体がオンになるまで続く。今日のコンピュータには、+ 5 VDCスタンバイ電圧というPSUラインがあります。コンピュータが「オフ」のときにオンになっているさまざまなデバイスに約50 mWの電力を供給します。
ちょっとしたトリビア:Intel 386 EXプロセッサのリセットピンはピン番号110です。
Intel i7 - 900でそれは地番AL39です。
非常に複雑なシステムなので、高レベルの観点から物事がどのように機能するかを説明する答えを誰かが提供できることを願っています。
このブログ投稿 はLinuxがどのように再起動を引き起こすかを説明しています。
抜粋:
Linuxには、x86をリセットするためのさまざまな方法があります。それらのいくつかは32ビットだけです、そして、正直なところちょうどあなたがあなたの人生であなたがしていることなので私はただそれらを無視するつもりです。また、彼らはひどいです。それで、それは私たちにそれらのうちの5人を残します。
kbd - キーボードコントローラから再起動します。オリジナルのIBM PCは、CPUリセットラインがキーボードコントローラに接続されていました。適切なマジック値を書くことはラインを脈動させそして機械はリセットする。最近のマシンにはキーボードコントローラがなく(実際には組み込みコントローラの一部である)、さらに最近のマシンにはキーボードコントローラのふりさえしていないという事実を除けば、これはすべて非常に簡単です。現在、組み込みコントローラはソフトウェアを実行しています。そして、私たち全員が知っているように、ソフトウェアは恐ろしいものです。しかし、さらに悪いことに、組み込みコントローラ上のソフトウェアはBIOSの作者によって書かれました。だから、これがうまくいくというふりをしているのは明らかにどんな種類の精巧なフィクションでもある。一部のマシンは、Windowsがプログラムするのとまったく同じ状態にあるハードウェアについて非常にうるさいです。いくつかのマシンは10のうち9回動作し、その後いくつかの奇妙なタイミングの問題のためにロックします。そして、他の人はまったく動かないだけです。万歳!
トリプル - トリプルフォルトの生成を試みます。これは、空の割り込み記述子テーブルをロードしてからint(3)を呼び出すことによって行われます。割り込みが失敗し(IDTがない)、障害ハンドラが失敗し(IDTがない)、CPUが条件に入り、理論上はリセットをトリガーします。ただし、これが発生するという要件はないようで、多数のマシンでは機能しません。
pci - 実際にはpciではありません。伝統的なPCI構成空間アクセスは、バス、装置、機能および構成レジスタを識別するためにIOポート0xcf8に32ビット値を書き込むことによって達成される。ポート0xcfcには、問題のレジスタが含まれています。しかし、0xcf9に適切なマジック値のペアを書くと、マシンは再起動します。壮観!また、いかなる方法でも標準化されていない(確かにPCI仕様の一部ではない)ので、異なるチップセットは異なる要件を持つかもしれません。ブー。
efi - EFIランタイムサービスは、マシンを再起動するためのエントリポイントを提供します。通常は機能します。 EFIランタイムサービスがまったく機能している限り、それは一気に進むかもしれません。
acpi - 最近のバージョンのACPI仕様では、アドレス(通常はメモリまたはシステムIO space)とそこに書き込む値を指定できます。アイデアは、アドレスに値を書き込むとシステムがリセットされるということです。そうすることがしばしば失敗することがわかります。 PCIの再起動方法では一対の値が必要で、ACPIでは1つしか与えられないため、ACPIでPCIの再起動方法を表すこともできません。
それは、データラインをローに引き下げるI/O位置をフロブし、それがCPUが何をしていようとも停止し、BIOSの特定の位置からコードの実行を開始するように指示します。
電源管理の前の昔に戻ると、当然のことながらコンピュータはまだ自分自身を再起動できます。 (フリーズしたプログラムがコンピュータの再起動にCtrl + Alt + Deleteを使わなければならなかったことを誰かが覚えていますか?)
私の昔の486では、アセンブリ言語コマンドJMP FFFF:0000
(つまり、CPUの命令ポインタを上記のアドレスに設定)を実行すると、コンピュータ全体が再起動しました。言い換えれば、FFFF:0000は、コンピューターが最初に起動したときに何をすべきかを指示するBIOS内の場所を指定します。 AndrejaKoの答えで説明されているリセットピン、または電源管理前の日のリセットボタンも、命令ポインタを同じアドレスに強制することになると思います。
A GoogleでJMP FFFF:0000 を検索すると、これに関する興味深いページが多数見つかります。
ウォッチドッグというものもあります。この装置はデッドマンのスイッチとして機能します。コンピュータは、1分おきにウォッチドッグにそれがまだ生きていることを知らせる必要があります。コンピュータがクラッシュしたとき無限ループに陥ると、意図したとおりに実行されているウォッチドッグへの信号送信が失敗し、ウォッチドッグはハードウェアリセットを実行します。これは、ロボットが高電圧電力サージによってノックアウトされた人気のあるテレビシリーズのターミネータで実証されました。それは2分でそれ自身をリセットするでしょう。
おかしなことに、古いIBM PC-1のキーボードコントローラが再起動を処理しました。 IBMはキーボードを扱うための小さなマイクロプロセッサを内蔵していて、それはいくつかの予備のI/Oラインを持っていたので、メインCPUのリセットラインを駆動するためにそれらのラインの1つを使った。キーボードコントローラにコマンドを送信すると、あたかも電源が入ったかのようにCPUがリセットされます。
私はこの伝統が「AT」時代までずっと続いていたと思います、そしてそれが今日のACPIに残っているかもしれません。
追加:上記のリセット方法に関する興味深い詳細があります。初期ブートシーケンス中に、コードはRAM内の特定のパターンを探しましたが、これは以前に実行したコードによって設定された可能性があります。このコードが存在する場合、POST(電源投入時自己診断)診断の一部がスキップされました。パターンは「ウォーム」ブートにのみ存在します。