慢慢欣赏linux 进程创建的时候堆栈的建立

慢慢欣赏linux 进程创建的时候堆栈的建立
long _do_fork(unsigned long clone_flags,
	      unsigned long stack_start,
	      unsigned long stack_size,
	      int __user *parent_tidptr,
	      int __user *child_tidptr,
	      unsigned long tls)
{
	p = copy_process(clone_flags, stack_start, stack_size,
			 child_tidptr, NULL, trace, tls, NUMA_NO_NODE);
	=>struct task_struct *copy_process(
					unsigned long clone_flags,
					unsigned long stack_start,
					unsigned long stack_size,
					int __user *child_tidptr,
					struct pid *pid,
					int trace,
					unsigned long tls,
					int node)
	{
		p = dup_task_struct(current, node);
		=>struct task_struct *dup_task_struct(struct task_struct *orig, int node)
		{
			struct task_struct *tsk = alloc_task_struct_node(node);
			unsigned long *stack = alloc_thread_stack_node(tsk, node);
			
			tsk->stack = stack;
			set_task_stack_end_magic(tsk);
			=>void set_task_stack_end_magic(struct task_struct *tsk)
			{
				unsigned long *stackend;

				stackend = end_of_stack(tsk);
				*stackend = STACK_END_MAGIC;	/* for overflow detection */
			}
		}
	}
	
	retval = copy_thread_tls(clone_flags, stack_start, stack_size, p, tls);
	=>int copy_thread_tls(unsigned long clone_flags, unsigned long sp,
	unsigned long arg, struct task_struct *p, unsigned long tls)
	{
		struct pt_regs *childregs = task_pt_regs(p);
		=>#define task_pt_regs(task) \
		({									\
			unsigned long __ptr = (unsigned long)task_stack_page(task);	\
			__ptr += THREAD_SIZE - TOP_OF_KERNEL_STACK_PADDING;		\
			((struct pt_regs *)__ptr) - 1;					\
		})
		=>void *task_stack_page(const struct task_struct *task)
		{
			return task->stack;
		}
		
		struct fork_frame *fork_frame = container_of(childregs, struct fork_frame, regs);
		struct inactive_task_frame *frame = &fork_frame->frame;

		frame->bp = 0;
		frame->ret_addr = (unsigned long) ret_from_fork;
		p->thread.sp = (unsigned long) fork_frame;
		p->thread.sp0 = (unsigned long) (childregs+1);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值