上下文切换分为两种情况

  1. 用户程序陷入到内核,再从内核返回
  2. 两个应用程序之间的上下文切换

用户程序陷入到内核

用户程序陷入到内核通过中断INT指令,在xv6中系统调用的号为64

操作系统在初始化的时候会建立IDT表以及GDT表

通过INT找到IDT中的项,通过IDT中的项找到GDT中的项,最后定位到代码。

在执行陷入指令的时候首先会到trapasm.S中的alltraps中,将trapframe存入到应用程序的内核栈中。将esp的地址存入栈中作为trap函数的输入,然后调用trap。注意trapframe中有的字段会自动存入,比如int指令会通过CPU存入ss,esp,eflags,cs,eip,errorcode,trapno。系统调用号存在寄存器eax中。应用程序在初始化的时候操作系统会为每个应用程序保留一个内核栈,其中TSS断记录内核栈的一些信息比如内核栈的入口地址esp0。

系统调用将返回值存入到寄存器eax中。返回的时候通过trapret将原来的状态返回。最后一条指令iret回到用户程序。

两个应用程序之间的上下文切换

两个应用程序不能直接进行上下文切换,必须通过内核进行上下文切换。上下文切换通过proc中的数据结构context进行的。上下文切换的过程首先从 shell用户栈->shell程序的内核栈->scheduler的内核栈->cat的内核栈->cat的用户程序。记住第一运行的程序为shell

由于shell没有返回值,因此程序会卡在红色线的地方。注意在shell中调用fork会释放ptable.lock锁

CPU在每一个时钟中断的时候会调用

yield中会调用

注意此时锁已经释放了,

让出当前进程的CPU资源。将上下文切换到scheduler的上下文,由于上下文切换了因此下一条指令跳转到了scheduler的swtch下一条指令(还记得上面提到的卡在scheduler中的swtch,因此已经将swtch的返回eip地址压入栈中)。然后通过for循环找要runable的进程进行切换cpu->scheduler到要切换的进程上下文切换,到此就可以运行要执行的进程了。

应用程序第一次创建的时候,在返回值设置为trapret。context指向forkret因此在scheduler第一次swtch到forkret函数,在forkret函数中调用执行结束后执行trapret进行从内核栈返回到用户栈。

XV6上下文切换的更多相关文章

  1. XV6操作系统代码阅读心得(二):进程

    1. 进程的基本概念 从抽象的意义来说,进程是指一个正在运行的程序的实例,而线程是一个CPU指令执行流的最小单位.进程是操作系统资源分配的最小单位,线程是操作系统中调度的最小单位.从实现的角度上讲,X ...

  2. XV6调度

    调度 任何操作系统都可能碰到进程数多于处理器数的情况,这样就需要考虑如何分享处理器资源.理想的做法是让分享机制对进程透明.通常我们对进程造成一个自己独占处理器的假象,然后让操作系统的多路复用机制(mu ...

  3. XV6第一个进程

    第一个进程 本章通过第一个进程的创建来解释 xv6 是如何开始运行的,让我们得以一窥 xv6 提供的各个抽象是如何实现和交互的.xv6 尽量复用了普通操作的代码来建立第一个进程,避免单独为其撰写代码. ...

  4. XV6源代码阅读-同步机制

    Exercise1 源代码阅读 锁部分:spinlock.h/spinlock.c以及相关其他文件代码 // Mutual exclusion lock. struct spinlock { uint ...

  5. XV6源代码阅读-进程线程

    Exercise1 源代码阅读 1.基本头文件:types.h param.h memlayout.h defs.h x86.h asm.h mmu.h elf.h types.h:仅仅是定义uint ...

  6. XV6学习(16)Lab net: Network stack

    最后一个实验了,代码在Github上. 这一个实验其实挺简单的,就是要实现网卡的e1000_transmit和e1000_recv函数.不过看以前的实验好像还要实现上层socket相关的代码,今年就只 ...

  7. xv6学习笔记(4) : 进程调度

    xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...

  8. xv6的作业翻译——作业1 - shell和系统调用

    Xv6的lecture LEC 1 Operating systems   L1: O/S overview L1:O/S概述   * 6.828 goals 6.828的目标   Understan ...

  9. xv6课本翻译之——第0章 操作系统接口

    Chapter 0 第0章 Operating system interfaces 操作系统接口 The job of an operating system is to share a comput ...

随机推荐

  1. 题解报告:NYOJ #737 石子合并(一)(区间dp)

    描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...

  2. CentOS 7.2安装pip

    CentOS 7.2默认安装的python版本为python2.7.5,我的系统里面默认是没有安装pip 的,搜了下网上各路大侠的解决办法,如下: 使用yum安装python-pip,但是报错,说没有 ...

  3. PHP实现XML传输

    sendXML.php   <!--发送XML的页面--> <?php $xml_data = '<xml>...</xml>';//发送的xml $url ...

  4. AJPFX总结private关键字

    private关键字        什么是private关键字?                它是一个修饰符,代表私有的意思,它可以修饰成员变量和成员方法 private关键字的特点?        ...

  5. (一)Mybatis之初步接触

    Maven的安装及环境配置 安装及配置只需按照以下三个链接的步骤走 撸帝的博客https://www.funtl.com/zh/maven/Maven-%E5%AE%89%E8%A3%85%E9%85 ...

  6. expect下命令不能解析通配符*的问题

    曾遇到这样一段代码:(Bash脚本) 1 2 3 4 5 6 7 8 9 10 11 12 #!/usr/bin/expect -f set HOST "192.168.102.1" ...

  7. NSMutableDictionary 排序问题

    NSMutableDictionary 默认情况下是按字母的顺序进行排序的 (a-z)的默认排序如何自定义排序呢? 第一种,利用数组的sortedArrayUsingComparator调用 NSCo ...

  8. 油猴 tamperMonkey 在百度首页 添加自己的自定义链接

    发现 GM_addStyle 函数不能用了,从写加载css函数. 剩下找个定位 添加内容 就很简单了. // ==UserScript== // @name helloWorld // @namesp ...

  9. iptables 防火墙

    运行源地址为192.168.10.10-192.168.10.50 这个网段的机器访问本机的20-25还有80.443.6379端口进来的流量 iptables -A INPUT -p tcp -m ...

  10. render_to_response()

    render_to_response('模板名称',字典) 字典:第二个参数必须是为该模板创建context时所使用的字典,如果不提供第二个参数,render_response()使用一个空字典