質問: Linuxにおいて最初のユーザープロセスがどのように生成されるのかを調べています。 カーネル探検(rest_init()からプロセス番号1生成まで) 要約しました。 ``` 1 kernel_thread(kernel_init,...) ↓ 2 kernel_thread(kerneladd,...) ↓ 3 schdule() ↓ 4 kernel_init() //以下の関数はkernel_init内で呼ばれます。 ↓ 5 init_post ↓ 6 run_init_process() kernel_execve(init_filename,...) //execveシステムコールを呼び出すだけ。 ``` で、前提 forkシステムコール・・・指定したプロセスをコピー・クローンを作成 execveシステムコール・・・このシステムコールを読んだプロセスのメモリ内容を 引数に指定したプログラム(言い方が適切ではないかも)用に"完全に"入れ替える。 また、 3においてスケジューリング関数が呼ばれるまでプロセスの概念はないはずです。 kernel_thread関数が2回呼ばれています。 これにより、以下の2つがスケジューリング関数が呼ばれて スケジュールされることによりCPU実行権が回ってくるまで待機することになります。 カーネルスレッドとして動くことになる。 ・kernel_init ・kernel_add で、本題 kernel_init内(これはカーネルスレッド)でramfsの/initを実行するために run_init_process()以下の関数を呼び出していますよね。(詳しくはサイトを参照) ``` execveシステムコール・・・このシステムコールを読んだプロセスのメモリ内容を 引数に指定したプログラム(言い方が適切ではないかも)用に"完全に"入れ替える。 ``` ならば、カーネルスレッドであるkernel_initのメモリ内容はinit用に完全に入れ替わってしまうことになってしまいますよね? まぁ、実際にはそうなりませんが なぜそうならないのか? ここで呼ばれているexecveシステムコールと言うのは普段僕たちが目にしているexecveシステムコールとは別のものではないか?(とりあえず、仕組みとしてそう作ることはできるだろう) とも考えているのですが実際はどうなっているんでしょうか? これ知っている人このサイトにいるんですかね・・・ もし知っていたら教えてください!
回答: このページに書いてあることが回答になっているっぽいですけどどうですかね。