私の質問は:
Windows/Linuxで「シャットダウン」ボタンを押すと、コンピューターがシャットダウンします。 「シャットダウン」コマンドは、実際にコンピューターを物理的にシャットダウンしましたか?
私のポイントを明確にするために:
ボールを蹴ると、ボールが動くためにボールと脚の間に物理的な接触があります。それでは、ソフトウェアとハードウェアの間の物理的な接続はどのように達成されますか? コードのプレーンテキストはどのようにしてコンピューターに何をさせますか?
答えはかなり複雑であり、電気システムと回路(KVL、KCL)、2進数、およびブール論理の基本を理解する必要がありますが、プロセスを高レベルで記述することができます:コード(プレーンテキストの単語で表される)がコンパイルされます、組み立てられ、最終的にゼロとワンの組み合わせに変換され、それぞれ低電圧と高電圧を表します。
電圧が材料と回路に印加されると、それらの電圧は、電球に電流を供給する回路を閉じる(点灯させる)か、CD/DVD/Bluray /(?)ドライブ。
次に、回路を閉じて電流をブザーに供給して音を出す機能を持つ仮想の1ビットCPUを想像してください。この1ビットCPUには、0と1の2つの値を持つことができる単一の入力があります。
この単純なCPUには、ON
とOFF
という非常に単純なアセンブリ言語があり、さらに優れた抽象化を提供する派手なプログラミング言語があります:cpu.turnOn
、cpu.turnOff
。
プログラムを作成するcpu.turnOn;
コンパイル、アセンブル、実行の準備ができました。 CPUでプログラムを実行すると、ブザーがオンになります。
現実の世界では、コンピューターはより複雑なシステムで構成されています。単一の1ビットCPUの代わりに、複雑な命令セットと無数のデバイスを備えた64ビットCPUがあります。
複雑なシステムを相互作用させるために、これらのシステムは抽象化の層で構成されています。
最下層は、電圧、回路、シリコン、または実際の「物理ハードウェア」と考えるものです。通常、ハードウェアには「マイクロコントローラー」またはハードウェアの仕様と相互作用するように設計された専用の処理ユニットが配置されます。光ディスクドライブを想像してみてください。マイクロコントローラーはドライブベイの取り出し、モーターの起動、レーザーの調整、ディスクからのデータのストリーミングを行うことができます。
マイクロコントローラーが実行するソフトウェアは、ファームウェアと呼ばれます。これは、ハードウェア機能を制御する特殊なオペレーティングシステムであり、APIも含む場合があります。架空の1ビットCPUの例では、プログラムはファームウェアになり、cpu.turnOn, cpu.turnOff
はAPIです。
コンピューターが多数のハードウェアコンポーネント(グラフィック、ストレージ、通信、I/O)で構成されているとすると、コンピューターは多数の専用ファームウェアで構成されます。そのハードウェアで何か便利なことをするためには、別の抽象化層が必要です。例えば、普遍的な方法でキーボードを処理したり、マウス、タッチパッド、トラックボールが異なる相互作用にもかかわらず同じように動作できるようにするためです。 OSは、関連するデバイスのグループを管理するAPIを提供し、ハードウェアベンダーがOSコマンドとマイクロコントローラーが理解するコマンド間の変換を提供するフックを提供します。 Windowsの土地では、これはdriver.
オペレーティングシステムとドライバーの上の抽象化の次のレイヤーは、ユーザーが実際の作業を行う(またはFortniteをプレイする)ために使用するアプリケーションです。これらのプログラムは無数の言語、SDK、およびツールキットで記述されており、StackOverflowが存在する理由です。これらの言語は、OSがロードして管理する実行可能コードにコンパイルされ、コンピューターによって実行されます。
shutdown
コマンドですべてをまとめる:コマンドインタープリターは、システム電源を管理するOSレベルのAPIを使用します。そのAPIは、メモリバッファーの正常なフラッシュ、アプリケーション状態の保存、通信チャネルの終了、さまざまなハードウェアシステムの電源オフ(または低消費電力モードに入る可能性が高い)などを処理するために、OSの残りに通知を送信します。また、電源ドライバー(ACPI?)を使用して、コンピューターの電源管理サブシステムとインターフェイスします。このサブシステムはシャットダウンするように指示されます。これにより、コンピューターの電源に信号が送信され、回路が切断され、ほとんどのコンポーネントに電力が供給されなくなります。
ソフトウェアがハードウェアと比較して異なる生き物だと思うなら、説明はあなたを満足させないでしょう。ソフトウェアを一連の電荷のように考えてください。書き込むコードはすべて、RAMまたはディスクに電荷のシーケンスとして保存されます。したがって、テキストではなく、電荷のシーケンスを書き込みます。ビデオカードは、入力方法を理解するのに役立つ英語のモニターを使用します。
シャットダウンは実際には物理的なものではなく、電源を物理的に抜くまでコンピューターのすべての回路が完全にオフになるわけではありません。
ソフトウェアは、BIOSの APM(Advanced Power Management) インターフェイスを使用して、コンピューターの電源回路を制御します。
コンピューターの電源がオフの場合でも、たとえば、コンピューターのネットワークカードからの Wake on LAN 信号によって、物理的にスイッチを引くことなくオンにすることができます。
ソフトウェアは、ハードドライブまたはフロッピーディスクの磁気ドメインとして、またはコンピューターチップの低電圧と高電圧としてハードウェアに保存されます。キーボードで入力すると、各文字は0と1の電気的なシリーズに変換され、RAMと呼ばれるコンピューターチップに低電圧と高電圧として保存されます。 RAMの低電圧と高電圧は、ハードディスクドライブまたはフロッピーディスク上の磁区に変換され、後でディスクヘッドによって電圧に読み戻されるか、または低電圧と高電圧として保存されます。低電圧と高電圧は、キーボードの文字によって生成された電気的な0と1を表します。
ボールを蹴る脚が良い例です。マシンでもかなり似ています。 CPUはシステムの他のすべての部分に接続されていますが、すべての神経が同時に接続されている物理的な配線である神経系とは異なり、CPUはシステムの他の部分との永続的な接続を維持しません。必要な部分にオンデマンドで接続します-電話をかけるのと同様に-すべての電話に接続がありますが、一度に接続されるのはごく少数です。
CPUは、ソフトウェアプログラムという指示を実行することで機能します。 CPUにシステムの一部をダイヤルするよう指示する命令コードがあります。各部分には番号があり、CPUには番号をダイヤルする指示があります。 CPUはその番号をダイヤルすると、その部分にメッセージを送信します-メッセージは単なるデータです-1ビットから任意のサイズのブロックまで。その場所のハードウェアは、エンコードされたメッセージに作用します。
このようにして、CPUは同じメカニズムを使用してハードウェアを制御できます。各デバイスで変更されるのは、cpuがダイヤルする番号とcpuがデバイスに送信するデータだけです。詳細は、cpuが実行しているソフトウェアに入力されます。
そのため、マシンの電源をオフにするために、CPUは電源管理デバイスの番号をダイヤルし、適切な電源状態になるよう指示を送信します。ハードウェアが応答し、PSUがマザーボードへの主電源の送信を停止します。
Softareを作成する場合、これらの詳細をすべて自分で知る必要はありません。これらは通常、すぐに使用できるコードとして事前にパッケージ化されているため、ソフトウェアは「シャットダウン」と言うだけで、このための既製のコード(通常はBIOS内)が実行され、上記のようにシャットダウンが実行されます。
PCプログラムと外部の現実世界との間には、いくつかのインターフェイスがあります。
一部はCPUに接続します。これらの例は、ポートおよびハードウェア割り込み(IRQ)です。これらにより、少量のデータの送信(ホストプログラム要求による)およびハードウェアトリガー(低から高への個別の行)に基づく関数の呼び出し(割り込みハンドラー)が可能になります。
CPUをバイパスする大量のデータを転送するための高速なインターフェイスがあります。これはDMA(ダイレクトメモリアクセス)と呼ばれます。これらはディスク、ネットワーク、ディスプレイアダプタなどにデータを転送するために使用されます。
ポートIO(オペコードINおよびOUT)の場合、ソフトウェアはイニシエーターです。IRQの場合、ハードウェアが最初に発言してソフトウェア応答をトリガーします。
これらすべてを実行できるのはデバイスドライバーのみです。アプリケーションから実行しようとすると、OSはすぐにそれを破壊します。アプリケーションは、デバイスドライバーが提供するAPIを介してこの世界に接続します。 APIの多くは標準化されているため、実際にデバイスを交換する際に別の操作を行う必要はありません(プリンター、ディスク、キーボード、マウス、CRROM、ATX電源スイッチ))。
物理的ソリューションとソフトウェアソリューションを比較しましょう。
ボタンを押すと、実際には電源装置に5ボルトの信号が送信されます。この5ボルトの電源が実際にオフになることはありません(コンピューターがオフになっていると思われる場合でも)。この5ボルトは、ボタンを押してコンピューターの電源を入れるときに必要です。この時点で、電源ユニットにさらに5ボルトが送られ、電源を入れるように指示します。
したがって、実際には、電源が何かをするために、物理的なボタンの押下が電子信号に変換されます。
これらの用語で物事を考えると、突然、コンピューターがその電子信号を物理的なボタンに変える必要がないことに気づきます-電源を切るためにプッシュ-それは人間に役立つために追加されたものです秘密の内部「オフ」ボタンを押す小さなモーターでした-存在しません)。
したがって、ソフトウェアが行う必要があるのは、電子信号を指示することだけです。これにより、電源が5ボルトのスタンバイモードになります。
簡単:私たちが書くコード/ソフトウェアは、実際のCPUで0(オフ)と1(オン)で表される電気信号です。その点から、電流とモーターを考えてください。
実際、コードのプレーンテキストは、コンピューターを直接シャットダウンしません。基になるオペレーティングシステムのプロシージャを呼び出します。次に、オペレーティングシステムがメインボードのACPI/APMを呼び出します。これにより、コンピューターがシャットダウンします。
小さな1と0がハードウェアの回路とどのように相互作用するかは非常に複雑な主題であり、少なくとも1冊の本を読んで完全に理解することができます...
一般的に、どのデバイスがそのアクションを実行するかを探している場合、デバイスにはファームウェアがROM /制御ボードのチップに格納されています。制御ボードは制御に使用されます電気信号を介してデバイス。
ファームウェアの上に、ドライバー/サービスプロバイダーがあります。アプリケーションはこれらのサービスプロバイダー/ドライバーを使用して、デバイスに通信するか、何らかのアクションを実行するようにデバイスに指示します。
ここをクリック ファームウェア、通信、電子デバイス、操作を実行する方法の詳細を確認するには?
私は今静かに同じ質問を考えており、実際にはソフトウェア(ファンタジー)の世界からハードウェア(現実)の世界への接続があることに気付きました。
回路やスイッチのような単純なものを考えてから、加算器やALUのようなより抽象的なものを考えてください。時間の経過とともに抽象化が構築され、次のROMでは複雑になります。マイクロコード、オペコード、機械語、そして最後にアセンブリとCが続きます。その後、BIOS、OS、ドライバー、GUIが登場し、あなたの愛する「シャットダウン」ボタンが現れました。