上海猎头公司排行榜,网站建设优化服务多少钱,网站设计培训班,注册一家公司1. 内核栈的分配#xff0c;即thread_info的分配#xff0c;是在do_fork-dup_task_struct中分配(默认为2个pages)#xff0c;并赋值给task_struct-stack#xff1b;2. 用户栈的分配分两种#xff1a;一是pthread create会事先mmap分配好用户栈#xff0c;传给do_…1. 内核栈的分配即thread_info的分配是在do_fork-dup_task_struct中分配(默认为2个pages)并赋值给task_struct-stack2. 用户栈的分配分两种一是pthread create会事先mmap分配好用户栈传给do_fork-copy_thread用户栈起始地址会赋值给pt_regs-sp接着设置内核栈底p-thread.cpu_context.sp (unsigned long)childregs二是fork时借用了父进程的线程栈若ret_from_user后应用层调用了exec-do_execuveat_common-exe_binprm-search_binary_handler-load_elf_binary-set_arg_pages重新分配用户栈接着调用start_thread配置pt_regs3. 内核态(SVC模式)下的寄存器上下文存放位置task_struct的thread成员类型为struct thread_struct4. 用户态(非异常模式)下的寄存器上下文存放位置内核栈的底部。可如此获取(task_pt_regs(task_struct))struct task_struct的stack成员指向struct thread_infothread_info即为内核栈的起始地址thread_info内核栈的固定大小(2 page)即为struct pt_regs的结束地址pt_regs即为用户态寄存器上下文的存放位置5. thread_info的task成员指向task_struct结构体6. 进程切换只会发生在内核态即进程切换只需要考虑内核态的寄存器上下文切换见schedule-__schedule-switch_to-cpu_switch_to中将当前的regs保存到current-thread-context同时恢复nex taskt的regs7. 发生系统调用/异常时需要保存用户态/内核态的寄存器上下文此时通过kernel_entry将用户态/内核态的regs保存于异常模式的栈中当异常完成后调用kernel_exit将用户态/内核态的regs恢复综上只要知道了task_struct即可知道内核栈的起始地址(即thread_infotask_struct-stack)也知道了内核态的寄存器上下文(即task_struct-thread-context)同时也知道了用户态寄存器上下文(即task_struct-stackkthread_stack_size-sizeof(pt_regs))从而知道用户栈的当前地址(即pt_regs-sp)