Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何让函数在不同的地址空间中执行?编写克隆函数_C_Memory_Process_Malloc_Clone - Fatal编程技术网

C 如何让函数在不同的地址空间中执行?编写克隆函数

C 如何让函数在不同的地址空间中执行?编写克隆函数,c,memory,process,malloc,clone,C,Memory,Process,Malloc,Clone,我有这个代码,它给了我一个分段错误。我对克隆函数的理解是,父进程必须为子进程分配空间,克隆调用在该堆栈空间中运行的函数。我是误解了什么,还是我的代码没有意义 char *stack; char *stackTop; stack = malloc(STACK_SIZE); if (stack == NULL) fprintf(stderr, "malloc"); stackTop = stack + STACK_SIZE; myClone(

我有这个代码,它给了我一个分段错误。我对克隆函数的理解是,父进程必须为子进程分配空间,克隆调用在该堆栈空间中运行的函数。我是误解了什么,还是我的代码没有意义

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();
}
这里有一个基本的误解。所以你得到了一个分段错误,它告诉我你试图在用户空间中运行这个代码(在操作系统创建的进程中)

地址空间是操作系统可用的抽象。它通常使用硬件支持(MMU[内存管理单元])来提供使用虚拟地址的方法。这些地址在被访问时会根据一些只有操作系统才能管理的数据结构自动转换为实际物理地址

我认为在这里详细讨论没有多大意义,你有足够的关键词可以在谷歌上搜索。其实质是:没有办法从用户空间代码创建地址空间。该功能保留给操作系统,为此,linux上的
clone()
发出系统调用,调用操作系统


编辑:关于堆栈,提供堆栈意味着为其保留空间(通过将适当数量的页面映射到地址空间),并在上下文切换到进程时设置必要的处理器寄存器(例如
esp
/
ebp
on
i386
)。这也是只有操作系统才能做到的。

克隆()函数是一个系统调用。它不能被进程中运行的C代码复制。

这不起作用的主要原因有两个

  • 内存保护:相关内存页必须是可执行的。从
    malloc
    获取的数据页不是。“正常”内存管理功能无法做到这一点。另一方面,现有的代码页是不可写的,因此不能将一段代码移到另一段代码上。这是一种基本的内存保护机制。你要么回到DOS,要么使用一些高级的“调试”界面

  • 位置独立代码:代码中的所有内存地址必须是相对的,或者是手动修复的。在C中这样做可能太棘手了


您的代码根本没有意义。您不能记忆一个函数(
fn
),而期望获得该函数的所有代码。无法完成。克隆函数如何使用传递的堆栈指针?为什么在调用
myClone()
之前要添加
stack\u SIZE
?这将
memcpy
放入尚未分配的内存。
sizeof(fn)
是函数指针的大小,而不是函数代码。@WeatherVane克隆如何使用传递的堆栈指针?我觉得自己很笨。我想我现在明白了。