Linuxにおいて最初のユーザープロセスがどのように生成されるのかを調べています。
カーネル探検(rest_init()からプロセス番号1生成まで)
要約しました。
① kernel_thread(kernel_init,...) ↓ ② kernel_thread(kerneladd,...) ↓ ③ schdule() ↓ ④ kernel_init() //以下の関数はkernel_init内で呼ばれます。 ↓ ⑤ init_post ↓ ⑥ run_init_process() kernel_execve(init_filename,...) //execveシステムコールを呼び出すだけ。
で、前提
forkシステムコール・・・指定したプロセスをコピー・クローンを作成
execveシステムコール・・・このシステムコールを読んだプロセスのメモリ内容を
引数に指定したプログラム(言い方が適切ではないかも)用に"完全に"入れ替える。
また、
③においてスケジューリング関数が呼ばれるまでプロセスの概念はないはずです。
kernel_thread関数が2回呼ばれています。
これにより、以下の2つがスケジューリング関数が呼ばれて
スケジュールされることによりCPU実行権が回ってくるまで待機することになります。
カーネルスレッドとして動くことになる。
・kernel_init
・kernel_add
で、本題
kernel_init内(これはカーネルスレッド)でramfsの/initを実行するために
run_init_process()以下の関数を呼び出していますよね。(詳しくはサイトを参照)
execveシステムコール・・・このシステムコールを読んだプロセスのメモリ内容を 引数に指定したプログラム(言い方が適切ではないかも)用に"完全に"入れ替える。
ならば、カーネルスレッドであるkernel_initのメモリ内容はinit用に完全に入れ替わってしまうことになってしまいますよね?
まぁ、実際にはそうなりませんが なぜそうならないのか?
ここで呼ばれているexecveシステムコールと言うのは普段僕たちが目にしているexecveシステムコールとは別のものではないか?(とりあえず、仕組みとしてそう作ることはできるだろう)
とも考えているのですが実際はどうなっているんでしょうか?
これ知っている人このサイトにいるんですかね・・・
もし知っていたら教えてください!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/29 14:35
2020/07/29 14:49
2020/07/29 16:46
2020/07/29 22:24 編集
2020/07/31 14:38
2020/07/31 14:41
2020/08/01 09:24
2020/08/02 02:16
2020/08/02 13:04
2020/08/02 14:47