Пользовательское пространство взаимодействует с пространством ядра с помощью системных вызовов . Оба «пространства» - пространство пользователя и пространство ядра - можно представить как отдельные программы, которые взаимодействуют друг с другом с помощью регистров и прерываний.
execve()
- это стандартная функция POSIX , предоставляемая операционной системой до C программ. Это должно быть реализовано вашей стандартной реализацией библиотеки, скорее всего, вы используете glib c. На Linux большинство функций POSIX соответствуют именам системных вызовов, поэтому glib c просто реализует тонкую оболочку вокруг системного вызова.
Когда системный вызов вызывается из программ пользовательского пространства, параметры сохраняются в регистрах и запускается прерывание. Это останавливает выполнение программы пользовательского пространства, и выполнение продолжается в пространстве ядра.
Ядро берет параметры из регистров пользовательского пространства и выполняет функцию, которая должна обрабатывать системный вызов. Большинство функций, которые обрабатывают системные вызовы, в ядре имеют просто имя do_<syscall>
. Функция do_execve()
- это просто функция, которую ядро использует для обработки execve()
syscall из пользовательского пространства.
Почему бы просто не использовать execve?
Зачем вызывать систему звоните, когда вы уже находитесь в пространстве ядра? Просто вызовите функцию, которая все равно обработает системный вызов.