Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> init関数とinitプロセスの違い

init関数とinitプロセスの違い

  

init()関数のカーネル識別子とinitプロセスのプロセス識別子はどちらも1であるため、これらはinitと呼ばれます。そのため、init()関数とinitプロセスは概念的に簡単です。はっきりしない。

主な違い:

1、init()関数はカーネルコードの一部であり、カーネルモードで実行され、スタンドアロンの実行可能コードの一部です。

2、Linux オペレーティングシステムのinitプロセス
は特別なプロセスです。カーネルによって起動され実行される最初のユーザープロセスなので、カーネル状態では実行されていません。代わりに、ユーザーモードで実行されます。そのコードはカーネル自体の一部ではありませんが、ハードディスク上の実行ファイルのイメージに格納されています。他のユーザープロセスと違いはありません。

プロセス番号0 - >カーネルスレッド番号1 - >>カーネルプロセス番号1 - > initプロセス(ユーザープロセス番号1)

プロセス番号0:これはシステムです起動時に自動的に形成されるプロセスは、実際にはカーネル自体です。それは後でシステム内で生成されるすべてのプロセスの先祖です。カーネルシステムが自身の初期化を完了すると、カーネル自身が関数kernel_thread()を呼び出します。これはint 0x80システムコールを使用して最初のカーネルスレッドを作成します。

1番のカーネルスレッド:Linuxシステムでは、いわゆるカーネルスレッドとは仮想記憶スペースのないプロセスを指し、カーネルスレッドはカーネル状態で実行されている物理アドレススペースを直接使用できます。ソフト割り込みシステムコールから戻った後、ESPレジスタとESIレジスタの値を比較して、親プロセスと子プロセスを決定します。 ESPレジスタの値がESIレジスタの値と等しい場合、システムはそれを親プロセス、つまりカーネル自体、つまりプロセス番号0と見なします。それ以外の場合は、カーネルによって作成された最初のカーネルスレッドです。つまり、このスレッドはナンバー1のスレッドです。

1番のカーネルプロセス:1番のカーネルスレッドの場合、プログラムはサブルーチンを制御してinit()関数を直接実行し、1番のスレッドは1番のカーネルプロセスに進化します。

initプロセス:init()関数はexecve()を呼び出して/etc /inittabファイルから実行可能プログラムinit()をロードして実行すると、init()関数のカーネルプロセスはinitプロセスに進化します。 。つまり、initプロセスはinit()関数によって生成されます。 fork()はこの展開中には使用されないため、initプロセスのプロセス識別子は、カーネルプロセス番号1の識別子1のままです。これを見て、私は突然組み込みのルートファイルシステムでカーネルのinitスレッドも実行したことを思い出しましたスレッドはスクリプトを実行します。/linuxrc ./linuxrc:execve /sbin /initの最後に、ユーザーを実行しますスペースのinitプロセス。スクリプトinittab(ある場合)を実行します。

Copyright © Windowsの知識 All Rights Reserved