回答:
短い答え:
initは最初のプロセスです。プロセスやスレッドは管理しません。カーネルのsyscalls fork()とexecを使って作成します。
私はあなたがプロセスが何であるかについて泥だらけの考えを持っていると思います。コードを実行するだけではありません。ええ、カーネルはinitの前に(そしてそれ以前のブートローダも)実行します。しかし、「プロセス」は以下の特定の定義を持ちます。
そのため、カーネルが初期化されるとinitが実行され、次にinitはその構成に指定されている他のプロセスを起動します。
#2に関して言えば、カーネルのものはすべてカーネル内にあります。カーネルを広い範囲のコードとして考えてください。繰り返しますが、プロセスではなく、大規模なコードBLOBです。カーネルの一部はメモリ管理を扱い、その一部はそれ自体のスケジューリング部分(ドライバなど)を扱い、その一部はスケジューリングプロセスを扱う。
カーネルは実際にはまったくプロセスのようには動作しません。それはスケジュールされません、それはプロセスに代わって(いわゆるプロセスコンテキストまたはユーザコンテキスト)実行されるか、または割り込みまたは例外(いわゆる割り込みコンテキスト)の結果として実行されます。
Linuxカーネルは、タスクを実行したり、割り込みコンテキストで長時間実行したりすることを回避するためにカーネルスレッドを生成します(つまり、ksoftirqdスレッドは、オーディオのドロップなどの原因となる過度の遅延を回避します)。 。
あなたはの出力でカーネルスレッドを見ることができます ps
コマンド。それらは簡単に識別されます:それらの名前は括弧の間にあります。そのうちのいくつかはCPUごとに1つのインスタンスを実行し、CPUはスラッシュの後の数字で識別されます、従って[ksoftirqd / 0]はCPU 0のksoftirqdのインスタンスです。
いいえ、そうではありません...カーネル(およびカーネル拡張)はメモリに直接ロードされます。カーネルに安全でないコードがあったとしても、それが大きな問題になることはありません。
それはさておき、カーネルは基本的にプロセス間で実行/切り替えを行います。明らかに、実際にプロセスを実行しているものは、プロセスそれ自体ではありません。
(tl; dr 1. no 2.カーネルの一部/その拡張子)