网站大量收购闲置独家精品文档,联系QQ:2885784924

linux进程创建与切换.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux进程创建与切换

进程创建 1.系统调用与进程创建 2.Do_fork() 3. copy_process 4.资源拷贝和属性设置 其中copy_thread p-thread.ip为switch_to之后的入口地址:(查看switch_to) 关于pt_regs 5. ret_from_fork 关于pushl %eax Call schedule_tail 关于Jump syscall_exit(): 现在esp正好指向pt_regs, 执行系统调用退出, 最后会执行RESTORE_ALL和iret等弹出pt_regs的所有内容(entry_32.s)。 进程切换 进程调度的开始schedule(主动让出,被抢占) 2. 目标进程的选择。 Pick_next_task 调度类: 1.首先判断本地调度队列的进程是否全部属于CFS调度类 2.依次使用实时调度类,CFS调度类,IDLE调度类选择下一个进程,选好进程即返回。 CFS类基本原理: RT调度类,使用了2.6..23以前的调度算法的思想,维护了100个不同优先级的实时进程队列。 选定进程后的切换 context_switch Switch_mm: 核心是加载下一个进程的pgd页目录基地址到cr3。完成地址空间切换。 在do_fork的copy_mm中可以发现所有进程的内核页目录项都是一致,从swap_pg_dir开始的256项,下面对堆栈等内核数据结构的操作不受影响。 Switch_to : 标号 1 将schedule函数分成了两段。 切换的过程: 保存切换回来时需要的内容 加载新进程的上下文,手动修改eip完成跳转。 设置next_ip为返回地址,jmp __switch_to执行后续工作,注意这里使用 jmp而不是call 关于实验中的问题 要求(3):从CPU的IP值的变化上,说明在switch_to宏执行后,执行了哪个函数?执行了这个函数之后,又到哪里执行了? 两种情况:p-thread.ip = (unsigned long) ret_from_fork(); 执行ret_from_fork()这个函数。 在ret_from_fork重置EFLAGS。要求(4):说明哪一行代码切换了堆栈,在切换堆栈前后,求current_thread_info有什么变化 要求(5):说明哪一行代码切换了地址空间,在切换堆栈前还是后?为什么地址空间的切换不会影响后续切换代码的执行? context_switch—switch_mm load_cr3(next-pgd); 要求(6):说明哪一行代码的执行,使得current宏所代表的进程发生了变化 #define current get_current() static __always_inline struct task_struct *get_current(void) { return x86_read_percpu(current_task); } 最终是读取系统的current_task值。 在_switch_to中执行以下代码,即改变current_task的值 要求(7):说明哪一行代码的执行,使得任务状态段中关于内核堆栈的信息发生了变化 _switch_to中:load_sp0(tss, next); 关于3次fork 共分为三代8个进程 子进程 子进程2 子进程1 父进程 子进程11 子进程21 子进程12 子进程111

文档评论(0)

pangzilva + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档