欢迎来到天天文库
浏览记录
ID:9298993
大小:541.00 KB
页数:10页
时间:2018-04-27
《linux进程创建与切换》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、进程创建1.系统调用与进程创建2.Do_fork()3.copy_process4.资源拷贝和属性设置其中copy_threadp->thread.ip为switch_to之后的入口地址:(查看switch_to)关于pt_regs5.ret_from_fork关于pushl%eaxCallschedule_tail关于Jumpsyscall_exit():现在esp正好指向pt_regs,执行系统调用退出,最后会执行RESTORE_ALL和iret等弹出pt_regs的所有内容(entry_32.s)。进程切换1.进程调度的开始schedule(主动让出
2、,被抢占)2.目标进程的选择。Pick_next_task调度类:1.首先判断本地调度队列的进程是否全部属于CFS调度类2.依次使用实时调度类,CFS调度类,IDLE调度类选择下一个进程,选好进程即返回。CFS类基本原理:RT调度类,使用了2.6..23以前的调度算法的思想,维护了100个不同优先级的实时进程队列。3选定进程后的切换context_switchSwitch_mm:核心是加载下一个进程的pgd页目录基地址到cr3。完成地址空间切换。在do_fork的copy_mm中可以发现所有进程的内核页目录项都是一致,从swap_pg_dir开始的256项
3、,下面对堆栈等内核数据结构的操作不受影响。Switch_to:标号1将schedule函数分成了两段。切换的过程:1.保存切换回来时需要的内容2.加载新进程的上下文,手动修改eip完成跳转。3.设置next_ip为返回地址,jmp__switch_to执行后续工作,注意这里使用jmp而不是call关于实验中的问题要求(3):从CPU的IP值的变化上,说明在switch_to宏执行后,执行了哪个函数?执行了这个函数之后,又到哪里执行了?next->thread.eip;分两种情况:刚创建的进程p->thread.ip=(unsignedlong)ret_fr
4、om_fork();执行ret_from_fork()这个函数。在ret_from_fork这里需要重置EFLAGS。已经被调度过的进程:标号为1的地址要求(4):说明哪一行代码切换了堆栈,在切换堆栈前后,求current_thread_info有什么变化主要是指8k堆栈的起始地址,使用esp来计算的"movl%[next_sp],%%espt"要求(5):说明哪一行代码切换了地址空间,在切换堆栈前还是后?为什么地址空间的切换不会影响后续切换代码的执行?context_switch—>switch_mmload_cr3(next->pgd);要求(6
5、):说明哪一行代码的执行,使得current宏所代表的进程发生了变化跟踪#definecurrentget_current()static__always_inlinestructtask_struct*get_current(void){returnx86_read_percpu(current_task);}最终是读取系统的current_task值。在_switch_to中执行以下代码,即改变current_task的值要求(7):说明哪一行代码的执行,使得任务状态段中关于内核堆栈的信息发生了变化在_switch_to中:load_sp0(tss,n
6、ext);关于3次fork共分为三代8个进程父进程子进程1子进程2子进程子进程11子进程21子进程12子进程111
此文档下载收益归作者所有