Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxの起動プロセスの分析

Linuxの起動プロセスの分析

  

起動プロセスとは、コンピュータの電源を入れてからLINUXがユーザーログイン画面を表示するまでの全プロセスのことです。 Linuxの起動プロセスを分析することも、LINUXの中核的な動作原理を理解するための良い方法です。

最初のステップを開始します - BIOSをロードします

コンピュータの電源を入れると、最初にBIOS情報がロードされます。 。これは、BIOSにCPUに関する情報、デバイスの起動順序情報、ハードディスク情報、メモリ情報、クロック情報、PnP特性などが含まれているためです。その後、コンピュータはどのハードウェアデバイスを読むべきかを知っているというスペクトルを持っています。 BIOSがシステムの制御をハードディスクの最初のセクタに引き渡した後、Linuxはシステムの制御を開始します。

2番目のステップを開始します - MBRの読み取り

ハードディスクの0番目のトラックの最初のセクターは、マスターブートレコードであるマスターブートレコードと呼ばれるMBRと呼ばれます。 512バイトですが、起動前情報とパーティションテーブル情報を格納できます。最初の部分は446バイトを占めるブート(PRE-BOOT)領域、2番目の部分は合計66バイトのパーティションテーブル(PARTITION PABLE)で、ハードディスクのパーティション情報を記録します。プリブート領域の役割の1つは、ACTIVEとマークされたパーティションを見つけて、アクティブパーティションのブート領域をメモリに読み込むことです。

システムはBIOSで指定されたハードディスクのMBRを見つけた後、00&00アドレスがある物理メモリにそれをコピーします。実際、物理メモリにコピーされたコンテンツはブートローダであり、コンピュータに固有のもの、つまりliloまたはgrubです。

3番目のステップを開始する - Boot Loader

Boot Loaderは、オペレーティングシステムのカーネルが実行される前に実行される小さなプログラムです。この小さなプログラムを通して、ハードウェアデバイスを初期化し、メモリ空間のマップを作成して、システムのハードウェアとソフトウェアの環境を適切な状態にして、オペレーティングシステムカーネルの最終呼び出しの準備をすべて行うことができます。通常、BootL oade:はハードウェアに大きく依存していますアーキテクチャによってブートローダは異なります。

Linuxのブートセクタの内容はアセンブリ言語で書かれたプログラムで、ソースコードはarch /i386 /boot(異なるシステムのCPUごとに独自のブートディレクトリがあります)で、4つのプログラムファイルがあります。 Br>

◎bootsect.S、ブートセクタのメインプログラム、アセンブリ後のコードが512バイトを超えない、つまり1セクタのサイズ

◎setup.S、ブートアシスタントプログラム

◎edd.S、BIOS拡張ディスクデバイスサービスをサポートするための補助プログラムの一部

◎video.S、起動時の画面表示のための補助プログラムの一部

システムはメモリ内のgrub設定情報(通常はmenu.lstまたはgrub.lst)を読み取り、この設定情報に従ってさまざまなオペレーティングシステムを起動します。

4番目のステップを開始します - カーネルをロードします。

grubによって設定されたカーネルイメージのパスに従って、システムはメモリイメージを読み込み、それを解凍します。この時点で、画面には通常「Uncompressing Linux」というプロンプトが表示されます。解凍されたカーネルが完了すると、画面に< OKと表示され、カーネルが起動されます。

システムは解凍したカーネルをメモリに配置し、start_kernel()関数を呼び出して一連の初期化関数を起動し、さまざまなデバイスを初期化してLinuxカーネル環境を完成させます。この時点で、Linuxカーネルは構築されており、Linuxベースのプログラムは問題なく動作するはずです。

start_kenrel()はinit /main.cで定義されていますが、これは通常の実行ファイルのmain()関数に似ています。初期化プロセス、実際のカーネル初期化プロセスはここから始まります。関数start_kerenl()は、最終的に基本的なLinuxカーネル環境を確立するために、一連の初期化関数を呼び出してカーネル自体のすべての側面を完成させます。

start_kernel()では、主に以下の操作が行われます。

(1)画面に現在のカーネルバージョン情報が表示されます。

(2)setup_arch()を実行してシステム構成を設定してください。

(3)sched_init()を実行してシステムのスケジューリング機構を初期化します。最初に、利用可能な各CPUでランキューを初期化してから、プロセス0(startup_32()でタスク構造体とシステムエンプティMスタックが割り当てられている)をシステムアイドルプロセス、つまりシステムがアイドル状態のときにCPUを占有するプロセスとして初期化します。

(4)parse_early_param()およびparsees_args()を実行してシステム起動パラメータを解析します。

(5)trap_in itQを実行し、最初にシステム割り込みベクタテーブルを設定してください。 0-19のトラップゲートはCPU例外処理のために使われます;それからシステムコールベクトルは初期化されます;最後に、cpu_init()はフラグレジスタ、タスクレジスタおよび初期化プログラムデバッグを含むプロセススケジューリングメカニズムをサポートするのに使われます。関連レジスタなど

(6)rcu_init()を実行して、システム内のRead-Copy Updateミューテックスメカニズムを初期化します。

(7)init_IRQ()関数を実行し、ペリフェラルの割り込みを初期化し、IDTの最終初期化プロセスを完了します。

(8)init_timers()、softirq_init()、およびtime_init()関数をそれぞれ実行し、初期システムタイマーメカニズム、ソフト割り込みメカニズム、およびシステムの日付と時刻を実行します。

(9)mem_init()関数を実行して物理メモリページのページデータ構造記述子を初期化し、物理メモリ管理機構の作成を完了します。

(10)kmem_cache_init()を実行して一般スラブバッファ管理機構の初期化を完了します。

(11)fork_init()を実行して、現在のシステムの物理メモリ容量で許容されるプロセス(スレッド)数を計算します。

(12)proc_caches_init()、bufer_init()、unnamed_dev_init()、vfs_caches_init()、signals_init()などの関数を実行して、さまざまな管理メカニズム用の専用スラブバッファキューを確立します。

(13)proc_root_init()Wl番号を実行して仮想ファイルシステム/procを初期化します。

start_kenrel()の終わりに、カーネルはkenrel_thread()によって最初のシステムカーネルスレッド(すなわちプロセス番号1)を作成します。これはカーネル内でinit()関数を実行します。開始タスクのフェーズ。最後に、cpues_idle()関数が呼び出されます。システムのメインループ本体ポートがデフォルトで入り、default_idle()関数の命令、つまりCPUの停止命令が実行されます。この時点で、システム内で準備完了状態にある唯一のプロセスは、kerne_hread()によって作成されたinitプロセス(カーネルスレッド)であるため、カーネルはdefault_idle()関数に入らず、代わりにinit()関数に進んでブートプロセスを続行します。

Copyright © Windowsの知識 All Rights Reserved