Linuxシステムの起動プロセスとプロセスNo.0、No.1

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

おすすめ

転載: blog.csdn.net/yuelai_217/article/details/130327715