В чем разница между do_execve () и execve () в Linux? - PullRequest
1 голос
/ 25 мая 2020

В следующей ссылке у меня есть следующий код:

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

И он говорит следующее:

Здесь мы видим, что kernel_init -> run_init_process -> do_execve, что аналогично обычному системному вызову execve, аргумент - двоичный файл init.

Я пытаюсь понять разницу между do_execve() и execve(). Почему бы просто не использовать execve()?

1 Ответ

1 голос
/ 25 мая 2020

Пользовательское пространство взаимодействует с пространством ядра с помощью системных вызовов . Оба «пространства» - пространство пользователя и пространство ядра - можно представить как отдельные программы, которые взаимодействуют друг с другом с помощью регистров и прерываний.

execve() - это стандартная функция POSIX , предоставляемая операционной системой до C программ. Это должно быть реализовано вашей стандартной реализацией библиотеки, скорее всего, вы используете glib c. На Linux большинство функций POSIX соответствуют именам системных вызовов, поэтому glib c просто реализует тонкую оболочку вокруг системного вызова.

Когда системный вызов вызывается из программ пользовательского пространства, параметры сохраняются в регистрах и запускается прерывание. Это останавливает выполнение программы пользовательского пространства, и выполнение продолжается в пространстве ядра.

Ядро берет параметры из регистров пользовательского пространства и выполняет функцию, которая должна обрабатывать системный вызов. Большинство функций, которые обрабатывают системные вызовы, в ядре имеют просто имя do_<syscall>. Функция do_execve() - это просто функция, которую ядро ​​использует для обработки execve() syscall из пользовательского пространства.

Почему бы просто не использовать execve?

Зачем вызывать систему звоните, когда вы уже находитесь в пространстве ядра? Просто вызовите функцию, которая все равно обработает системный вызов.

...