c - 如何使用linux地址空间切换来运行新进程?

标签 c linux process linux-kernel

我正在尝试从当前正在运行的 C 程序启动一个新程序(进程)。我不想使用 fork() 和 exec() 函数,而是想使用 Linux 内核函数,如 switch_mm()/activate_mm() 或 copy_mm() 等。

我的想法是首先在内存中创建一个新的地址空间并将新的可执行文件(ELF)加载到内存中。然后使用 switch_mm() 或 activate_mm() 等命令将地址空间从当前地址空间切换到新地址空间,并让新程序开始执行。我不确定这是否是正确的方法。但是,我认为 Linux 内核函数可以用来执行这些任务。我不知道如何在当前进程中创建新的地址空间并加载 ELF。我也不确定是否可以使用单个进程来完成此任务(而不是为新程序创建新进程)。任何帮助将不胜感激。

最佳答案

你不能。您所指的函数(switch_mm()activate_mm()copy_mm())都是内部内核函数,不可用到用户空间。

如果您真的喜欢冒险,您也许可以使用以下命令来模拟 fork()/exec() 的效果clone()系统调用创建一个新进程,然后停止子进程,使用 ptrace() 修改其状态,然后允许其继续。但这将是一项相当复杂的任务。

关于c - 如何使用linux地址空间切换来运行新进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743577/

相关文章:

c - 如何与 fork 的后台进程进行通信/接口(interface)?

c - C语言中的原子类型是什么?

c - outportb和8086汇编中的out指令有明显区别吗?

c - 移动内存页面的方法比 mremap() 更快?

java - 通过java在mac中打开终端

C++ 使用参数启动进程

c - 列表不断打印

c - 为什么 C 中二维数组的内容通过函数调用持久存在?

linux - unix 'find' 是否每次都给出相同的命令?

c++ - 在 QString 插入函数中使用参数