Linux进程创建:用户模式堆栈

时间:2010-11-10 05:10:28

标签: linux

我是Linux新手,明白从用户模式来看,如果一个进程调用系统调用fork(),那么进程在系统模式下执行,并使用新的内核模式空间创建一个新的子进程(包括stack also)被分配给新创建的子进程。 我的问题是, 1>如何以及何时为这个新创建的进程创建用户模式堆栈? 2>内核如何知道这个新创建的进程的用户模式堆栈在哪里? 3>内核可以在新创建的进程上下文中以内核模式执行时访问用户模式堆栈吗?

如果我的问题或理解是错误的,请纠正我。

提前感谢您的指导。

问候 Bibek

3 个答案:

答案 0 :(得分:4)

fork()复制分配给分叉进程(父进程)的整个内存映射。它创建了一个相同的过程,然后独立于父过程进行。

两者以相同的堆和堆栈开始。指向当前堆栈位置的x86寄存器指向父进程和子进程的相同内存地址(因为它们的内存映射相同)。

答案 1 :(得分:1)

  1. 通常,当您致电exec()或创建新的胎面时,程序会获得新的用户模式堆栈。如果要手动执行此操作,请使用mmap()系统调用。 注意:进程可以有多个堆栈(绿色线程或信号堆栈)。

  2. 当你进行系统调用时,你的寄存器会被保存 - 这包括堆栈地址。

  3. 大多数内核函数无法直接访问用户模式堆栈。但是,当然,在ring-0中,内核可以调整权限并在需要时对其进行评估。在未修改的内核中,这仅限于一些选定的函数。 (在内核源代码中搜索copy_to_usercopy_from_user

答案 2 :(得分:1)

我的回答是:

  1. 整个虚拟内存与新进程重复,包括任何堆栈。内核对待它与其他任何页面没有区别
  2. 内核不需要知道用户模式堆栈在哪里实现,只需复制整个地址空间。
  3. 不需要访问用户模式堆栈来执行此操作。
  4. 唯一的区别是内核为父级和子级提供的返回值。

    当fork()系统调用返回时,它将返回父和子中的相同地址但具有不同的返回值(child总是得到0,parent得到child的pid)。由于它们每个都有自己的副本(它可以是写入时复制,但很快就会写入),这没有问题。