В ядре 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".