如何让一个函数在不同的地址 space 中执行?编写克隆函数
How do I get a function to execute in a different address space? Writing a clone function
我的这段代码出现了分段错误。我对克隆函数的理解是,父进程必须为子进程分配 space,克隆调用在该堆栈中运行的函数 space。我是误会了什么还是我的代码没有意义?
char *stack;
char *stackTop;
stack = malloc(STACK_SIZE);
if (stack == NULL)
fprintf(stderr, "malloc");
stackTop = stack + STACK_SIZE;
myClone(childFunc, stackTop, CLONE_FILES, NULL);
int myClone(int (*fn)(void *), void *child_stack,int flags, void *arg){
int* space = memcpy(child_stack, fn, sizeof(fn));
typedef int func(void);
func* f = (func*)&space;
f();
}
那里存在根本性的误解。所以你得到了一个分段错误,它告诉我你正试图运行用户space[=35=中的这段代码](在操作系统创建的进程中)。
地址space是操作系统可用的抽象。它通常使用硬件支持(MMU [内存管理单元])提供使用虚拟地址的方法。这些地址在访问时会根据某些只有 OS 才能管理的数据结构自动转换为真正的 物理 地址。
我认为在这里进行详细介绍没有多大意义,您有足够的关键词 google 了。本质是:没有办法你可以从用户space创建一个地址space 代码。该功能保留给 OS,要做到这一点,linux 上的 clone()
发出 syscall,调用 OS。
edit:关于栈,提供栈就是为它预留space(通过映射适量的页到地址space ) 和 在上下文切换到进程时设置必要的处理器寄存器(例如 esp
/ebp
on i386
)。这也是只有操作系统才能做到的事情。
clone()
函数是一个系统调用。它无法在您的进程中通过 C 代码 运行 复制。
这不起作用的主要原因有两个。
内存保护:相关内存页必须是可执行的。您从 malloc
获得的数据页不是。 "Normal" 内存管理函数无法做到这一点。另一方面,现有的代码页是不可写的,因此您不能将一段代码移动到另一段。这是一个基本的内存保护机制。您必须返回 DOS 或使用一些高级 "debugging" 界面。
与位置无关的代码:代码中的所有内存地址必须是相对地址,或者手动修复。在 C 中执行此操作可能太棘手了。
我的这段代码出现了分段错误。我对克隆函数的理解是,父进程必须为子进程分配 space,克隆调用在该堆栈中运行的函数 space。我是误会了什么还是我的代码没有意义?
char *stack;
char *stackTop;
stack = malloc(STACK_SIZE);
if (stack == NULL)
fprintf(stderr, "malloc");
stackTop = stack + STACK_SIZE;
myClone(childFunc, stackTop, CLONE_FILES, NULL);
int myClone(int (*fn)(void *), void *child_stack,int flags, void *arg){
int* space = memcpy(child_stack, fn, sizeof(fn));
typedef int func(void);
func* f = (func*)&space;
f();
}
那里存在根本性的误解。所以你得到了一个分段错误,它告诉我你正试图运行用户space[=35=中的这段代码](在操作系统创建的进程中)。
地址space是操作系统可用的抽象。它通常使用硬件支持(MMU [内存管理单元])提供使用虚拟地址的方法。这些地址在访问时会根据某些只有 OS 才能管理的数据结构自动转换为真正的 物理 地址。
我认为在这里进行详细介绍没有多大意义,您有足够的关键词 google 了。本质是:没有办法你可以从用户space创建一个地址space 代码。该功能保留给 OS,要做到这一点,linux 上的 clone()
发出 syscall,调用 OS。
edit:关于栈,提供栈就是为它预留space(通过映射适量的页到地址space ) 和 在上下文切换到进程时设置必要的处理器寄存器(例如 esp
/ebp
on i386
)。这也是只有操作系统才能做到的事情。
clone()
函数是一个系统调用。它无法在您的进程中通过 C 代码 运行 复制。
这不起作用的主要原因有两个。
内存保护:相关内存页必须是可执行的。您从
malloc
获得的数据页不是。 "Normal" 内存管理函数无法做到这一点。另一方面,现有的代码页是不可写的,因此您不能将一段代码移动到另一段。这是一个基本的内存保护机制。您必须返回 DOS 或使用一些高级 "debugging" 界面。与位置无关的代码:代码中的所有内存地址必须是相对地址,或者手动修复。在 C 中执行此操作可能太棘手了。