Linux プロセス 0 とプロセス 1 については、Linux システムの起動に関係するため、Linux の起動プロセスから始めます。
1. Linux 起動の全体的なプロセス
-
システムが最初に起動または再起動されると、プロセッサは既知の場所からコードを実行します。パソコンに相当するのが、マザーボード上のメモリに保存されているBIOSです。
-
ブートデバイスが検出されると、第 1 段階のブートローダーが RAM にロードされて実行されます。ブート プログラムのこの部分は 512 バイトの MBR イメージ (MBR については後で説明します) にあり、その機能は第 2 段階のブート プログラムをロードすることです。
-
第 2 段階のブートローダーが RAM にロードされて実行されると、ブート画面が表示され、Linux とオプションの初期ディスク (一時ファイル システム) がメモリにロードされます。イメージがロードされた後、制御は第 2 段階のブートローダーからカーネル イメージに渡されます。
-
カーネル イメージの自己解凍と初期化。このステップでは、第 2 段階のブート プログラムがシステム ハードウェアをチェックし、ハードウェア デバイスを列挙し、メイン デバイスをマウントして、必要なカーネル モジュールをロードします。
-
これらが完了すると、ユーザー空間の最初のプログラム (init) が実行を開始し、トップレベルのシステムの初期化が開始されます。
上記は Linux の起動プロセスのシェルのようなものですが、次に、起動プロセスの詳細をさらに詳しく見ていきます。
2. システムの起動
まず、BIOS の構成は次のとおりです。
- 電源投入時セルフテストコード
- サービスの実行
Linux は0xffff0
、そのアドレスの BIOS から起動します。最初のステップはパワーオン セルフテストです。パワーオン セルフテストのジョブはハードウェアをチェックすることです。2 番目のステップは、ローカル デバイスを列挙して初期化することです。
POST 後、POST コードはメモリから消去され、実行中のサービスは保存され、ターゲット オペレーティング システムに対して引き続き有効になります。
オペレーティング システムを起動するために、BIOS ランタイムは、CMOS
設定で定義された順序でアクティブな起動可能なデバイス (フロッピー ディスク、CD-ROM、ハードディスク パーティション、ネットワーク デバイス、または USB フラッシュ ドライブなど) を検索します。
Linux は通常、MBR にプライマリ ブートローダーが含まれているハードディスクから起動します。MBR は、ハードディスクの最初のセクター (0 トラック 0 カラム 1 セクター) に位置する 512 バイトのセクターです。MBR が RAM にロードされた後、それを制御するのは BIOS 次第です。
3. 第 1 段階のブート プログラム
プライマリ ブートローダーは、512 バイトの MBR イメージにあります。
MBR イメージは、小さなパーティション テーブルとコードで構成されます。
最初の 446 バイトは、実行コードとエラー情報を含むプライマリ ブートローダー コードです。
次の 64 バイトは、4 つの 16 バイトのパーティション レコードを含むパーティション テーブルです。
MBR の最後の 2 バイトはマジックナンバー (0xaa55) を定義します。このマジックナンバーはMBRをチェックするために使用されます。
プライマリ ブートローダーは主に、第 2 段階のブートローダーを検索してロードします。パーティション テーブルを調べてアクティブなパーティションを探します。アクティブなパーティション テーブルが見つかったら、残りのパーティションをスキャンして、アクティブでないことを確認します。これらが決定されると、アクティブ パーティションのブート レコードがデバイスから RAM にロードされ、実行されます。
4. 第 2 段階のブート プログラム
第 2 段階のブートローダーは、実際には、カーネル ブートローダーと呼ぶのが適切です。そのタスクは、Linux カーネルとオプションの初期ディスクをロードすることであるためです。
/etc/grub.con
第 2 ステージがロードされると、CRUB はオンデマンドで利用可能なカーネル ( で定義され、/etc/grub/menu.lst
と への/etc/grub.conf
シンボリックリンク)のリストを表示します。カーネルを選択し、追加のカーネル パラメーターを使用してカーネルを改善できます。
第 2 段階のブート プログラムがメモリにロードされると、ファイル システムにクエリが実行され、デフォルトのカーネル イメージと initrd イメージがメモリにロードされます。すべてのイメージが準備できたら、第 2 段階からカーネル イメージにジャンプします。
5. カーネル段階
カーネル フェーズは、カーネル イメージがメモリにロードされ、制御が第 2 段階のブートローダーから取得されるときに始まります。カーネル イメージは実行可能なカーネルではなく、圧縮されたカーネル イメージです。
カーネル イメージの先頭には小さなプログラム ルーチンがあり、少量のハードウェア セットアップを行った後、カーネル イメージを自己抽出してハイメモリに配置します。次に、ルーチンはカーネルを呼び出してカーネルのブートを開始します。
6 初期化プロセス
init プロセスは、通常プロセス No. 1 と呼ばれるものです。
このシステムは、プロセスが新しいプロセスを作成することを許可しており、その新しいプロセスは子プロセスであり、子プロセスは新しい子プロセスを作成してプロセス ツリー構造モデルを形成することもできます。Linux システム全体のすべてのプロセスもツリー構造になっています。ツリーのルートはシステムが自動的に構築するもので、カーネルモードで実行されるプロセスNo.0であり、すべてのプロセスの祖先となります。プロセス No. 0 は、プロセス No. 1 (カーネル状態) を作成します。プロセス No. 1は、カーネルとシステム構成の初期化作業の一部を実行する責任を負い、キャッシュと仮想メイン メモリ管理のためのいくつかのカーネル スレッドを作成します。続いて、プロセスNo.1がexecve()
実行プログラムinitを呼び出して実行し、ユーザモードプロセスNo.1、すなわちinitプロセスに発展する。設定ファイルの要件に従ってシステムの起動作業を完了し/etc/initab
、getty 番号 1、2 のいくつかの端末登録プロセスを作成します。
各 getty プロセスは、プロセス グループ識別番号を設定し、システム端末に設定されたインターフェイス ラインを監視します。端末からの接続信号が検出されると、getty プロセスは関数 execve() を通じて登録プログラムへのログインを実行します。このとき、ユーザーは登録名とパスワードを入力してログイン プロセスに入ります。成功すると、ログインが完了します。プログラムは関数 execve(). を通じてシェルを実行し、シェル プロセスは getty プロセスの pid を受け取り、元の getty プロセスを置き換えます。次に、シェルは直接的または間接的に他のプロセスを生成します。
0号进程->1号内核进程->1号用户进程(init进程)->getty进程->shell进程
以下に示すように、上記のプロセスは次のように記述できます。
参照文書
1、https://www.likecs.com/show-205059185.html
2、https://www.cnblogs.com/wanghetao/archive/2012/03/29/2422723.html