当我们调用 fork() 时。它调用系统调用 clone,后者调用 do_fork 函数,并在该函数内部调用 copy_process。 copy_process 调用 dup_task_struct 为新进程创建新的内核堆栈、新的 task_struct、新的 thread_info。如果 exec 调用它创建新进程。
But when does user space stack created in this sequence of creating process? I have same question for thread.
Does user space stack also has pointer to task_struct or thread_info type of structure ?
如果我问了一些愚蠢的问题,请帮助我并纠正我。
最佳答案
在 fork() 中,没有创建用户栈。用户堆栈由 mm_struct 的 vm_area_struct 表示。 do_fork 调用 copy_mm,仅当未设置 CLONE_VM 标志时,它才会复制调用 fork 的新进程 mm_struct。 如果设置,在线程创建的情况下,它只是增加 mm_user 的计数,新任务 mm 指向当前任务 mm。
只有当exec被调用时do_execve被调用whic调用bprm_mm_init,allocate_mm被调用从mm_cachep slab分配(当然内存也需要复制mm用于新进程),然后mm_init初始化mm结构并分配页全局目录的内存。
然后调用 __bprm_mm_init 创建用户空间栈,即栈的 vm_area_struct 结构
关于linux - 调用fork后什么时候创建用户空间栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505708/