
私が読んでいるstart_kernel
関数は終了時に呼び出されます/init/main.c
。最後に呼び出される関数start_kernel
は であり、rest_init
の終わりに呼び出されます。rest_init
cpu_idle
start_kernel
ルーチンの最後の関数と呼ばれる理由は何であり、どのような役割を果たしますか?
答え1
最初の質問に答えるには、
cpu_idle
効果は何ですか?
一般的に言えば(質問の文脈に関係なく)、CPUがアイドル状態であるということは、現在のカーネルにCPUが実行できるタスクがないため、CPUがカーネルでより多くのタスクを待ってアイドル状態であることを意味します。
カーネルは、スケジュールに応じてCPUにタスクを渡す管理者と考えることができます。 CPU に使用可能なジョブがない場合、CPU はアイドル状態に入り、割り込みを待ちます。 CPU割り込みの詳細を読むことができます。ここ。
質問の文脈に関して正確な実装を読むことができます。cpu_idle
する:
cpu_idle(void)
{
set_thread_flag(TIF_POLLING_NRFLAG);
while (1) {
/* FIXME -- EV6 and LCA45 know how to power down
the CPU. */
while (!need_resched())
cpu_relax();
schedule();
}
}
結局、cpu_idle
CPUをアイドル状態にすることです。これはwhile
、必要に応じてプロセススケジューリングを処理するループを使用して実行されます。それ以外の場合、CPUはアイドル状態に保たれますcpu_relax
。
start_kernel
なぜルーチンの最後の関数と呼ばれるのでしょうか?
この関数がルーチンの最後の命令として実行されるのは、start_kernel
CPUがコアを起動するために必要なすべての操作をすでに実行しているためです。命令が実行されなくなったため、CPUはアイドル状態になり、次のタスクまたは割り込みを待ちます。 。これを示すには、CPUがカーネルの初期化に必要なくなったため、アイドル状態にする必要があります。
答え2
CPUは常に実行する必要があります。何。何もしなければ無限ループに陥り、割り込み(システムハートビート割り込みなど)によって中断されます。
以前のマルチプロセス/マルチスレッドオペレーティングシステムでは、スケジューラ(実行可能スレッドのキューを実行するために次のスレッドを選択して切り替える低レベルスケジューラ)が実行する準備ができているスレッドがないことがわかった場合は、このステータスリングのように無限に入ります。 。
これは多くの当事者を悩ませる問題ですプロセッサしかし、オペレーティングシステムでは、スケジューラが残したスレッドのコンテキストで無限ループが実行されるためです。これにより、同じスレッドが両方のプロセッサで同時に「実行」され、多くの問題が発生する可能性があります。
したがって、より新しい(つまり、比較的新しい、アイデアが数十年前に出てきたので)、デザインはシステム内のすべてのプロセッサに次のものがあるということです。アイドルスレッド。このスレッドは無限ループのみを実行しますいつも実行可能。 Fいつもスケジューラはスレッドを選択でき、プロセッサが実行される実行可能スレッドがない状況は決してありません。
実際のUnixの以前のバージョンでは、システムの初期化が完了すると、初期化コードはそれをプロセス#0として説明するデータ構造を設定しました。その役割のために「交換プロセス」という伝統的な名前があります。それはなされるべきです何初期化が完了した後、メインRAMとDASDスワップ領域の間のプロセスセグメントをスワップするコードを実行するだけです。
スワッピングのアイデアは、1970年代後半の需要ページングデザインの登場とともに消えました。プロセス#0が最初になります。アイドルプロセス以来システムプロセスすべて含めるアイドルスレッド。
これはLinuxでも起こります。
もちろん、この時点で電力管理は25年以上にわたって考慮されており、無条件の分岐命令が独自に分岐する伝統的な無限ループは、不要な忙しい作業と消費電力を多く引き起こします。最新の(やはり相対的な用語)アイドルスレッドは、実行プロセッサに待機を指示する特別なプロセッサ命令を呼び出して、電力を節約するためにクロック速度を下げてハードウェア割り込みを受け取ることができます。 (長年にわたり、x86命令アーキテクチャでは、hlt
「ハイパースレッド」プロセッサの実行コアからリソースをpause
完全に解放することから、rep nop
割り込みを含まないプロセッサ間のショルダーオフロードに切り替え、アイドルスレッドを永続スレッドに効果的に切り替えました。スタンバイスピンロックです。 )