12

カーネル 3.8.x 以降のバージョンでは、run_init_process の定義が変更されています。

以下は、カーネル 3.8 での run_init_proces の新しい定義です。

 static int run_init_process(const char *init_filename) {
         argv_init[0] = init_filename;
        return do_execve(init_filename,
                (const char __user *const __user *)argv_init,
                 (const char __user *const __user *)envp_init); }

カーネル 3.7.x および古いバージョンでの定義と比較。

static int run_init_process(const char *init_filename) {
         argv_init[0] = init_filename;
         return kernel_execve(init_filename, argv_init, envp_init); }

kernel_execveの最も重要な部分は、ret_from_kernel_execveを呼び出すことです。これにより、ユーザー モードに切り替わります。

新しい定義では、kernel_execveがなくなりました。私の質問は、最初のユーザープロセスがユーザーモードにどのように切り替えられるかです。

4

1 に答える 1

1

成功したは、新しいプログラムを実行するプロセスをdo_execv()セットアップし(例: 経由)、0 をに返します。これは 0 を に返します。これも 0 を返します。次の一部として呼び出されました。currentload_elf_binary()run_init_process()kernel_init()

    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

これは、https ://lwn.net/Articles/520227/ のルールの出番です。 のfn()後に 0 が返されたexecveため、「スレッドは、その execve によって作成されたユーザーランド コンテキストに進みます」。

于 2014-01-19T05:53:57.027 に答える