课件linux作系统分析.ppt

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

进程0 所有进程的祖先叫做进程0 在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程 存放在init_task_union变量中的一个进程描述符和一个内核态堆栈(回忆一下启动时,堆栈的初始化) 用INIT_MM, INIT_MMAP, INIT_FS, INIT_FILES, INIT_SIGNALS宏初始化进程描述符的各个对应域 页全局目录,swapper_pg_dir变量 进程0最后的初始化工作创建init内核线程,此后运行cpu_idle,成为idle进程 xlanchen@2007.9.25 Linux Operating Systems Analysis * 进程上下文 包含了进程执行需要的所有信息 用户地址空间 包括程序代码,数据,用户堆栈等 控制信息 进程描述符,内核堆栈等 硬件上下文 xlanchen@2007.9.25 Linux Operating Systems Analysis * 硬件上下文 尽管每个进程可以有自己的地址空间,但所有的进程只能共享CPU的寄存器。 因此,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。这样才能正确的恢复一个进程的执行 硬件上下文: 进程恢复执行前必须装入寄存器的一组数据 包括通用寄存器的值以及一些系统寄存器 通用寄存器如eax,ebx等 系统寄存器如eip,esp,cr3等等 xlanchen@2007.9.25 Linux Operating Systems Analysis * 在linux中 一个进程的硬件上下文主要保存在thread_struct中 其他信息放在内核态堆栈中 xlanchen@2007.9.25 Linux Operating Systems Analysis * thread_struct xlanchen@2007.9.25 Linux Operating Systems Analysis * 上下文切换 switch_to宏执行进程切换,schedule()函数调用这个宏一调度一个新的进程在CPU上运行 在schedule()中找到调用switch_to宏的位置 switch_to利用了prev和next两个参数: prev:指向当前进程 next:指向被调度的进程 xlanchen@2007.9.25 Linux Operating Systems Analysis * 当前进程仍然是prev 这个push操作针对的是 当前进程的堆栈 保存esi,edi,ebp 保存esp到%0中 嵌入式汇编中 用这种方法表 示输入、输出 参数,可以从 0开始编号 %0是什么? 保存esp到当前进程的上下文中 从next的上下文中取出堆栈的位置,将其作为当前堆栈 堆栈被切换 在prev进程的上下文中设置返回地址,返回到下面标号为1处 从next进程的上下文中取得该进程的返回地址,放入堆栈中 调用__switch_to函数 xlanchen@2007.9.25 Linux Operating Systems Analysis * 进程切换的关键语句 堆栈的切换 从此,内核对next的内核态堆栈操作,因此,这条指令执行从prev到next真正的上下文切换,因为进程描述符和内核态堆栈紧密联系在一起,改变内核态堆栈就意味改变当前进程 xlanchen@2007.9.25 Linux Operating Systems Analysis * 什么时候next进程真正开始执行呢? call=保存返回地址+跳转到target处执行 ret=从堆栈上获得返回地址,并跳转到该返回地址处执行 ?当__switch_to正常返回时,发生了什么事情? xlanchen@2007.9.25 Linux Operating Systems Analysis * 标号为1的执行代码处 一个进程被正常切换出时,保存的eip总是标号为1的那个位置 当这个进程再次被调度运行时,恢复在堆栈上的返回地址总是这个1 1: popl %ebp popl %edi popl %esi xlanchen@2007.9.25 Linux Operating Systems Analysis * __switch_to xlanchen@2007.9.25 Linux Operating Systems Analysis * __switch_to的关键操作 unlazy_fpu() 处理数学协处理器 保存和恢复fs、gs 等等 xlanchen@2007.9.25 Linux Operating Systems Analysis * ?哪里切换了进程的地址空间 从执行switch_to的位置往前找 xlanchen@2007.9.25 L

文档评论(0)

181****9125 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档