- 求职 : 通讯/电信开
- 论坛徽章:
- 2
|
本帖最后由 九阳神功爱喝茶 于 2015-06-16 19:28 编辑
小弟研究copy_thread函数的时候遇到些问题,还要麻烦各位前辈多多指导,万分感谢。问题见红色标注的地方
- int copy_thread(unsigned long clone_flags, unsigned long sp,
- unsigned long unused,
- struct task_struct *p, struct pt_regs *regs)
- {
- struct pt_regs *childregs;
- struct task_struct *tsk;
- int err;
- //这儿是在内核栈的栈顶开辟8个字节的内存空间,我很不理解这里有什么作用?
- childregs = task_pt_regs(p);
- //保存父寄存器的值到自己存器中;
- *childregs = *regs;
- //修改子进程寄存器的相关值;childregs占用了17*4个字节,但是只开辟了8字节的内核空间,这样的话不是破坏了原来的thread_info结构体的内容了吗?
- childregs->ax = 0;
- childregs->sp = sp;
- p->thread.sp = (unsigned long) childregs;
- p->thread.sp0 = (unsigned long) (childregs+1);
- p->thread.ip = (unsigned long) ret_from_fork;
- task_user_gs(p) = get_user_gs(regs);
- tsk = current;
- if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
- p->thread.io_bitmap_ptr = kmemdup(tsk->thread.io_bitmap_ptr,
- IO_BITMAP_BYTES, GFP_KERNEL);
- if (!p->thread.io_bitmap_ptr) {
- p->thread.io_bitmap_max = 0;
- return -ENOMEM;
- }
- set_tsk_thread_flag(p, TIF_IO_BITMAP);
- }
- err = 0;
- /*
- * Set a new TLS for the child thread?
- */
- if (clone_flags & CLONE_SETTLS)
- err = do_set_thread_area(p, -1,
- (struct user_desc __user *)childregs->si, 0);
- if (err && p->thread.io_bitmap_ptr) {
- kfree(p->thread.io_bitmap_ptr);
- p->thread.io_bitmap_max = 0;
- }
- clear_tsk_thread_flag(p, TIF_DS_AREA_MSR);
- p->thread.ds_ctx = NULL;
- clear_tsk_thread_flag(p, TIF_DEBUGCTLMSR);
- p->thread.debugctlmsr = 0;
- return err;
- }
复制代码 代码里面的文字不能标示红色,只能在最后写下问题了:
//这你是在内核栈的栈顶开辟8个字节的内存空间,我很不理解这里有什么作用?
childregs = task_pt_regs(p);
第二个是:
//修改子进程寄存器的相关值;childregs占用了17*4个字节,但是只开辟了8字节的内核空间,这样的话不是破坏了原来的thread_info结构体的内容了吗?
childregs->ax = 0;
childregs->sp = sp;
还请各位多多指导。
|
|