博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux源码解析-dup_task_struct函数
阅读量:4212 次
发布时间:2019-05-26

本文共 1490 字,大约阅读时间需要 4 分钟。

1.dup_task_struct函数调用位置及其作用

调用位置:  do_fork -> copy_process -> dup_task_struct

作用:复制一份task_struct结构体

2.函数主体流程

static struct task_struct *dup_task_struct(struct task_struct *orig){	struct task_struct *tsk;	struct thread_info *ti;	unsigned long *stackend;	int err;	prepare_to_copy(orig);	tsk = alloc_task_struct();  //创建新的子进程结构体	if (!tsk)		return NULL;	ti = alloc_thread_info(tsk);	if (!ti) {		free_task_struct(tsk);		return NULL;	} 	err = arch_dup_task_struct(tsk, orig); //把orig中的内容完全复制给tsk,相当于*tsk = *orig	if (err)		goto out;	tsk->stack = ti;	err = prop_local_init_single(&tsk->dirties);	if (err)		goto out;	setup_thread_stack(tsk, orig);      /*为整个thread_info结构复制,并设置指针指向   thread_info里面有一个指向task_struct的指针 ,子进程指向子进程的,父进程指向父进程的,而现在,   这两个thread_info中的某个指针,都指向了父进程的task_struct,所以还要使得子进程thread_info的指针指向tsk的task_struct,   而不是 父进程的task_struct:task_thread_info(p)->task = p;*/       clear_user_return_notifier(tsk);	stackend = end_of_stack(tsk);	*stackend = STACK_END_MAGIC;	/* for overflow detection */#ifdef CONFIG_CC_STACKPROTECTOR	tsk->stack_canary = get_random_int();#endif	/* One for us, one for whoever does the "release_task()" (usually parent) */	atomic_set(&tsk->usage,2);	atomic_set(&tsk->fs_excl, 0);#ifdef CONFIG_BLK_DEV_IO_TRACE	tsk->btrace_seq = 0;#endif	tsk->splice_pipe = NULL;	account_kernel_stack(ti, 1);	return tsk;out:	free_thread_info(ti);	free_task_struct(tsk);	return NULL;}
在专业高速缓冲内存上
分配task_struct,并完成初始化
在普通内存中
分配thread_info及连续的两个页面,完成初始化
将task_struct和thread_info联系起来

转载地址:http://biumi.baihongyu.com/

你可能感兴趣的文章
使用高匿名IP安全吗?
查看>>
Java和python爬虫有什么区别?
查看>>
如何检测代理IP有效性?附代码
查看>>
SOCKS5代理的应用场景有哪些?
查看>>
代理IP可以降低手游网络延迟吗?
查看>>
电脑提示IP地址错误的解决方法
查看>>
IP代理与白名单的联系
查看>>
如何检测IP的速度及稳定性?
查看>>
爬虫代理IP被封的六大原因
查看>>
基于C/C++的二维动态数组构建
查看>>
本文通过c语言实现九宫格。九宫格的难点在于如何创建矩阵,数字如何排列,在边界处如何处理。因此,本文主要有两个部分:二维动态数组实现任意奇数阶的矩阵;矩阵中数字的排列。
查看>>
leecode142题题解
查看>>
剑指offer-斐波那契数列的解法
查看>>
剑指offer-递归问题集合(使用迭代的方法对递归问题进行优化)
查看>>
剑指offer—二进制中1的个数
查看>>
剑指offer—用两个栈实现一个队列
查看>>
剑指offer——二维数组的查找
查看>>
剑指offer——替换字符串中的字符
查看>>
剑指offer——国王的游戏(幂运算)
查看>>
剑指offer——从前序遍历和中序遍历重建二叉树
查看>>