2015-11-16 2 views
-1

Я пытаюсь запустить новую программу (процесс) из текущей текущей программы c. Вместо использования функций fork() и exec() я хотел использовать функции ядра Linux, такие как switch_mm()/activate_mm() или copy_mm() и т. Д.Как запустить новый процесс с помощью коммутатора адресного пространства linux?

Что я имею в виду, это сначала создать новый адрес пространство в памяти и загрузить новый исполняемый файл (ELF) в память. Затем переместите адресное пространство из текущего адресного пространства в новое адресное пространство, используя команду, например switch_mm() или activate_mm(), и пусть новая программа начнет выполнение. Я не уверен, что это правильный правильный подход. Но, я думаю, есть функции ядра Linux, которые можно использовать для выполнения этих задач. Я не уверен, как создать новое адресное пространство в текущем процессе и загрузить ELF. Я также не уверен, можно ли выполнить эту задачу с помощью одного процесса (не создавая новый процесс для новой программы). Любая помощь будет оценена по достоинству.

+0

'switch_mm()' и т. Д. Являются функциями ядра. Пользовательское пространство не может использовать их напрямую. 'fork()' и т. д. вызывают их для вас. –

ответ

1

Вы не можете. Функции, которые вы имеете в виду (switch_mm(), activate_mm(), copy_mm()), являются внутренними функциями ядра и недоступны для пользовательского пространства.

Если вы чувствуете себя действительно приключений, вы может быть в состоянии имитировать эффекты fork()/exec() с помощью clone() системного вызова, чтобы создать новый процесс, то остановить процесс ребенка, изменяя свое состояние с помощью ptrace(), затем позволяет продолжить. Однако это будет довольно сложная задача.

Смежные вопросы