В ядре 3.8, как первый пользовательский процесс переключается в пользовательский режим, в то время как kernel_execve удаляется

В версии ядра 3.8.x и более поздней версии изменяется определение для run_init_process.

Ниже приведено новое определение для run_init_proces в ядре 3.8.

 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 отсутствует. Мой вопрос в том, как первый пользовательский процесс переключается в пользовательский режим.

Ответ 1

Успешный do_execv() устанавливает процесс current для запуска новой программы (например, через load_elf_binary()), а затем возвращается От 0 до run_init_process(), который возвращает 0 в kernel_init(), который также возвращает 0 и был вызван как часть:

    kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

Здесь приведены правила из https://lwn.net/Articles/520227/: наш fn() вернул 0 после execve, поэтому "thread перейдет в контекст userland, созданный этим execve".