Chinaunix首页 | 论坛 | 博客
  • 博客访问: 619993
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: LINUX

2012-02-13 23:47:07

前面的copy_process调用了一个dup_task_struct来复制一个task_struct,一下是该函数的主要工作:

1)为task_struct开辟内存
  1. tsk = alloc_task_struct_node(node);
2)为thread_info开辟内存
  1. ti = alloc_thread_info_node(tsk, node);
3) 复制父进程的task_struct信息到新的task_struct里
  1. err = arch_dup_task_struct(tsk, orig);
以下是arch_dup_task_struct的不同实现
  1. int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  2. {
  3.     *dst = *src;

  4.     if (src->thread.xstate) {
  5.         dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep,
  6.                          GFP_KERNEL);
  7.         if (!dst->thread.xstate)
  8.             return -ENOMEM;
  9.         memcpy(dst->thread.xstate, src->thread.xstate, xstate_size);
  10.     }

  11.     return 0;
  12. }
  1. int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
  2. {
  3.     int ret;

  4.     *dst = *src;
  5.     if (fpu_allocated(&src->thread.fpu)) {
  6.         memset(&dst->thread.fpu, 0, sizeof(dst->thread.fpu));
  7.         ret = fpu_alloc(&dst->thread.fpu);
  8.         if (ret)
  9.             return ret;
  10.         fpu_copy(&dst->thread.fpu, &src->thread.fpu);
  11.     }
  12.     return 0;
  13. }
可以看到,两个函数里都有相同的一段 *dst = *src;这就是把复制父进程的task_struct到新进程的task_struct里。
这里主要完成orig到tsk复制的工作,然后再进行一些体系相关的工作

4)prop_local_init_single 这个暂时还没弄明白

5)setup_thread_stack 设置线程栈
这里面也有很多体系相关的东西,以下是主要的代码,首先把当前的thread_info设置成和父进程一样的,
然后,再把thread_info里的task设置成新生产的task_struct结构
  1. #define setup_thread_stack(p, org) \
  2.     *task_thread_info(p) = *task_thread_info(org); \
  3.     task_thread_info(p)->task = (p);
6)设置栈底魔数
  1.     stackend = end_of_stack(tsk);
  2.     *stackend = STACK_END_MAGIC;    /* for overflow detection */
end_of_stack(tsk)用来获取tsk的栈底,然后将栈底的内容设置为STACK_END_MAGIC,用来标识栈底,防止栈被过度使用导致溢出。
阅读(3215) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~